void generalization_indexer:: populate(const generalization_details& d, intermediate_model& m) const { for (const auto& pair : d.leaves) { const auto& n(pair.first); auto i(m.objects().find(n.qualified())); if (i == m.objects().end()) { const auto qn(n.qualified()); BOOST_LOG_SEV(lg, error) << object_not_found << qn; BOOST_THROW_EXCEPTION(indexing_error(object_not_found + qn)); } auto& o(i->second); o.leaves(pair.second); o.leaves().sort(); for (const auto& leaf : pair.second) { if (leaf.location().model_modules() == m.name().location().model_modules()) m.leaves().insert(leaf); } } for (const auto& pair : d.root_parents) { const auto& n(pair.first); auto i(m.objects().find(n.qualified())); if (i == m.objects().end()) { const auto qn(n.qualified()); BOOST_LOG_SEV(lg, error) << object_not_found << qn; BOOST_THROW_EXCEPTION(indexing_error(object_not_found + qn)); } auto& o(i->second); if (!o.is_child()) { /* Top-level types have themselves as the original parent * of the container just to make our life easier, so we * have to ignore them here. */ BOOST_LOG_SEV(lg, debug) << "Type has parents but is not a child: " << n.qualified(); continue; } o.root_parents(pair.second); for (const auto& opn : pair.second) { const auto j(m.objects().find(opn.qualified())); if (j == m.objects().end()) { const auto qn(opn.qualified()); BOOST_LOG_SEV(lg, error) << object_not_found << qn; BOOST_THROW_EXCEPTION(indexing_error(object_not_found + qn)); } o.is_root_parent_visitable(j->second.is_visitable()); } } }
void generalization_expander::populate_properties_up_the_generalization_tree( const type_group& tg, const yarn::name& leaf, intermediate_model& im, yarn::object& o) const { /* * Add the leaf to all nodes of the tree except for the leaf node * itself. */ if (!o.is_leaf()) o.leaves().push_back(leaf); /* * If we do not have a parent we have reached the top of the * generalisation tree. */ if (!o.parent()) { /* * If the leaf name belongs to the target model, add it to * the model's list of leaves. Ignore non-target leaves. */ const auto& ll(leaf.location()); const auto& ml(im.name().location()); if (ll.model_modules() == ml.model_modules()) im.leaves().insert(leaf); return; } const auto pid(o.parent()->id()); auto j(im.objects().find(pid)); if (j == im.objects().end()) { BOOST_LOG_SEV(lg, error) << parent_not_found << pid; BOOST_THROW_EXCEPTION(expansion_error(parent_not_found + pid)); } auto& parent(j->second); populate_properties_up_the_generalization_tree(tg, leaf, im, parent); if (!parent.parent()) { /* * If our parent does not have a parent then it is our root * parent. */ o.root_parent(parent.name()); } else { /* * On all other cases, inherit the root parent properties for * our direct parent; these would have been populated from the * root parent as per above. */ o.root_parent(parent.root_parent()); } }
std::size_t intermediate_model_hasher::hash(const intermediate_model& v) { std::size_t seed(0); combine(seed, v.name()); combine(seed, v.origin_type()); combine(seed, v.original_model_name()); combine(seed, v.generation_type()); combine(seed, hash_std_unordered_map_dogen_yarn_name_dogen_yarn_origin_types(v.references())); combine(seed, hash_std_unordered_set_dogen_yarn_name(v.leaves())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_module(v.modules())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_concept(v.concepts())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_primitive(v.primitives())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_enumeration(v.enumerations())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_object(v.objects())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_exception(v.exceptions())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_visitor(v.visitors())); combine(seed, v.is_target()); combine(seed, v.has_generatable_types()); return seed; }
std::size_t intermediate_model_hasher::hash(const intermediate_model& v) { std::size_t seed(0); combine(seed, v.name()); combine(seed, v.origin_type()); combine(seed, hash_std_unordered_map_dogen_yarn_name_dogen_yarn_origin_types(v.references())); combine(seed, hash_std_unordered_set_dogen_yarn_name(v.leaves())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_module(v.modules())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_concept(v.concepts())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_primitive(v.primitives())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_enumeration(v.enumerations())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_object(v.objects())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_exception(v.exceptions())); combine(seed, hash_std_unordered_map_std_string_dogen_yarn_visitor(v.visitors())); combine(seed, hash_std_unordered_map_std_string_boost_shared_ptr_dogen_yarn_element(v.injected_elements())); combine(seed, v.has_generatable_types()); combine(seed, v.indices()); combine(seed, v.root_module()); combine(seed, v.language()); return seed; }