From 6e81ffa9f5baabe8d4b16fa927ce423fbe26771e Mon Sep 17 00:00:00 2001 From: olpc user Date: Thu, 21 Nov 2019 13:37:18 -0500 Subject: direct cast concept from string --- starts/meaning-vm/concept.hpp | 82 ++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 55 deletions(-) (limited to 'starts/meaning-vm/concept.hpp') diff --git a/starts/meaning-vm/concept.hpp b/starts/meaning-vm/concept.hpp index 981835f..ce76f5d 100644 --- a/starts/meaning-vm/concept.hpp +++ b/starts/meaning-vm/concept.hpp @@ -5,70 +5,42 @@ #include #include -using cid = struct concept *; +struct concept; +template struct value; + +struct ref +{ + ref(concept *p) : ptr(p) { } + operator concept*() const { return ptr; } + + // helper names + ref(std::string); + operator std::string(); + ref(char const * str) : ref(std::string(str)) { } + + concept * ptr; +}; struct concept { // a concept is made of concept-typed links to other concepts - std::multimap links; - using array = std::vector; - - cid id(); - cid get(cid type); // returns first - array getAll(cid type); - void link(cid type, cid target); - void unlink(cid type, cid target); + std::multimap> links; + using array = std::vector; + + ref id(); + ref get(ref type); // returns first + array getAll(ref type); + void link(ref type, ref target); + void unlink(ref type, ref target); }; template struct value : public concept, public T { - static value& of(cid c) + value(T const & val) : T(val) {} + value(value const & val) = default; + static value& of(ref c) { - return *static_cast*>(c); + return *static_cast*>(c.ptr); } }; - -cid concept::id() -{ - return this; -} - -cid concept::get(cid type) -{ - auto result = links.equal_range(type); - if (result.first == result.second) { - throw std::out_of_range("no such concept link to get"); - } - return result.first->second; -} - -concept::array concept::getAll(cid type) -{ - array ret; - for ( - auto range = links.equal_range(type); - range.first != range.second; - ++ range.first - ) { - ret.push_back(range.first->second); - } - return ret; -} - -void concept::link(cid type, cid target) -{ - links.insert({type, target}); -} - -void concept::unlink(cid type, cid target) -{ - auto ls = links.equal_range(type); - for (auto l = ls.first; l != ls.second; ++ l) { - if (l->second == target) { - links.erase(l); - return; - } - } - throw std::out_of_range("no such concept link to erase"); -} -- cgit v1.2.3