summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--starts/meaning-vm/level-0/memorystore.cpp5
-rw-r--r--starts/meaning-vm/level-0/memorystore.hpp1
-rw-r--r--starts/meaning-vm/level-0/vref.hpp3
-rw-r--r--starts/meaning-vm/level0.cpp31
4 files changed, 38 insertions, 2 deletions
diff --git a/starts/meaning-vm/level-0/memorystore.cpp b/starts/meaning-vm/level-0/memorystore.cpp
index 6cf71df..0a4f0cc 100644
--- a/starts/meaning-vm/level-0/memorystore.cpp
+++ b/starts/meaning-vm/level-0/memorystore.cpp
@@ -55,5 +55,10 @@ void dealloc(ref r) {
throw no_such_concept(r);
}
+std::size_t allocated()
+{
+ return concepts().size();
+}
+
}
}
diff --git a/starts/meaning-vm/level-0/memorystore.hpp b/starts/meaning-vm/level-0/memorystore.hpp
index 4e0a2bd..a86ccea 100644
--- a/starts/meaning-vm/level-0/memorystore.hpp
+++ b/starts/meaning-vm/level-0/memorystore.hpp
@@ -8,6 +8,7 @@ namespace level0 {
ref alloc(concept * moved = 0);
void dealloc(ref);
+std::size_t allocated();
}
}
diff --git a/starts/meaning-vm/level-0/vref.hpp b/starts/meaning-vm/level-0/vref.hpp
index 7fe2045..cffc8f5 100644
--- a/starts/meaning-vm/level-0/vref.hpp
+++ b/starts/meaning-vm/level-0/vref.hpp
@@ -15,10 +15,11 @@ struct vref
value<T>* operator->() { return ptr; }
operator T const &() const { return *ptr; }
- vref(T const & val) : ptr(alloc(new value<T>(val))) { }
+ vref(T const & val) : vref(alloc(new value<T>(val))) { }
vref(ref const & other) : ptr(static_cast<value<T>*>(other.ptr)) { }
operator ref() { return ptr; }
+ T const & val() { return *ptr; }
// for use by containers
bool operator<(vref<T> const & other) const { return self.ptr < other.ptr; }
diff --git a/starts/meaning-vm/level0.cpp b/starts/meaning-vm/level0.cpp
index 71c18b7..8cb60f9 100644
--- a/starts/meaning-vm/level0.cpp
+++ b/starts/meaning-vm/level0.cpp
@@ -1,5 +1,6 @@
#include "level-0/level-0.hpp"
+#include <functional>
#include <iostream>
using namespace intellect::level0;
@@ -11,6 +12,12 @@ int main()
ref c = alloc();
ref d = alloc();
ref e = alloc();
+ vref<int> num(3);
+ vref<std::function<void()>> code([](){
+ std::cout << "Hello, world." << std::endl;
+ });
+ auto numlink = alloc();
+ auto codelink = alloc();
ref skip = alloc();
@@ -18,8 +25,30 @@ int main()
a->link(d, e);
e->link(b, a);
c->link(b, e);
+ a->link(numlink, num);
+ a->link(codelink, code);
- std::cout << a.dump(skip, skip) << std::endl;
+ std::cout << "Num: " << ref(num).dump(skip, skip);
+ std::cout << "Code: " << ref(code).dump(skip, skip);
+ std::cout << a.dump(skip, skip);
+ std::cout << "Num: " << a->vget<int>(numlink).val() << std::endl;
+ std::cout << "Code: "; a->vget<std::function<void()>>(codelink).val()();
+
+ std::cout << allocated() << " allocated" << std::endl;
+
+ e->unlink(b, a);
+ dealloc(a);
+ dealloc(c);
+ dealloc(e);
+ dealloc(b);
+ dealloc(d);
+ dealloc(numlink);
+ dealloc(codelink);
+ dealloc(num);
+ dealloc(code);
+ dealloc(skip);
+
+ std::cout << allocated() << " allocated" << std::endl;
return 0;
}