void injector::inject_visitors(intermediate_model& m) { BOOST_LOG_SEV(lg, debug) << "Injecting visitors."; std::list<visitor> visitors; for (auto& pair : m.objects()) { auto& o(pair.second); if (!o.is_visitable()) continue; if (o.leaves().empty()) { const auto qn(o.name().qualified()); BOOST_LOG_SEV(lg, error) << zero_leaves << qn; BOOST_THROW_EXCEPTION(injection_error(zero_leaves + qn)); } const auto v(create_visitor(o, o.leaves())); inject_visitable_by(o, o.leaves(), v.name(), m); visitors.push_back(v); } for (const auto v : visitors) { BOOST_LOG_SEV(lg, debug) << "Adding visitor: " << v.name().qualified(); const auto pair(std::make_pair(v.name().qualified(), v)); const auto i(m.visitors().insert(pair)); if (!i.second) { const auto qn(v.name().qualified()); BOOST_LOG_SEV(lg, error) << duplicate_name << qn; BOOST_THROW_EXCEPTION(injection_error(duplicate_name + qn)); } } BOOST_LOG_SEV(lg, debug) << "Done injecting visitors."; }
static NodoFundamental* instanciar(NodoFundamental* nodo){ return apply_visitor(create_visitor (), *nodo); }