[Mobies-commit] [commit] r4192 - in GReAT/trunk/Tools/MetaGME2UMX: . MetaGME2UMX Interpreters

ksmyth at redhat3.isis.vanderbilt.edu ksmyth at redhat3.isis.vanderbilt.edu
Fri Sep 20 13:44:06 CDT 2013


Author: ksmyth
Date: Fri Sep 20 13:44:05 2013
New Revision: 4192

Log:
MetaGME2UML: Put Folder (FCO) in RootFolder if it (or any of its proxies) or equivalents has InRootFolder()==true

Modified:
   GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.cpp
   GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.h
   GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp
   GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UMX Interpreters/UdmApp.h

Modified: GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.cpp
==============================================================================
--- GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.cpp	Tue Sep  3 11:48:39 2013	(r4191)
+++ GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.cpp	Fri Sep 20 13:44:05 2013	(r4192)
@@ -408,7 +408,6 @@
 	}
 }
 
-#if _MSC_VER >= 1300
 template <class TYPE, class PROXY_TYPE>
 TYPE getRefByProxy( const MetaGME::BaseFCO& proxy) {
 	TYPE refByProxy;
@@ -429,29 +428,6 @@
 		const MetaGME::BaseFCO& refByProxy= ( ap!=Udm::null) ? ap : ( mp!=Udm::null) ? mp : ( fp!=Udm::null) ? fp : ( cp!=Udm::null) ? cp : ( rp!=Udm::null) ? rp : (sp!=Udm::null) ? sp :fco;
 		return refByProxy;
 }
-#else
-// Vc6 does not support specification of template arguments for template functions
-// so they must be included in the function argument list.
-template <class TYPE, class PROXY_TYPE>
-TYPE getRefByProxy( const MetaGME::BaseFCO& proxy, TYPE type, PROXY_TYPE proxy_type) {
-	TYPE refByProxy;
-	if ( proxy.type() == PROXY_TYPE::meta) {
-		PROXY_TYPE typedProxy= PROXY_TYPE::Cast( proxy);
-		refByProxy= typedProxy.ref();
-	}
-	return refByProxy;
-}
-MetaGME::BaseFCO RefByProxy( const MetaGME::BaseFCO& fco) {
-		MetaGME::Atom ap= getRefByProxy( fco, MetaGME::Atom(), MetaGME::AtomProxy());
-		MetaGME::Model mp= getRefByProxy( fco, MetaGME::Model(), MetaGME::ModelProxy());
-		MetaGME::FCO fp= getRefByProxy( fco, MetaGME::FCO(), MetaGME::FCOProxy());
-		MetaGME::Connection cp= getRefByProxy( fco, MetaGME::Connection(), MetaGME::ConnectionProxy());
-		MetaGME::Reference rp= getRefByProxy( fco, MetaGME::Reference(), MetaGME::ReferenceProxy());
-		MetaGME::Set sp= getRefByProxy( fco, MetaGME::Set(), MetaGME::SetProxy());
-		const MetaGME::BaseFCO& refByProxy= ( ap!=0) ? ap : ( mp!=0) ? mp : ( fp!=0) ? fp : ( cp!=0) ? cp : ( rp!=0) ? rp : (sp!=0) ? sp :fco;
-		return refByProxy;
-}
-#endif
 
 void MetaGME2UML::MakeImplIntf( const MetaGME::BaseFCO& b, const MetaGME::BaseFCO& d, bool impl, bool intf)
 {	
@@ -682,51 +658,51 @@
 	RecurseOnBases( base, visitedBases);
 }
 
-#if _MSC_VER >= 1300
 template <class TYPE, class PROXY_TYPE>
-void MetaGME2UML::checkProxies( const MetaGME::BaseFCO& base, std::set< MetaGME::BaseFCO>& visitedBases) {
-	if ( base.type() == TYPE::meta) {
-		TYPE typedBase= TYPE::Cast( base);
-		std::set< PROXY_TYPE> proxies= typedBase.src();
-		for( std::set< PROXY_TYPE>::const_iterator it= proxies.begin(); it!= proxies.end(); ++it) {
-			RecurseOnBases( *it, visitedBases);
-//		std::for_each( proxies.begin(), proxies.end(), std::bind2nd( this->RecurseOnBases, visitedBases));
-		}
+void GetProxies(const MetaGME::BaseFCO& base, std::set<MetaGME::BaseFCO>& ret)
+{
+	if (base.type() == TYPE::meta)
+	{
+		std::set<PROXY_TYPE> proxies = TYPE::Cast(base).src();
+		std::copy(proxies.begin(), proxies.end(), set_inserter(ret));
 	}
 }
 
-template <class TYPE, class PROXY_TYPE>
-void MetaGME2UML::checkRefByProxies( const MetaGME::BaseFCO& proxy, std::set< MetaGME::BaseFCO>& visitedBases) {
-	if ( proxy.type() == PROXY_TYPE::meta) {
-		PROXY_TYPE typedProxy= PROXY_TYPE::Cast( proxy);
-		TYPE refByProxy= typedProxy.ref();
-		RecurseOnBases( refByProxy, visitedBases);
-	}
+set<MetaGME::BaseFCO> GetProxies(const MetaGME::BaseFCO& base)
+{
+	std::set<MetaGME::BaseFCO> ret;
+
+	GetProxies<MetaGME::Atom, MetaGME::AtomProxy>(base, ret);
+	GetProxies<MetaGME::Model, MetaGME::ModelProxy>(base, ret);
+	GetProxies<MetaGME::FCO, MetaGME::FCOProxy>(base, ret);
+	GetProxies<MetaGME::Connection, MetaGME::ConnectionProxy>(base, ret);
+	GetProxies<MetaGME::Reference, MetaGME::ReferenceProxy>(base, ret);
+	GetProxies<MetaGME::Set, MetaGME::SetProxy>(base, ret);
+
+	return ret;
 }
-#else
-// Vc6 does not support specification of template arguments for template functions
-// so they must be included in the function argument list.
+
+
 template <class TYPE, class PROXY_TYPE>
-void checkProxies( const MetaGME::BaseFCO& base, std::set< MetaGME::BaseFCO>& visitedBases, const TYPE& type, const PROXY_TYPE& proxy_type, MetaGME2UML* pMetaGme2Uml) {
+void MetaGME2UML::checkProxies( const MetaGME::BaseFCO& base, std::set< MetaGME::BaseFCO>& visitedBases) {
 	if ( base.type() == TYPE::meta) {
 		TYPE typedBase= TYPE::Cast( base);
 		std::set< PROXY_TYPE> proxies= typedBase.src();
 		for( std::set< PROXY_TYPE>::const_iterator it= proxies.begin(); it!= proxies.end(); ++it) {
-			pMetaGme2Uml->RecurseOnBases( *it, visitedBases);
+			RecurseOnBases( *it, visitedBases);
 //		std::for_each( proxies.begin(), proxies.end(), std::bind2nd( this->RecurseOnBases, visitedBases));
 		}
 	}
 }
 
 template <class TYPE, class PROXY_TYPE>
-void checkRefByProxies( const MetaGME::BaseFCO& proxy, std::set< MetaGME::BaseFCO>& visitedBases, TYPE type, PROXY_TYPE proxy_type, MetaGME2UML* pMetaGme2Uml) {
+void MetaGME2UML::checkRefByProxies( const MetaGME::BaseFCO& proxy, std::set< MetaGME::BaseFCO>& visitedBases) {
 	if ( proxy.type() == PROXY_TYPE::meta) {
 		PROXY_TYPE typedProxy= PROXY_TYPE::Cast( proxy);
 		TYPE refByProxy= typedProxy.ref();
-		pMetaGme2Uml->RecurseOnBases( refByProxy, visitedBases);
+		RecurseOnBases( refByProxy, visitedBases);
 	}
 }
-#endif
 
 void MetaGME2UML::RecurseOnBases( const MetaGME::BaseFCO& base, std::set< MetaGME::BaseFCO>& visitedBases)
 {	
@@ -775,7 +751,6 @@
 			RecurseOnBases( currBase, visitedBases);	// recursive call
 		}
 	}
-#if _MSC_VER >= 1300
 	// 3. find all proxys that refer to "base"
 	checkProxies< MetaGME::Atom, MetaGME::AtomProxy>( base, visitedBases);
 	checkProxies< MetaGME::Model, MetaGME::ModelProxy>( base, visitedBases);
@@ -791,24 +766,7 @@
 	checkRefByProxies< MetaGME::Connection, MetaGME::ConnectionProxy>( base, visitedBases);
 	checkRefByProxies< MetaGME::Reference, MetaGME::ReferenceProxy>( base, visitedBases);
 	checkRefByProxies< MetaGME::Set, MetaGME::SetProxy>( base, visitedBases);
-#else
-	
-	// 3. find all proxys that refer to "base"
-	::checkProxies( base, visitedBases, MetaGME::Atom(), MetaGME::AtomProxy(), this);
-	::checkProxies( base, visitedBases, MetaGME::Model(), MetaGME::ModelProxy(), this);
-	::checkProxies( base, visitedBases, MetaGME::FCO(), MetaGME::FCOProxy(), this);
-	::checkProxies( base, visitedBases, MetaGME::Connection(), MetaGME::ConnectionProxy(), this);
-	::checkProxies( base, visitedBases, MetaGME::Reference(), MetaGME::ReferenceProxy(), this);
-	::checkProxies( base, visitedBases, MetaGME::Set(), MetaGME::SetProxy(), this);
 
-	// 4. if base is a proxy, figure out if the referred baseFCOs have any bases
-	::checkRefByProxies( base, visitedBases, MetaGME::Atom(), MetaGME::AtomProxy(), this);
-	::checkRefByProxies( base, visitedBases, MetaGME::Model(), MetaGME::ModelProxy(), this);
-	::checkRefByProxies( base, visitedBases, MetaGME::FCO(), MetaGME::FCOProxy(), this);
-	::checkRefByProxies( base, visitedBases, MetaGME::Connection(), MetaGME::ConnectionProxy(), this);
-	::checkRefByProxies( base, visitedBases, MetaGME::Reference(), MetaGME::ReferenceProxy(), this);
-	::checkRefByProxies( base, visitedBases, MetaGME::Set(), MetaGME::SetProxy(), this);
-#endif
 	vector<MetaGME::ContainedInPar> fcos;
 	for(map_CIP2CIP::iterator emi=equivMap.begin(); emi!=equivMap.end(); emi++)
 	{	if( (*emi).second == base)
@@ -850,6 +808,31 @@
 	}
 }
 
+// requires: fco is not a proxy
+static bool InRootFolder(MetaGME::BaseFCO fco)
+{
+	std::set<MetaGME::BaseFCO> proxies = GetProxies(fco);
+	for (std::set<MetaGME::BaseFCO>::iterator proxiesIt = proxies.begin(); proxiesIt != proxies.end(); proxiesIt++)
+	{
+		if (proxiesIt->InRootFolder())
+			return true;
+	}
+	return false;
+}
+
+static bool BaseInRootFolder(MetaGME::ContainedInPar kind)
+{
+	if (kind.type() == MetaGME::Folder::meta)
+	{
+		return MetaGME::Folder::Cast(kind).InRootFolder();
+	}
+	if (Uml::IsDerivedFrom(kind.type(), MetaGME::BaseFCO::meta))
+	{
+		return InRootFolder(MetaGME::BaseFCO::Cast(kind));
+	}
+	return false;
+}
+
 void MetaGME2UML::CreateClasses(MetaGME::ParadigmSheet ps, UmlGME::ClassDiagram cd)
 {	vector<MetaGME::ContainedInPar> cips = ps.ContainedInPar_kind_children();
 	for(vector<MetaGME::ContainedInPar>::iterator i=cips.begin(); i!=cips.end();i++)
@@ -886,6 +869,13 @@
 			mapMetaGME2UmlGME_Class[cip] = cl;
 		}
 
+
+		vector<MetaGME::ContainedInPar> fcos;
+		for(map_CIP2CIP::iterator emi=equivMap.begin(); emi!=equivMap.end(); emi++)
+		{	if( (*emi).second == cip)
+				fcos.push_back((*emi).first);
+		}
+
 		if(type == "Folder")
 		{	MetaGME::Folder mo = MetaGME::Folder::Cast(cip);
 			cl.name() = mo.name();
@@ -894,7 +884,10 @@
 			intf.Stereotype() = "Folder";
 			cl.IsAbstract() = false;
 			cl.Attributes() = "name : String[0..1]\n";
-			if(mo.InRootFolder())	CreateRootFolderAssociation(intf);
+			bool inRootFolder = mo.InRootFolder();
+			inRootFolder |= std::any_of(fcos.begin(), fcos.end(), BaseInRootFolder);
+			if (inRootFolder)
+				CreateRootFolderAssociation(intf);
 		}
 		else // either Model, Atom, FCO, Set, Reference, Connection
 		{	MetaGME::BaseFCO mo = MetaGME::BaseFCO::Cast(cip);
@@ -903,15 +896,16 @@
 			cl.Stereotype() = type;
 			impl.Stereotype() = type;
 			intf.Stereotype() = type;
-			if(mo.InRootFolder())	CreateRootFolderAssociation(intf);
+
+			bool inRootFolder = mo.InRootFolder();
+			inRootFolder |= InRootFolder(mo);
+			inRootFolder |= std::any_of(fcos.begin(), fcos.end(), BaseInRootFolder);
+
+			if (inRootFolder)
+				CreateRootFolderAssociation(intf);
 			AddAttribute(mo,impl);
 		}
 
-		vector<MetaGME::ContainedInPar> fcos;
-		for(map_CIP2CIP::iterator emi=equivMap.begin(); emi!=equivMap.end(); emi++)
-		{	if( (*emi).second == cip)
-				fcos.push_back((*emi).first);
-		}
 		for(vector<MetaGME::ContainedInPar>::iterator fi = fcos.begin(); fi!=fcos.end(); fi++)
 		{	MetaGME::ContainedInPar slave = *fi;
 			mapMetaGME2UmlGME_Class[slave] = cl;

Modified: GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.h
==============================================================================
--- GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.h	Tue Sep  3 11:48:39 2013	(r4191)
+++ GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML.h	Fri Sep 20 13:44:05 2013	(r4192)
@@ -47,7 +47,10 @@
 
 //#include "hash_map"
 #include <map>
+#include <iterator>
 
+template<class Cont>
+std::insert_iterator<Cont> set_inserter(Cont& s) { return std::inserter(s, s.begin()); }
 
 struct stringicmp; 
 
@@ -130,9 +133,7 @@
 			void MakeImplIntf(const MetaGME::BaseFCO& base, const MetaGME::BaseFCO& derived, bool impl, bool intf);
 			void GetUMLCounterParts(MetaGME::BaseFCO base, MetaGME::BaseFCO derived, UmlGME::Class &cbase, UmlGME::Class &cderived);
 			void RecurseOnBases(const MetaGME::BaseFCO& base);
-#if _MSC_VER < 1300
-public:
-#endif
+
 		void RecurseOnBases(const MetaGME::BaseFCO& base, std::set< MetaGME::BaseFCO>&visitedBases);
 protected:
 		template <class TYPE, class PROXY_TYPE>

Modified: GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp
==============================================================================
--- GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp	Tue Sep  3 11:48:39 2013	(r4191)
+++ GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UML_2.cpp	Fri Sep 20 13:44:05 2013	(r4192)
@@ -986,9 +986,6 @@
 	//cms.dstRolename() = "";
 }
 
-template<class Cont>
-std::insert_iterator<Cont> set_inserter(Cont& s) { return std::inserter(s, s.begin()); }
-
 template <class In, class Out, class Fn>
 std::set<Out>& trans(const std::set<In>& input, std::set<Out>& output, const Fn f) {
 	std::transform(input.begin(), input.end(), set_inserter(output), f);

Modified: GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UMX Interpreters/UdmApp.h
==============================================================================
--- GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UMX Interpreters/UdmApp.h	Tue Sep  3 11:48:39 2013	(r4191)
+++ GReAT/trunk/Tools/MetaGME2UMX/MetaGME2UMX Interpreters/UdmApp.h	Fri Sep 20 13:44:05 2013	(r4192)
@@ -2,12 +2,7 @@
 //
 //////////////////////////////////////////////////////////////////////
 
-#if !defined(AFX_UDMAPP_H__296A93EB_6DB6_4179_AA0B_A3D799FB3A1C__INCLUDED_)
-#define AFX_UDMAPP_H__296A93EB_6DB6_4179_AA0B_A3D799FB3A1C__INCLUDED_
-
-#if _MSC_VER > 1000
 #pragma once
-#endif // _MSC_VER > 1000
 
 // Udm includes
 #include "UdmBase.h"
@@ -33,4 +28,3 @@
 	
 };
 
-#endif // !defined(AFX_UDMAPP_H__296A93EB_6DB6_4179_AA0B_A3D799FB3A1C__INCLUDED_)


More information about the Mobies-commit mailing list