void containment_expander::inject_global_module(intermediate_model& im) { BOOST_LOG_SEV(lg, debug) << "Injecting global module for: " << im.name().id(); const auto gm(create_global_module(im.origin_type())); const auto gmn(gm.name()); const auto i(im.modules().find(gmn.id())); if (i != im.modules().end()) { const auto id(im.name().id()); BOOST_LOG_SEV(lg, error) << model_already_has_global_module << id; BOOST_THROW_EXCEPTION( injection_error(model_already_has_global_module + id)); } im.modules().insert(std::make_pair(gmn.id(), gm)); add_containing_module_to_non_contained_entities(gmn, im.modules()); add_containing_module_to_non_contained_entities(gmn, im.concepts()); add_containing_module_to_non_contained_entities(gmn, im.primitives()); add_containing_module_to_non_contained_entities(gmn, im.enumerations()); add_containing_module_to_non_contained_entities(gmn, im.objects()); add_containing_module_to_non_contained_entities(gmn, im.exceptions()); add_containing_module_to_non_contained_entities(gmn, im.visitors()); BOOST_LOG_SEV(lg, debug) << "Done injecting global module"; }
void dehydrator:: dehydrate_enumerations(const intermediate_model& im, std::ostream& s) const { using boost::algorithm::join; formatters::utility_formatter uf(s); bool output_comma(!im.objects().empty() || !im.concepts().empty() || im.modules().empty()); const auto enumerations(to_map(im.enumerations())); for (const auto& pair : enumerations) { if (output_comma) s << comma_space; const auto& o(pair.second); s << " { "; dehydrate_element(im, o, "enumeration", s); s << comma_space; /* * Remove invalid from enumerators. */ std::vector<enumerator> enumerators; enumerators.reserve(o.enumerators().size()); for (const auto& en : o.enumerators()) { if (en.name() != "invalid") enumerators.push_back(en); } uf.insert_quoted("enumerators"); s << ": ["; bool is_first(true); for(const auto& en : enumerators) { if (!is_first) s << comma_space; s << " { "; uf.insert_quoted("simple_name"); s << " : "; uf.insert_quoted(en.name()); if (!en.documentation().empty()) { s << comma_space; uf.insert_quoted("documentation"); s << " : "; uf.insert_quoted(tidy_up_string(en.documentation())); } s << " }"; is_first = false; } s << " ]"; s << " }"; output_comma = true; } }
void dehydrator:: dehydrate_exceptions(const intermediate_model& im, std::ostream& s) const { using boost::algorithm::join; formatters::utility_formatter uf(s); bool output_comma(!im.objects().empty() || !im.concepts().empty() || im.modules().empty() || im.modules().empty() || im.enumerations().empty()); const auto exceptions(to_map(im.exceptions())); for (const auto& pair : exceptions) { if (output_comma) s << comma_space; const auto& o(pair.second); s << " { "; dehydrate_element(im, o, "exception", s); s << " }"; output_comma = true; } }
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; }
void injector::inject_global_module(intermediate_model& m) { const auto gm(create_global_module()); const auto gmn(gm.name()); const auto i(m.modules().find(gmn.qualified())); if (i != m.modules().end()) { const auto qn(m.name().qualified()); BOOST_LOG_SEV(lg, error) << model_already_has_global_module << qn; BOOST_THROW_EXCEPTION(injection_error( model_already_has_global_module + qn)); } m.modules().insert(std::make_pair(gmn.qualified(), gm)); add_containing_module_to_non_contained_entities(gmn, m.modules()); add_containing_module_to_non_contained_entities(gmn, m.concepts()); add_containing_module_to_non_contained_entities(gmn, m.primitives()); add_containing_module_to_non_contained_entities(gmn, m.enumerations()); add_containing_module_to_non_contained_entities(gmn, m.objects()); add_containing_module_to_non_contained_entities(gmn, m.exceptions()); add_containing_module_to_non_contained_entities(gmn, m.visitors()); }
inline void elements_traversal(intermediate_model& m, TraversalVisitor& v) { for (auto& pair : m.modules()) v(pair.second); for (auto& pair : m.concepts()) v(pair.second); for (auto& pair : m.primitives()) v(pair.second); for (auto& pair : m.enumerations()) v(pair.second); for (auto& pair : m.objects()) v(pair.second); for (auto& pair : m.exceptions()) v(pair.second); for (auto& pair : m.visitors()) v(pair.second); }
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; }
void dehydrator:: dehydrate_concepts(const intermediate_model& im, std::ostream& s) const { using boost::algorithm::join; formatters::utility_formatter uf(s); bool output_comma(!im.objects().empty()); const auto concepts(to_map(im.concepts())); for (const auto& pair : concepts) { if (output_comma) s << comma_space; const auto& c(pair.second); s << " { "; dehydrate_element(im, c, "concept", s); if (!c.refines().empty()) { s << comma_space; uf.insert_quoted("refines"); s << " : [ "; bool is_first(true); for (const auto& n : c.refines()) { if (!is_first) s << comma_space; dehydrate_name(n, s); is_first = false; } s << " ] "; } if (!c.local_attributes().empty()) { s << comma_space; dehydrate_attributes(c.local_attributes(), s); } s << " }"; output_comma = true; } }
void dehydrator:: dehydrate_modules(const intermediate_model& im, std::ostream& s) const { /* * Remove the root module. */ auto modules(to_map(im.modules())); const auto i(modules.find(im.name().id())); if (i != modules.end()) modules.erase(i); using boost::algorithm::join; formatters::utility_formatter uf(s); bool output_comma(!im.objects().empty() || !im.concepts().empty()); for (const auto& pair : modules) { if (output_comma) s << comma_space; const auto& o(pair.second); s << " { "; dehydrate_element(im, o, "module", s); s << " }"; output_comma = true; } }