[Mobies-commit] [commit] r4413 - in UDM/trunk: include src/Udm src/Udm/PythonAPIGen

ksmyth at svn.isis.vanderbilt.edu ksmyth at svn.isis.vanderbilt.edu
Tue Apr 3 13:26:27 CDT 2018


Author: ksmyth
Date: Tue Apr  3 13:26:26 2018
New Revision: 4413

Log:
Udm.exe performance optimizations

Modified:
   UDM/trunk/include/UmlExt.h
   UDM/trunk/src/Udm/ClassGen.cpp
   UDM/trunk/src/Udm/DiagramGen.cpp
   UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.cpp
   UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.h
   UDM/trunk/src/Udm/Udm.h
   UDM/trunk/src/Udm/UdmCpp.cpp

Modified: UDM/trunk/include/UmlExt.h
==============================================================================
--- UDM/trunk/include/UmlExt.h	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/include/UmlExt.h	Tue Apr  3 13:26:26 2018	(r4413)
@@ -351,34 +351,35 @@
 		GetItems m_items_getter;
 	};
 
+	// n.b. _kind_children is more performant with Dom backend
 	class UDM_DLL DiagramAssociations : public ElemCollection<Diagram, Association> {
 	public:
-		DiagramAssociations(const Diagram &diagram) : ElemCollection<Diagram, Association>(diagram, &Diagram::associations, &Namespace::associations) {}
+		DiagramAssociations(const Diagram &diagram) : ElemCollection<Diagram, Association>(diagram, &Diagram::Association_kind_children, &Namespace::Association_kind_children) {}
 	};
 
 	class UDM_DLL DiagramClasses : public ElemCollection<Diagram, Class> {
 	public:
-		DiagramClasses(const Diagram &diagram) : ElemCollection<Diagram, Class>(diagram, &Diagram::classes, &Namespace::classes) {}
+		DiagramClasses(const Diagram &diagram) : ElemCollection<Diagram, Class>(diagram, &Diagram::Class_kind_children, &Namespace::Class_kind_children) {}
 	};
 
 	class UDM_DLL DiagramCompositions : public ElemCollection<Diagram, Composition> {
 	public:
-		DiagramCompositions(const Diagram &diagram) : ElemCollection<Diagram, Composition>(diagram, &Diagram::compositions, &Namespace::compositions) {}
+		DiagramCompositions(const Diagram &diagram) : ElemCollection<Diagram, Composition>(diagram, &Diagram::Composition_kind_children, &Namespace::Composition_kind_children) {}
 	};
 
 	class UDM_DLL NamespaceAssociations : public ElemCollection<Namespace, Association> {
 	public:
-		NamespaceAssociations(const Namespace &ns) : ElemCollection<Namespace, Association>(ns, &Namespace::associations, &Namespace::associations) {}
+		NamespaceAssociations(const Namespace &ns) : ElemCollection<Namespace, Association>(ns, &Namespace::Association_kind_children, &Namespace::Association_kind_children) {}
 	};
 
 	class UDM_DLL NamespaceClasses : public ElemCollection<Namespace, Class> {
 	public:
-		NamespaceClasses(const Namespace &ns) : ElemCollection<Namespace, Class>(ns, &Namespace::classes, &Namespace::classes) {}
+		NamespaceClasses(const Namespace &ns) : ElemCollection<Namespace, Class>(ns, &Namespace::Class_kind_children, &Namespace::Class_kind_children) {}
 	};
 
 	class UDM_DLL NamespaceCompositions : public ElemCollection<Namespace, Composition> {
 	public:
-		NamespaceCompositions(const Namespace &ns) : ElemCollection<Namespace, Composition>(ns, &Namespace::compositions, &Namespace::compositions) {}
+		NamespaceCompositions(const Namespace &ns) : ElemCollection<Namespace, Composition>(ns, &Namespace::Composition_kind_children, &Namespace::Composition_kind_children) {}
 	};
 
 	template<class CONTAINER>

Modified: UDM/trunk/src/Udm/ClassGen.cpp
==============================================================================
--- UDM/trunk/src/Udm/ClassGen.cpp	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/ClassGen.cpp	Tue Apr  3 13:26:26 2018	(r4413)
@@ -814,11 +814,11 @@
 	::Uml::Namespace ns = c.parent_ns();
 	::Uml::DiagramClasses allclasses = ::Uml::DiagramClasses(dgr);
 
-	for (::Uml::DiagramClasses::iterator j = allclasses.begin(); j != allclasses.end(); j++) 
+	for (std::vector< ::Uml::Class>::const_iterator j = this->gen.DiagramClasses.begin(); j != this->gen.DiagramClasses.end(); j++)
 	{
 		for (set< ::Uml::Class>::iterator k = childrenkinds.begin(); k != childrenkinds.end(); k++) 
 		{
-			if (Uml::IsDerivedFrom(*j, *k) || Uml::IsDerivedFrom(*k, *j)) 
+			if (gen.isDerivedFrom(*j, *k) || gen.isDerivedFrom(*k, *j))
 			{
 				string kind_children_name;
 				if (ns != j->parent_ns())
@@ -1301,7 +1301,7 @@
 	}
 }
 
-void ClassGen::OutDecls(ostream &out)
+void ClassGen::OutDecls(ostream &out) const
 {
 	string lidt = idt.substr(1);
 
@@ -1349,7 +1349,7 @@
 	out << lidt << "};" << endl << endl;
 }
 
-void ClassGen::OutDefs(ostream &out)
+void ClassGen::OutDefs(ostream &out) const
 {
 	string lidt = idt.substr(1);
 
@@ -1377,7 +1377,7 @@
 	}
 }
 
-void ClassGen::OutMetaCreate(ostream &out)
+void ClassGen::OutMetaCreate(ostream &out) const
 {
 	switch (gen.opts.meta_init)
 	{
@@ -1395,7 +1395,7 @@
 	}
 }
 
-void ClassGen::OutMetaInit(ostream &out)
+void ClassGen::OutMetaInit(ostream &out) const
 {
 	switch (gen.opts.meta_init)
 	{
@@ -1413,7 +1413,7 @@
 	}
 }
 
-void ClassGen::OutMetaInitLinks(ostream &out)
+void ClassGen::OutMetaInitLinks(ostream &out) const
 {
 	switch (gen.opts.meta_init)
 	{
@@ -1431,12 +1431,12 @@
 	}
 }
 
-void ClassGen::OutMetaInit2(ostream &out)
+void ClassGen::OutMetaInit2(ostream &out) const
 {
 	OutFmts(out, idt, meta_init2);
 }
 
-void ClassGen::OutMetaInitLinks2(ostream &out)
+void ClassGen::OutMetaInitLinks2(ostream &out) const
 {
 	OutFmts(out, idt, meta_init_links2);
 }

Modified: UDM/trunk/src/Udm/DiagramGen.cpp
==============================================================================
--- UDM/trunk/src/Udm/DiagramGen.cpp	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/DiagramGen.cpp	Tue Apr  3 13:26:26 2018	(r4413)
@@ -412,7 +412,7 @@
 		CLGEN_MAP::const_iterator i = all_clgen_map.find(cl_path);
 		if (i == all_clgen_map.end()) throw udm_exception("all_clgen_map does not contain a mapping for the class " + cl_path);
 
-		ClassGen cgen = i->second;
+		const ClassGen& cgen = i->second;
 		cgen.OutDecls(out);
 	}
 

Modified: UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.cpp
==============================================================================
--- UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.cpp	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.cpp	Tue Apr  3 13:26:26 2018	(r4413)
@@ -4,7 +4,7 @@
 #include <iterator>
 
 
-PythonInheritanceSolver::PythonInheritanceSolver(const Uml::Diagram &diagram, bool sort_by_namespace) : ::UdmCPPGen::InheritanceSolver(diagram, sort_by_namespace) {};
+PythonInheritanceSolver::PythonInheritanceSolver(const Uml::Diagram &diagram, const ::UdmCPPGen::UdmGen& gen, bool sort_by_namespace) : ::UdmCPPGen::InheritanceSolver(diagram, gen, sort_by_namespace) {};
 string PythonInheritanceSolver::getAncestorList(const ::Uml::Class &cl ) const
 {
     string ret;
@@ -86,7 +86,10 @@
 
     /*GENERATE PYTHON CLASSES*/
     set< ::Uml::Class> uml_classes = m_diagram.classes();
-    PythonInheritanceSolver is(m_diagram);
+    UdmOpts opts;
+    ::UdmCPPGen::UdmGen gen(m_diagram, opts);
+    PythonInheritanceSolver is(m_diagram, gen);
+
     for ( vector < ::Uml::Class>::iterator gio_i = is.good_inheritence_order.begin(); gio_i != is.good_inheritence_order.end(); gio_i++)
         generateClass(*gio_i,is );
     

Modified: UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.h
==============================================================================
--- UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.h	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/PythonAPIGen/PythonAPIGen.h	Tue Apr  3 13:26:26 2018	(r4413)
@@ -13,7 +13,7 @@
 {
     friend class PythonAPIGen;
 public:
-    PythonInheritanceSolver(const ::Uml::Diagram &diagram, bool sort_by_namespace = false);
+    PythonInheritanceSolver(const ::Uml::Diagram &diagram, const ::UdmCPPGen::UdmGen& gen, bool sort_by_namespace = false);
     virtual string getAncestorList(const ::Uml::Class &cl) const;
 };
 class PythonAPIGen

Modified: UDM/trunk/src/Udm/Udm.h
==============================================================================
--- UDM/trunk/src/Udm/Udm.h	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/Udm.h	Tue Apr  3 13:26:26 2018	(r4413)
@@ -20,6 +20,8 @@
 #include <UdmDom.h>
 #include <UmlExt.h>
 
+#include <unordered_set>
+
 
 using namespace std;
 
@@ -112,6 +114,7 @@
 void OutVecFmts(ostream &out, const string &idt, const vector< vector<boost::format> > &v, const string &label = "");
 
 class DiagramGen;
+class UdmGen;
 
 class InheritanceSolver {
 	typedef map< ::Uml::Class, set< ::Uml::Class> > cltoclsmap;
@@ -135,15 +138,16 @@
     vector< ::Uml::Class> good_inheritence_order;
 
 	friend class DiagramGen;
+	const UdmGen& gen;
     
 public:
-	InheritanceSolver(const ::Uml::Diagram &diagram, bool sort_by_namespace = false);
+	InheritanceSolver(const ::Uml::Diagram &diagram, const UdmGen& gen, bool sort_by_namespace = false);
 	virtual string getAncestorList(const ::Uml::Class &cl) const;
 	string getInitializers(const ::Uml::Class &cl, const string &argument) const;
 };
 
 
-class UdmGen {
+class UdmGen : boost::noncopyable {
 	// maximum size of Boost MPL sequences created
 	static int mpl_seq_max_size;
 
@@ -151,7 +155,36 @@
 	::Uml::Diagram diagram;
 	UdmOpts opts;
 
-	UdmGen(const ::Uml::Diagram &p_diagram, const UdmOpts &p_opts) : diagram(p_diagram), opts(p_opts) { }
+	std::vector< ::Uml::Class> DiagramClasses;
+
+	struct unique_hash { //: public unary_function<_Kty, size_t>  {
+		size_t operator()(const std::pair< Udm::ObjectImpl::uniqueId_type, Udm::ObjectImpl::uniqueId_type>& key) const {
+			return key.first + key.second * 32;
+		}
+	};
+
+	std::unordered_set < std::pair< Udm::ObjectImpl::uniqueId_type, Udm::ObjectImpl::uniqueId_type>, unique_hash> IsDerivedFrom;
+
+	UdmGen(const ::Uml::Diagram &p_diagram, const UdmOpts &p_opts) : diagram(p_diagram), opts(p_opts) {
+		::Uml::DiagramClasses allclasses = ::Uml::DiagramClasses(diagram);
+		for (::Uml::DiagramClasses::iterator i = allclasses.begin(); i != allclasses.end(); ++i) {
+			DiagramClasses.push_back(*i);
+		}
+		for (std::vector< ::Uml::Class>::const_iterator i = DiagramClasses.begin(); i != DiagramClasses.end(); i++)
+		{
+			for (std::vector< ::Uml::Class>::const_iterator j = DiagramClasses.begin(); j != DiagramClasses.end(); j++)
+			{
+				if (Uml::IsDerivedFrom(*i, *j))
+				{
+					IsDerivedFrom.emplace(std::make_pair< Udm::ObjectImpl::uniqueId_type, Udm::ObjectImpl::uniqueId_type>(i->uniqueId(), j->uniqueId()));
+				}
+			}
+		}
+	}
+
+	bool isDerivedFrom(const ::Uml::Class &a, const ::Uml::Class &b) const {
+		return IsDerivedFrom.find(std::make_pair< Udm::ObjectImpl::uniqueId_type, Udm::ObjectImpl::uniqueId_type>(a.uniqueId(), b.uniqueId())) != IsDerivedFrom.end();
+	}
 
 	void Generate(const ::Uml::Diagram &cross_dgr, const string &filename);
 	vector<boost::format> HPreamble(const string &fname) const;
@@ -243,7 +276,7 @@
 
 	::Uml::Class c;
 
-	UdmGen gen;
+	const UdmGen& gen;
 	string idt;	// indentation to use
 
 	// store typedefs and typenames to create typelists
@@ -275,13 +308,13 @@
 	ClassGen(const ::Uml::Class &p_c, const UdmGen &p_gen) : c(p_c), gen(p_gen) {}
 
 	void Process(const ::Uml::Diagram &cross_diagram, const InheritanceSolver &is);
-	void OutDecls(ostream &out);
-	void OutDefs(ostream &out);
-	void OutMetaCreate(ostream &out);
-	void OutMetaInit(ostream &out);
-	void OutMetaInitLinks(ostream &out);
-	void OutMetaInit2(ostream &out);
-	void OutMetaInitLinks2(ostream &out);
+	void OutDecls(ostream &out) const;
+	void OutDefs(ostream &out) const;
+	void OutMetaCreate(ostream &out) const;
+	void OutMetaInit(ostream &out) const;
+	void OutMetaInitLinks(ostream &out) const;
+	void OutMetaInit2(ostream &out) const;
+	void OutMetaInitLinks2(ostream &out) const;
 
 protected:
 	void Basic(const InheritanceSolver &is);
@@ -414,7 +447,7 @@
 					// NamespaceGen object, or NULL if
 					// this is a DiagramGen
 
-	UdmGen gen;
+	const UdmGen& gen;
 	string idt;	// indentation to use
 
 	virtual void CustomProcess(const ::Uml::Diagram &cross_diagram, const InheritanceSolver &is);
@@ -448,10 +481,10 @@
 			{
 				fwd_decls.push_back( boost::format("class %1%%2%") % gen.opts.macro % (string)i->name() );
 
-				ClassGen cgen(*i, gen);
-				cgen.Process(cross_diagram, is);
+				// clgen_map.emplace(piecewise_construct, make_tuple(), make_tuple());
+				ClassGen& cgen = clgen_map.insert(make_pair(i->getPath2("::", false), ClassGen(*i, gen))).first->second;
 
-				clgen_map.insert(make_pair(i->getPath2("::", false), cgen));
+				cgen.Process(cross_diagram, is);
 			}
 
 			set< ::Uml::Association> associations = c.associations();
@@ -661,7 +694,7 @@
 			i->second.CollectMaps(p_nsgen_map, p_clgen_map);
 	}
 
-	void BeginNS(ostream &out, bool parents_too = true)
+	void BeginNS(ostream &out, bool parents_too = true) const
 	{
 		if (parents_too)
 			for (vector<boost::format>::const_iterator i = begin_ns.begin(); i != begin_ns.end(); i++)
@@ -672,7 +705,7 @@
 		out << endl;
 	}
 
-	void EndNS(ostream &out, bool parents_too = true)
+	void EndNS(ostream &out, bool parents_too = true) const
 	{
 		if (parents_too)
 			for (vector<boost::format>::const_iterator i = end_ns.begin(); i != end_ns.end(); i++)
@@ -683,7 +716,7 @@
 		out << endl;
 	}
 
-	void OutDecls(ostream &out)
+	void OutDecls(ostream &out) const
 	{
 		string lidt = idt + "\t";
 
@@ -699,7 +732,7 @@
 		OutFmts(out, lidt, other_decls);
 	}
 
-	void OutMetaCreate(ostream &out)
+	void OutMetaCreate(ostream &out) const
 	{
 		string lidt = idt + "\t";
 
@@ -719,7 +752,7 @@
 		}
 	}
 
-	void OutMetaInit(ostream &out)
+	void OutMetaInit(ostream &out) const
 	{
 		string lidt = idt + "\t";
 
@@ -739,7 +772,7 @@
 		}
 	}
 
-	void OutMetaInitLinks(ostream &out)
+	void OutMetaInitLinks(ostream &out) const
 	{
 		string lidt = idt + "\t";
 
@@ -759,17 +792,17 @@
 		}
 	}
 
-	void OutMetaInit2(ostream &out)
+	void OutMetaInit2(ostream &out) const
 	{
 		OutFmts(out, idt + "\t", meta_init2);
 	}
 
-	void OutMetaInitLinks2(ostream &out)
+	void OutMetaInitLinks2(ostream &out) const
 	{
 		OutFmts(out, idt + "\t", meta_init_links2);
 	}
 
-	void OutMetaCreateAssocs(ostream &out)
+	void OutMetaCreateAssocs(ostream &out) const
 	{
 		string lidt = idt + "\t\t";
 
@@ -789,7 +822,7 @@
 		}
 	}
 
-	void OutMetaCreateComps(ostream &out)
+	void OutMetaCreateComps(ostream &out) const
 	{
 		string lidt = idt + "\t\t";
 
@@ -809,19 +842,19 @@
 		}
 	}
 
-	void OutMetaInitAssocs(ostream &out)
+	void OutMetaInitAssocs(ostream &out) const
 	{
 		if (gen.opts.meta_init == UdmOpts::DYNAMIC_INIT)
 			OutVecFmts(out, idt + "\t\t", meta_init_assocs, "associations");
 	}
 
-	void OutMetaInitComps(ostream &out)
+	void OutMetaInitComps(ostream &out) const
 	{
 		if (gen.opts.meta_init == UdmOpts::DYNAMIC_INIT)
 			OutVecFmts(out, idt + "\t\t", meta_init_comps, "compositions");
 	}
 
-	void OutMetaInitLinksAssocs(ostream &out)
+	void OutMetaInitLinksAssocs(ostream &out) const
 	{
 		string lidt = idt + "\t\t";
 
@@ -840,7 +873,7 @@
 		}
 	}
 
-	void OutMetaInitLinksComps(ostream &out)
+	void OutMetaInitLinksComps(ostream &out) const
 	{
 		string lidt = idt + "\t\t";
 
@@ -859,7 +892,7 @@
 		}
 	}
 
-	void OutDefs(ostream &out)
+	void OutDefs(ostream &out) const
 	{
 		if (meta_def.size())
 			out << idt << "\t" << meta_def << ";" << endl << endl;
@@ -872,7 +905,7 @@
 		if (clgen_map.size())
 		{
 			out << lidt << "\t// classes, with attributes, constraints and constraint definitions" << endl;
-			for (CLGEN_MAP::iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
+			for (CLGEN_MAP::const_iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
 				i->second.OutMetaCreate(out);
 		}
 
@@ -882,7 +915,7 @@
 		if (nsgen_map.size())
 		{
 			out << lidt << "\t// namespaces" << endl;
-			for (NSGEN_MAP::iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
+			for (NSGEN_MAP::const_iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
 				i->second.OutMetaCreate(out);
 		}
 
@@ -895,7 +928,7 @@
 		if (clgen_map.size())
 		{
 			out << lidt << "\t// classes, with attributes, constraints and constraint definitions" << endl;
-			for (CLGEN_MAP::iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
+			for (CLGEN_MAP::const_iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
 				i->second.OutMetaInit(out);
 		}
 
@@ -905,7 +938,7 @@
 		if (nsgen_map.size())
 		{
 			out << lidt << "\t// namespaces" << endl;
-			for (NSGEN_MAP::iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
+			for (NSGEN_MAP::const_iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
 				i->second.OutMetaInit(out);
 		}
 
@@ -916,7 +949,7 @@
 		out << lidt << begin_meta_init_links << endl;
 
 		if (clgen_map.size())
-			for (CLGEN_MAP::iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
+			for (CLGEN_MAP::const_iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
 				i->second.OutMetaInitLinks(out);
 
 		OutMetaInitLinksAssocs(out);
@@ -925,7 +958,7 @@
 		if (nsgen_map.size())
 		{
 			out << lidt << "\t// namespaces" << endl;
-			for (NSGEN_MAP::iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
+			for (NSGEN_MAP::const_iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
 				i->second.OutMetaInitLinks(out);
 		}
 
@@ -941,14 +974,14 @@
 			if (clgen_map.size())
 			{
 				out << lidt << "\t// classes, with attributes, constraints and constraint definitions" << endl;
-				for (CLGEN_MAP::iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
+				for (CLGEN_MAP::const_iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
 					i->second.OutMetaInit2(out);
 			}
 
 			if (nsgen_map.size())
 			{
 				out << lidt << "\t// namespaces" << endl;
-				for (NSGEN_MAP::iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
+				for (NSGEN_MAP::const_iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
 					i->second.OutMetaInit2(out);
 			}
 
@@ -961,14 +994,14 @@
 			if (clgen_map.size())
 			{
 				out << lidt << "\t// classes" << endl;
-				for (CLGEN_MAP::iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
+				for (CLGEN_MAP::const_iterator i = clgen_map.begin(); i != clgen_map.end(); i++)
 					i->second.OutMetaInitLinks2(out);
 			}
 
 			if (nsgen_map.size())
 			{
 				out << lidt << "\t// namespaces" << endl;
-				for (NSGEN_MAP::iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
+				for (NSGEN_MAP::const_iterator i = nsgen_map.begin(); i != nsgen_map.end(); i++)
 					i->second.OutMetaInitLinks2(out);
 			}
 
@@ -991,7 +1024,7 @@
 			out << endl;
 	}
 
-	void OutCPP(ostream &out)
+	void OutCPP(ostream &out) const
 	{
 		BeginNS(out, false);
 
@@ -1002,7 +1035,7 @@
 			NSGEN_MAP::const_iterator i = nsgen_map.find(ns_path);
 			if (i == nsgen_map.end()) throw udm_exception("nsgen_map does not contain a mapping for the namespace " + ns_path);
 
-			CGen< ::Uml::Namespace> ngen = i->second;
+			const CGen< ::Uml::Namespace>& ngen = i->second;
 			ngen.OutCPP(out);
 		}
 
@@ -1013,7 +1046,7 @@
 			CLGEN_MAP::const_iterator i = clgen_map.find(cl_path);
 			if (i == clgen_map.end()) throw udm_exception("clgen_map does not contain a mapping for the class " + cl_path);
 
-			ClassGen cgen = i->second;
+			const ClassGen& cgen = i->second;
 			cgen.OutDefs(out);
 		}
 
@@ -1048,7 +1081,7 @@
 	void CustomProcess(const ::Uml::Diagram &cross_diagram, const InheritanceSolver &p_is);
 
 public:
-	DiagramGen(const ::Uml::Diagram &p_c, const UdmGen &p_gen) : CGen< ::Uml::Diagram>(p_c, p_gen), is(p_c, p_gen.opts.cxx_source_unit == UdmOpts::UNIT_NAMESPACE) { }
+	DiagramGen(const ::Uml::Diagram &p_c, const UdmGen &p_gen) : CGen< ::Uml::Diagram>(p_c, p_gen), is(p_c, p_gen, p_gen.opts.cxx_source_unit == UdmOpts::UNIT_NAMESPACE) { }
 
 	void Process(const ::Uml::Diagram &cross_diagram, bool recursively = true)
 	{

Modified: UDM/trunk/src/Udm/UdmCpp.cpp
==============================================================================
--- UDM/trunk/src/Udm/UdmCpp.cpp	Mon Mar 12 16:11:00 2018	(r4412)
+++ UDM/trunk/src/Udm/UdmCpp.cpp	Tue Apr  3 13:26:26 2018	(r4413)
@@ -26,12 +26,12 @@
 
 
 
-InheritanceSolver::InheritanceSolver(const ::Uml::Diagram &diagram, bool sort_by_namespace)
+InheritanceSolver::InheritanceSolver(const ::Uml::Diagram &diagram, const UdmGen& gen, bool sort_by_namespace) : gen(gen)
 {
-	::Uml::DiagramClasses all_classes(diagram);
 	vector< ::Uml::Class> classes;
-	for (::Uml::DiagramClasses::iterator i = all_classes.begin(); i != all_classes.end(); i++) {
-		classes.push_back(*i);
+	for (vector< ::Uml::Class>::const_iterator it = gen.DiagramClasses.begin(); it != gen.DiagramClasses.end(); it++)
+	{
+		classes.push_back(*it);
 	}
 
 	bool has_namespaces = ((set< ::Uml::Namespace>)diagram.namespaces()).size() > 0;
@@ -40,7 +40,7 @@
 	{
 		::Uml::Class cl;
 		set< ::Uml::Class> bases;
-		vector< ::Uml::Class>::iterator c;
+		vector< ::Uml::Class>::const_iterator c;
 		for( c = classes.begin(); c != classes.end(); c++ )	
 		{
 			cl = *c;
@@ -86,7 +86,7 @@
 				{
 					for(set< ::Uml::Class>::iterator j = dirancs.begin(); j != dirancs.end(); j++) 
 					{
-						if(!Uml::IsDerivedFrom(*j, cl)) 
+						if (!gen.isDerivedFrom(*j, cl))
 						{
 							virtualbaseclasses.insert(cl);
 							break;
@@ -118,7 +118,7 @@
 					{
 						for(set< ::Uml::Class>::iterator j = dirancs.begin(); j != dirancs.end(); j++) 
 						{
-							if(!Uml::IsDerivedFrom(*j, cl) && Uml::IsDerivedFrom(*j, *h)) 
+							if (!gen.isDerivedFrom(*j, cl) && gen.isDerivedFrom(*j, *h))
 							{
 									actmapi->second.insert(cl);
 							}
@@ -159,7 +159,7 @@
 			int found_inset = 0, found_notinset = 0;
 			for(set< ::Uml::Class>::iterator p = subtypes.begin(); p != subtypes.end(); p++) 
 			{
-				if(!Uml::IsDerivedFrom(cl, *p)) continue;
+				if(!gen.isDerivedFrom(cl, *p)) continue;
 				if(actmapi->second.find(*p) != actmapi->second.end()) found_inset++;
 				else found_notinset++;
 			}


More information about the Mobies-commit mailing list