diff --git a/include/xo/procedure2/ObjectPrimitives.hpp b/include/xo/procedure2/ObjectPrimitives.hpp index 392cf93..46cdf80 100644 --- a/include/xo/procedure2/ObjectPrimitives.hpp +++ b/include/xo/procedure2/ObjectPrimitives.hpp @@ -5,7 +5,9 @@ #pragma once -#include +#include "Primitive_gco_0.hpp" +#include "Primitive_gco_2_gco_gco.hpp" +#include "Primitive_gco_3_dict_string_gco.hpp" namespace xo { namespace scm { @@ -21,6 +23,12 @@ namespace xo { public: /** create primitive for fetching nth element of a sequence **/ static DPrimitive_gco_2_gco_gco * make_nth_pm(obj mm); + + /** create pirmitive for creating a dictionary instance **/ + static DPrimitive_gco_0 * make_dict_make_pm(obj mm); + + /** create primitive that upserts a key,value pair into a dictionary **/ + static DPrimitive_gco_3_dict_string_gco * make_dict_upsert_pm(obj mm); }; } /*namespace scm*/ diff --git a/src/procedure2/ObjectPrimitives.cpp b/src/procedure2/ObjectPrimitives.cpp index 5164efc..98206d2 100644 --- a/src/procedure2/ObjectPrimitives.cpp +++ b/src/procedure2/ObjectPrimitives.cpp @@ -4,17 +4,24 @@ **/ #include "ObjectPrimitives.hpp" -#include "Primitive_gco_2_gco_gco.hpp" +#include #include #include +#include +#include namespace xo { using xo::scm::ASequence; + using xo::print::APrintable; using xo::mm::AAllocator; using xo::mm::AGCObject; + using xo::facet::FacetRegistry; + using xo::facet::TypeRegistry; namespace scm { + // ----- nth ----- + // TODO: seq_gc -> obj // n_gco -> obj // @@ -23,8 +30,6 @@ namespace xo { obj seq_gco, obj n_gco) { - scope log(XO_DEBUG(true)); - (void)rcx; obj seq = seq_gco.to_facet(); @@ -39,6 +44,54 @@ namespace xo { return DPrimitive_gco_2_gco_gco::_make(mm, "nth", &xfer_nth); } + // ----- dict_make ----- + + obj + xfer_dict_make(obj rcx) + { + return obj(DDictionary::empty(rcx.allocator(), + 8 /*cap*/)); + } + + DPrimitive_gco_0 * + ObjectPrimitives::make_dict_make_pm(obj mm) + { + return DPrimitive_gco_0::_make(mm, "dict_make", &xfer_dict_make); + } + + // ----- dict_upsert ----- + + obj + xfer_dict_upsert(obj rcx, + obj dict, + obj key, + obj value) + { + scope log(XO_DEBUG(true)); + + log && log(xtag("dict.tseq", dict._typeseq()), + xtag("dict.tname", TypeRegistry::id2name(dict._typeseq()))); + log && log(xtag("key.tseq", key._typeseq()), + xtag("key.tname", TypeRegistry::id2name(key._typeseq()))); + log && log(xtag("value.tseq", value._typeseq()), + xtag("value.tname", TypeRegistry::id2name(value._typeseq()))); + + auto value_pr = FacetRegistry::instance().variant(value); + + log && log(xtag("value", value_pr)); + + dict->upsert(rcx.allocator(), + DDictionary::pair_type(key.data(), value)); + + return dict; + } + + DPrimitive_gco_3_dict_string_gco * + ObjectPrimitives::make_dict_upsert_pm(obj mm) + { + return DPrimitive_gco_3_dict_string_gco::_make(mm, "dict_upsert", &xfer_dict_upsert); + } + } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/procedure2/procedure2_register_primitives.cpp b/src/procedure2/procedure2_register_primitives.cpp index e17cda4..f0aa6f1 100644 --- a/src/procedure2/procedure2_register_primitives.cpp +++ b/src/procedure2/procedure2_register_primitives.cpp @@ -5,7 +5,6 @@ #include "procedure2_register_primitives.hpp" #include "ObjectPrimitives.hpp" -#include "Primitive_gco_2_gco_gco.hpp" #include #include @@ -63,6 +62,8 @@ namespace xo { bool ok = true; ok = ok & install_aux(sink, ObjectPrimitives::make_nth_pm(mm), flags); + ok = ok & install_aux(sink, ObjectPrimitives::make_dict_make_pm(mm), flags); + ok = ok & install_aux(sink, ObjectPrimitives::make_dict_upsert_pm(mm), flags); return ok; }