From cae16e6c034808199f12a37ec0bdb4822c988dca Mon Sep 17 00:00:00 2001 From: olpc user Date: Tue, 26 Nov 2019 12:25:58 -0800 Subject: switch data to use std::any and merge value struct with concept --- starts/meaning-vm/level-1/baseref.hpp | 4 ++-- starts/meaning-vm/level-1/common.hpp | 1 - starts/meaning-vm/level-1/funcs.cpp | 37 +++++++++++++++++++++-------------- starts/meaning-vm/level-1/funcs.hpp | 5 ++--- 4 files changed, 26 insertions(+), 21 deletions(-) (limited to 'starts/meaning-vm/level-1') diff --git a/starts/meaning-vm/level-1/baseref.hpp b/starts/meaning-vm/level-1/baseref.hpp index 8c358cc..e8bdcb9 100644 --- a/starts/meaning-vm/level-1/baseref.hpp +++ b/starts/meaning-vm/level-1/baseref.hpp @@ -21,8 +21,8 @@ struct baseref : public level0::baseref bool isa(ref group) const { return level1::isa(self, group); } bool isan(ref group) const { return isa(group); } - std::string const & name() const { return getname(self)->data; } - operator std::string const &() const { return getname(self)->data; } + std::string const & name() const { return getname(self); } + operator std::string const &() const { return getname(self); } operator char const *() const { return getname(self)->data.c_str(); } ref operator-(ref other) { return hyphenate(self.ptr(), other.ptr()); } diff --git a/starts/meaning-vm/level-1/common.hpp b/starts/meaning-vm/level-1/common.hpp index 2c9297b..73de3b4 100644 --- a/starts/meaning-vm/level-1/common.hpp +++ b/starts/meaning-vm/level-1/common.hpp @@ -6,7 +6,6 @@ namespace intellect { namespace level1 { using level0::concept; -using level0::value; template struct baseref; struct ref; diff --git a/starts/meaning-vm/level-1/funcs.cpp b/starts/meaning-vm/level-1/funcs.cpp index 3d0d88d..07f0eba 100644 --- a/starts/meaning-vm/level-1/funcs.cpp +++ b/starts/meaning-vm/level-1/funcs.cpp @@ -21,9 +21,9 @@ static auto & namestruct() name_t() : nameref(level0::alloc()) { - auto namestr = valloc("name"); + level0::ref namestr = alloc((std::string)("name")); nameref.set(nameref, namestr); - conceptsByName.emplace(namestr->data, nameref); + conceptsByName.emplace(namestr.val(), nameref); } } namestruct; return namestruct; @@ -37,14 +37,14 @@ concept* getnamed(std::string const & name) return res->second; } else { level1::ref con = level0::alloc(); - level0::value* namestr = level0::valloc(name); - ns.conceptsByName.emplace(namestr->data, con); + level0::ref namestr = level0::alloc(name); + ns.conceptsByName.emplace(namestr.val(), con); con.set(ns.nameref, namestr); return con.ptr(); } } -value* getname(concept* r) +std::string& getname(concept* r) { try { return r->vget(namestruct().nameref); @@ -63,24 +63,31 @@ bool isa(concept* member, concept* group) return false; } -template -value* valloc(T const & val) +concept* alloc(std::any val) { - auto ret = level0::valloc(val); + + ref ret = level0::alloc(val); std::stringstream ss; - // << val is making recursion - ss << typeid(T).name() << "(" << val << ")"; - ret->link(concepts::name, level0::valloc(ss.str())); + ss << val.type().name() << "("; + if (false); +#define t(T) \ + else if (val.type() == typeid(T)) { \ + ss << ret.val(); \ + } + t(uint8_t) t(int8_t) t(uint16_t) t(int16_t) + t(uint32_t) t(int32_t) t(uint64_t) t(int64_t) + t(bool) t(float) t(double) t(std::string) t(char const *) +#undef t + else { ss << "?"; } + ss << ")"; + ret.link(concepts::name, level0::alloc(ss.str())); return ret; } concept* hyphenate(concept* a, concept* b) { - return getnamed(getname(a)->data + "-" + getname(b)->data); + return getnamed(getname(a) + "-" + getname(b)); } -template value* valloc(std::string const & val); -template value* valloc(int const & val); - } } diff --git a/starts/meaning-vm/level-1/funcs.hpp b/starts/meaning-vm/level-1/funcs.hpp index eab37e5..741a5af 100644 --- a/starts/meaning-vm/level-1/funcs.hpp +++ b/starts/meaning-vm/level-1/funcs.hpp @@ -12,14 +12,13 @@ namespace intellect { namespace level1 { concept* getnamed(std::string const & name); -value* getname(concept* r); +std::string& getname(concept* r); bool isa(concept* member, concept* group); concept* hyphenate(concept* a, concept* b); -template -value* valloc(T const & val); +concept* alloc(std::any val); } } -- cgit v1.2.3