ScAddr ScAgentAction::getParam(ScAddr const & cmdAddr, ScAddr const & relationAddr, sc_type paramType) { ScIterator5Ptr iter = mMemoryCtx.iterator5(cmdAddr, SC_TYPE(sc_type_arc_pos_const_perm), SC_TYPE(paramType), SC_TYPE(sc_type_arc_pos_const_perm), relationAddr); if (!iter->next()) return ScAddr(); return iter->value(2); }
void setMass(ScMemoryContext & ctx, ScAddr const & objAddr, ScAddr const & valueAddr) { ScAddr massAddr; ScIterator5Ptr itMass = ctx.iterator5(objAddr, SC_TYPE(sc_type_arc_common | sc_type_const), SC_TYPE(sc_type_const | sc_type_node | sc_type_node_abstract), SC_TYPE(sc_type_arc_pos_const_perm), Keynodes::nrel_mass); /// TODO: check if there is a more than one result if (itMass->next()) { massAddr = itMass->value(2); } else { massAddr = ctx.createNode(sc_type_const | sc_type_node_abstract); assert(massAddr.isValid()); ScAddr arcCommon = ctx.createArc(sc_type_const | sc_type_arc_common, objAddr, massAddr); assert(arcCommon.isValid()); ScAddr arc = ctx.createArc(sc_type_arc_pos_const_perm, Keynodes::nrel_mass, arcCommon); assert(arc.isValid()); } ScIterator5Ptr itValue = ctx.iterator5(massAddr, SC_TYPE(sc_type_arc_pos_const_perm), SC_TYPE(sc_type_link), SC_TYPE(sc_type_arc_pos_const_perm), Keynodes::rrel_gram); if (itValue->next()) { ScAddr linkAddr = itValue->value(2); ScStream stream; bool res = ctx.getLinkContent(valueAddr, stream); assert(res); res = ctx.setLinkContent(linkAddr, stream); assert(res); } else { ScAddr arc = ctx.createArc(sc_type_arc_pos_const_perm, massAddr, valueAddr); assert(arc.isValid()); arc = ctx.createArc(sc_type_arc_pos_const_perm, Keynodes::rrel_gram, arc); assert(arc.isValid()); } }