summaryrefslogtreecommitdiff
path: root/test/unit/context/cdmap_black.h
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@gmail.com>2010-07-08 04:33:10 +0000
committerMorgan Deters <mdeters@gmail.com>2010-07-08 04:33:10 +0000
commit8a0dcb9cb4bbf83f03b31343eaa6437ae829f1c9 (patch)
treebd25ae92f252eaaea317f543e515ccdbbfc57f05 /test/unit/context/cdmap_black.h
parent586c8f2d51d790942fd82598a2bf532f2b5ebc9a (diff)
context work to support cdmaps with elements allocated in context memory
Diffstat (limited to 'test/unit/context/cdmap_black.h')
-rw-r--r--test/unit/context/cdmap_black.h144
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; }
+ }
};
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback