// Copyright © 2006, Ondra Kamenik // $Id: static_atoms.cpp 1360 2007-07-10 11:44:20Z kamenik $ #include "static_atoms.hh" #include "utils/cc/exception.hh" using namespace ogp; StaticAtoms::StaticAtoms(const StaticAtoms &a) : Atoms(), Constants(a), varnames(a.varnames), varorder(), vars(), indices() { // fill varorder for (auto i : a.varorder) { const char *s = varnames.query(i); varorder.push_back(s); } // fill vars for (auto var : a.vars) { const char *s = varnames.query(var.first); vars.emplace(s, var.second); } // fill indices for (auto indice : a.indices) { const char *s = varnames.query(indice.second); indices.emplace(indice.first, s); } } void StaticAtoms::import_atoms(const DynamicAtoms &da, OperationTree &otree, Tintintmap &tmap) { Constants::import_constants(da, otree, tmap); for (int i = 0; i < da.get_name_storage().num(); i++) { const char *name = da.get_name_storage().get_name(i); register_name(name); int tnew = otree.add_nulary(); assign(name, tnew); if (da.is_referenced(name)) { const DynamicAtoms::Tlagmap &lmap = da.lagmap(name); for (auto it : lmap) { int told = it.second; tmap.emplace(told, tnew); } } } } int StaticAtoms::check(const char *name) const { if (DynamicAtoms::is_string_constant(name)) return Constants::check(name); else return check_variable(name); } int StaticAtoms::index(const char *name) const { auto it = vars.find(name); if (it == vars.end()) return -1; else return it->second; } const char * StaticAtoms::inv_index(int t) const { auto it = indices.find(t); if (it == indices.end()) return nullptr; else return it->second; } void StaticAtoms::assign(const char *name, int t) { if (DynamicAtoms::is_string_constant(name)) { double val = std::stod(name); add_constant(t, val); } else { const char *ss = varnames.insert(name); vars.emplace(ss, t); indices.emplace(t, ss); } } vector StaticAtoms::variables() const { vector res; for (auto var : vars) res.push_back(var.second); return res; } void StaticAtoms::register_name(const char *name) { const char *ss = varnames.insert(name); varorder.push_back(ss); } void StaticAtoms::print() const { printf("constants:\n"); Constants::print(); printf("variable names:\n"); varnames.print(); printf("map to tree indices:\n"); for (auto var : vars) printf(u8"%s\t→\t%d\n", var.first, var.second); }