[GME-commit] GMESRC/Paradigms/MetaGME/MetaInterpreter2004 BON2Component.cpp,1.17,1.18 BON2Component.h,1.7,1.8 entity.h,1.3,1.4 relation.h,1.1,1.2

gme-commit at list.isis.vanderbilt.edu gme-commit at list.isis.vanderbilt.edu
Fri Jul 16 18:39:09 CDT 2004


Update of /var/lib/gme/GMESRC/Paradigms/MetaGME/MetaInterpreter2004
In directory braindrain:/tmp/cvs-serv22622/MetaInterpreter2004

Modified Files:
	BON2Component.cpp BON2Component.h entity.h relation.h 
Log Message:
New isAbstract, isInRootFolder handling.


CVS User: zolmol

Index: BON2Component.cpp
===================================================================
RCS file: /var/lib/gme/GMESRC/Paradigms/MetaGME/MetaInterpreter2004/BON2Component.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** BON2Component.cpp	12 Jul 2004 22:01:08 -0000	1.17
--- BON2Component.cpp	16 Jul 2004 22:39:06 -0000	1.18
***************
*** 74,80 ****
  		m_entities.clear();
  		m_relations.clear();
! 		m_toBeDeletedEntities.clear();
  		m_realObj.clear();
! 		Sheet::m_BON_Project_Root_Folder = (Folder)NULL;
  
  		if ( m_sheet != 0)  
--- 74,83 ----
  		m_entities.clear();
  		m_relations.clear();
! 		m_equivRelations.clear();
! 		//m_toBeDeletedEntities.clear();
! 		m_equivBag.clear();
  		m_realObj.clear();
! 
! 		Sheet::m_BON_Project_Root_Folder = (Folder)NULL; // crucial!!!
  
  		if ( m_sheet != 0)  
***************
*** 174,179 ****
  
  	m_entities.clear();
! 	m_toBeDeletedEntities.clear();
  	m_relations.clear();
  	m_realObj.clear();
  
--- 177,183 ----
  
  	m_entities.clear();
! 	//m_toBeDeletedEntities.clear();
  	m_relations.clear();
+ 	m_equivRelations.clear();
  	m_realObj.clear();
  
***************
*** 214,218 ****
  				(*asp_elem)->getObjectMeta().name() == Relation::containment_str ) 
  			{ // if a role is intended to be an aspect member
! 				Object src_fco, dst_model;
  				Connection containment( *asp_elem);
  				if (containment)
--- 218,222 ----
  				(*asp_elem)->getObjectMeta().name() == Relation::containment_str ) 
  			{ // if a role is intended to be an aspect member
! 				FCO src_fco, dst_model;
  				Connection containment( *asp_elem);
  				if (containment)
***************
*** 264,269 ****
  			conn_kind == Relation::has_attribute_str)
  		{
! 			Object src = FCO((*conn_it)->getSrc());
! 			Object dst = FCO((*conn_it)->getDst());
  
  			Relation rela( Relation::CONTAINMENT_OP, dst, src); // create a relation object
--- 268,273 ----
  			conn_kind == Relation::has_attribute_str)
  		{
! 			FCO src = FCO((*conn_it)->getSrc());
! 			FCO dst = FCO((*conn_it)->getDst());
  
  			Relation rela( Relation::CONTAINMENT_OP, dst, src); // create a relation object
***************
*** 307,311 ****
  		{
  			FCO referred = (*ref_it)->getReferred();
! 			this->m_realObj[ *ref_it] = referred;
  		}
  		catch( ... )
--- 311,317 ----
  		{
  			FCO referred = (*ref_it)->getReferred();
! 			this->m_realObj[ *ref_it] = referred; //! a NULL proxy is part of m_realObj, having a NULL value attached
! 			if ( referred) // if not a null reference
! 				this->m_equivBag[ referred].insert( *ref_it);
  		}
  		catch( ... )
***************
*** 483,487 ****
  
  						Relation rela( Relation::EQUIVALENCE_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_relations.push_back(rela);
  					}
  				}
--- 489,493 ----
  
  						Relation rela( Relation::EQUIVALENCE_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_equivRelations.push_back(rela);
  					}
  				}
***************
*** 503,507 ****
  
  						Relation rela( Relation::SAME_ASPECT_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_relations.push_back(rela);
  					}
  				}
--- 509,513 ----
  
  						Relation rela( Relation::SAME_ASPECT_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_equivRelations.push_back(rela);
  					}
  				}
***************
*** 523,527 ****
  
  						Relation rela( Relation::SAME_FOLDER_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_relations.push_back(rela);
  					}
  				}
--- 529,533 ----
  
  						Relation rela( Relation::SAME_FOLDER_OP, FCO( obj1), FCO( obj2), *atom_it);
! 						m_equivRelations.push_back(rela);
  					}
  				}
***************
*** 541,546 ****
  void Component::selectFromSameAspectsFolders()
  {
! 	Relation_Iterator rel_it = m_relations.begin();
! 	for( ; rel_it != m_relations.end(); ++rel_it)
  	{
  		if ( rel_it->getOperation() == Relation::SAME_ASPECT_OP || 
--- 547,552 ----
  void Component::selectFromSameAspectsFolders()
  {
! 	Relation_Iterator rel_it = m_equivRelations.begin();
! 	for( ; rel_it != m_equivRelations.end(); ++rel_it)
  	{
  		if ( rel_it->getOperation() == Relation::SAME_ASPECT_OP || 
***************
*** 554,559 ****
  			else
  			{
! 				bool is_proxy_first = m_realObj[ rel_it->getOp1()] != BON::Object();
! 				bool is_proxy_second = m_realObj[ rel_it->getOp2()] != BON::Object();
  				
  				ObjPointer selected_ptr = 0;
--- 560,565 ----
  			else
  			{
! 				bool is_proxy_first = isProxy( rel_it->getOp1()) == 1;
! 				bool is_proxy_second = isProxy( rel_it->getOp2()) == 1;
  				
  				ObjPointer selected_ptr = 0;
***************
*** 597,601 ****
  
  
! Entity Component::entitySearch( ObjPointer p_ptr)
  {
  	Entity_Iterator it( m_entities.begin());
--- 603,607 ----
  
  
! Entity Component::entitySearch( const ObjPointer& p_ptr)
  {
  	Entity_Iterator it( m_entities.begin());
***************
*** 604,608 ****
  	
  	if ( it == m_entities.end())
! 		return Entity( BON::Folder(), BON::Object());
  	else 
  		return *it;
--- 610,614 ----
  	
  	if ( it == m_entities.end())
! 		return Entity( BON::Folder(), BON::FCO());
  	else 
  		return *it;
***************
*** 619,642 ****
  {
  	RealMap_Iterator real_map_it = this->m_realObj.begin();
! 	for(; real_map_it != m_realObj.end(); ++real_map_it)
  	{
  		ObjPointer proxy_for_sure = real_map_it->first;
  		ObjPointer real_for_sure = real_map_it->second;
  
  		std::string n1, n2;
! 		if ( proxy_for_sure != BON::Object())
  			n1 = proxy_for_sure->getName();
! 		if ( real_for_sure != BON::Object())
  			n2= real_for_sure->getName();
! 		
! 		if ( proxy_for_sure != BON::Object() && real_for_sure != BON::Object())
  		{
! 			Entity proxy = entitySearch( proxy_for_sure);
! 			if ( proxy == Entity( BON::Folder(), BON::Object()))
  				global_vars.err << "ERROR: Entity not found during proxyFinder: " << proxy_for_sure->getName() << "\n";
  			else
  			{
  				operandSearchAndReplace( proxy_for_sure, real_for_sure);
! 				m_toBeDeletedEntities.push_back( proxy);
  			}
  		}
--- 625,654 ----
  {
  	RealMap_Iterator real_map_it = this->m_realObj.begin();
! 	for( ; real_map_it != m_realObj.end(); ++real_map_it)
  	{
  		ObjPointer proxy_for_sure = real_map_it->first;
  		ObjPointer real_for_sure = real_map_it->second;
  
+ #ifdef _DEBUG
  		std::string n1, n2;
! 		if ( proxy_for_sure != BON::FCO())
  			n1 = proxy_for_sure->getName();
! 		if ( real_for_sure != BON::FCO())
  			n2= real_for_sure->getName();
! #endif
! 		if ( proxy_for_sure != BON::FCO() && real_for_sure != BON::FCO())
  		{
! 			Entity_Iterator it( m_entities.begin());
! 			while ( it != m_entities.end() && proxy_for_sure != it->getPointer())
! 				++it;
! 
! 			if ( it == m_entities.end())
! 			{
  				global_vars.err << "ERROR: Entity not found during proxyFinder: " << proxy_for_sure->getName() << "\n";
+ 			}
  			else
  			{
  				operandSearchAndReplace( proxy_for_sure, real_for_sure);
! 				//proxies are in equivBag, so it will be marked, no need for it->deleted( true);//m_toBeDeletedEntities.push_back( proxy);
  			}
  		}
***************
*** 647,671 ****
  void Component::equivalenceFinder()
  {
! 	Relation_Iterator rel_it = m_relations.begin();
! 	while ( rel_it != m_relations.end())
  	{
! 		if ( rel_it->getOperation() == Relation::EQUIVALENCE_OP ||
  			rel_it->getOperation() == Relation::SAME_FOLDER_OP ||
  			rel_it->getOperation() == Relation::SAME_ASPECT_OP )
  		{
! 			Entity operand2 = entitySearch( rel_it->getOp2());
! 			if ( operand2 == Entity( BON::Folder(), BON::Object())) 
! 				global_vars.err << "ERROR: Entity not found during EquivalenceFinder: " << rel_it->getOperationStr() << "\n";
  
! 			// prevent search/replace for obvious cases like: a equiv a
! 			if ( rel_it->getOp1() != rel_it->getOp2() )
! 			{ 
! 				operandSearchAndReplace( rel_it->getOp2(), rel_it->getOp1());
! 				m_toBeDeletedEntities.push_back( operand2);
  			}
- 			// the relation needs to be deleted either way
- 			rel_it = m_relations.erase( rel_it); // <- relies on that erase increments rel_it
  		}
- 		else ++rel_it;
  	}
  }
--- 659,752 ----
  void Component::equivalenceFinder()
  {
! 	Relation_Iterator rel_it = m_equivRelations.begin();
! 	while ( rel_it != m_equivRelations.end())
  	{
! 		if( rel_it->getOperation() == Relation::EQUIVALENCE_OP ||
  			rel_it->getOperation() == Relation::SAME_FOLDER_OP ||
  			rel_it->getOperation() == Relation::SAME_ASPECT_OP )
+ 		{ // 
+ 			ObjPointer obj1 = rel_it->getOp1(), obj2 = rel_it->getOp2();
+ 			
+ 			// obj1 will have obj2 and proxies of obj2 as its alter egos
+ 			insertIntoEquivBag( obj2, obj1);
+ 			operandSearchAndReplace( obj2, obj1); //"Right law": repl left (op2) with right(op1)
+ 			
+ 			rel_it = m_equivRelations.erase( rel_it); // <- relies on that erase increments rel_it
+ 
+ 		}	
+ 		else 
  		{
! 			ASSERT(0); // no other relations are part of m_equivRelations
! 			++rel_it;
! 		}
! 	}
! 	ASSERT( m_equivRelations.empty()); // no relation should have remained
! }
  
! 
! // collects the equivalent objects into a bag
! // obj1 is the key in the map
! // obj2 is the later-to-be-removed object from the entities
! void Component::insertIntoEquivBag( const ObjPointer& obj2, const ObjPointer& obj1)
! {
! 	if ( obj1 == obj2) return; // avoid trivial case
! 
! 	std::set< FCO > bag2;
! 
! 	// check if obj2 has its own bag?
! 	EquivBag_Iterator it = m_equivBag.find( obj2);
! 	if ( it != m_equivBag.end())
! 	{
! 		bag2 = m_equivBag[ obj2];
! 		m_equivBag.erase( it);
! 	}
! 
! 	m_equivBag[obj1].insert( bag2.begin(), bag2.end());
! 	m_equivBag[obj1].insert( obj1);
! 	m_equivBag[obj1].insert( obj2);
! 
! #ifdef _DEBUG
! 	std::string n1 = obj1->getName();
! 	std::string n2 = obj2->getName();
! 
! 	std::set< FCO > :: const_iterator ii = m_equivBag[obj1].begin();
! 	for( ; ii != m_equivBag[obj1].end(); ++ii)
! 	{
! 		n2 = (*ii)->getName();
! 	}
! #endif
! 
! }
! 
! 
! void Component::markEquivEntities()
! {
! 	EquivBag_Iterator it = m_equivBag.begin();
! 	for( ; it != m_equivBag.end(); ++it)
! 	{
! 		ASSERT( !it->first->isDeleted());
! 		std::set< ObjPointer > & clique = it->second;
! 		std::set< ObjPointer > :: const_iterator jt = clique.begin();
! 		//std::string n1 = it->first->getName();
! 
! 		for( ; jt != clique.end(); ++jt)
! 		{
! 			//std::string n2 = (*jt)->getName();
! 			if ( *jt != it->first) // the responsible might be in its equiv bag
! 			{
! 				Entity_Iterator kt( m_entities.begin());
! 				while ( kt != m_entities.end() && *jt != kt->getPointer())
! 					++kt;
! 
! 				if ( kt != m_entities.end())
! 				{
! 					kt->deleted( true);//m_toBeDeletedEntities.push_back( ent);
! 				}
! 				else
! 				{
! 					global_vars.err << "ERROR: Entity not found during markEquivEntities: " << (*jt)->getName() << "\n";
! 				}
  			}
  		}
  	}
  }
***************
*** 678,732 ****
  connections which cannot be proxies)
  */
! void Component::operandSearchAndReplace(ObjPointer find_obj, ObjPointer real_obj)
  {
! 	Relation_Iterator rel_it = m_relations.begin();
! 	for( ; rel_it != m_relations.end(); ++rel_it)
  	{
! 		if (!rel_it->getOp1()) global_vars.err << "First operand is Null Pointer\n";
! 		if (!rel_it->getOp2()) global_vars.err << "Second operand is Null Pointer\n";
  
! 		ObjPointer obj = BON::Object(); obj = rel_it->getOp1();
! 		if ( obj == find_obj) 
! 			rel_it->setOp1(real_obj); 
  
! 		obj = BON::Object(); obj = rel_it->getOp2();
! 		if ( obj == find_obj) 
! 			rel_it->setOp2(real_obj); 
  
! 		// obj at this time may be BON::Object() (in most case it is)
! 		obj = BON::Object(); obj = rel_it->getOp3();
! 		if ( obj != BON::Object() && obj == find_obj) 
! 			rel_it->setOp3(real_obj); 
  
! 		// added recently, to be tested well <!>
! 		obj = BON::Object(); obj = rel_it->getOp4();
! 		if ( obj != BON::Object() && obj == find_obj) 
! 			rel_it->setOp4(real_obj); 
  
! 		obj = BON::Object(); obj = rel_it->getOp5();
! 		if ( obj != BON::Object() && obj == find_obj) 
! 			rel_it->setOp5(real_obj); 
  	}
  }
  
  void Component::removeProxiesAndEquiv()
  {
! 	Entity_Const_Iterator it = m_toBeDeletedEntities.begin();
! 	for ( ; it != m_toBeDeletedEntities.end(); ++it)
! 	{
! 		Entity_Iterator jt = m_entities.begin();
! 		while ( jt != m_entities.end() && jt->getPointer() != it->getPointer())
! 		 ++jt;
! 		if ( jt != m_entities.end() )
! 			m_entities.erase(jt);
! 	}
  }
  
  
! int Component::isProxy( ObjPointer ptr)
  {
! 	if ( ptr == BON::Object()) return 0;
! 	if (m_realObj[ ptr] != BON::Object()) return 1;
! 	if (ptr->getObjectMeta().name().find("Proxy") != std::string::npos) return 2;
  	return 0;
  }
--- 759,824 ----
  connections which cannot be proxies)
  */
! void Component::operandSearchAndReplace( const std::vector<ObjPointer>& find_obj_vec, const ObjPointer& real_obj)
  {
! 	const static int len = 2;
! 	Relations* reldb[ len] = { &m_relations, &m_equivRelations};
! 	for ( int k = 0; k < len; ++k)
  	{
! 		Relation_Iterator rel_it = reldb[k]->begin();
! 		for( ; rel_it != reldb[k]->end(); ++rel_it)
! 		{
! 			if (!rel_it->getOp1()) global_vars.err << "First operand is Null Pointer\n";
! 			if (!rel_it->getOp2()) global_vars.err << "Second operand is Null Pointer\n";
  
! 			ObjPointer obj = BON::FCO(); obj = rel_it->getOp1();
! 			//if ( obj == find_obj) 
! 			if ( std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end()) 
! 				rel_it->setOp1( real_obj); 
  
! 			obj = BON::FCO(); obj = rel_it->getOp2();
! 			//if ( obj == find_obj) 
! 			if ( std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end()) 
! 				rel_it->setOp2( real_obj); 
  
! 			// obj at this time may be BON::FCO() (in most case it is)
! 			obj = BON::FCO(); obj = rel_it->getOp3();
! 			//if ( obj != BON::FCO() && obj == find_obj) 
! 			if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end()) 
! 				rel_it->setOp3( real_obj); 
  
! 			// added recently, to be tested well <!>
! 			obj = BON::FCO(); obj = rel_it->getOp4();
! 			//if ( obj != BON::FCO() && obj == find_obj) 
! 			if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end()) 
! 				rel_it->setOp4(real_obj); 
  
! 			obj = BON::FCO(); obj = rel_it->getOp5();
! 			//if ( obj != BON::FCO() && obj == find_obj) 
! 			if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end()) 
! 				rel_it->setOp5(real_obj); 
! 		}
  	}
  }
  
+ 
+ void Component::operandSearchAndReplace( const ObjPointer& find_obj, const ObjPointer& real_obj)
+ {
+ 	operandSearchAndReplace( std::vector< ObjPointer>( 1, find_obj), real_obj);
+ }
+ 
+ 
  void Component::removeProxiesAndEquiv()
  {
! 	markEquivEntities();
  }
  
  
! int Component::isProxy( const ObjPointer& ptr)
  {
! 	if( ptr == BON::FCO()) return 0;
! 	RealMap_Iterator it = m_realObj.find( ptr);
! 	if( it != m_realObj.end() && it->second != BON::FCO()) return 1;//if (m_realObj.find[ ptr] != BON::FCO()) return 1;
! 	if( ptr->getObjectMeta().name().find("Proxy") != std::string::npos) return 2;
! 
  	return 0;
  }
***************
*** 740,743 ****
--- 832,837 ----
  	for( ; it != m_entities.end(); ++it)
  	{
+ 		if ( it->isDeleted()) continue;
+ 
  		int res;
  		if ( res = isProxy( it->getPointer()))
***************
*** 775,778 ****
--- 869,891 ----
  	}
  
+ 	rel_it = m_equivRelations.begin();
+ 	for( ; rel_it != m_equivRelations.end(); ++rel_it)
+ 	{
+ 		if ( isProxy( rel_it->getOp1()))
+ 			to_delete.push_back( rel_it->getOp1());
+ 
+ 		if ( isProxy( rel_it->getOp2()))
+ 			to_delete.push_back( rel_it->getOp2());
+ 
+ 		if ( isProxy( rel_it->getOp3()))
+ 			to_delete.push_back( rel_it->getOp3());
+ 
+ 		if ( isProxy( rel_it->getOp4()))
+ 			to_delete.push_back( rel_it->getOp4());
+ 
+ 		if ( isProxy( rel_it->getOp5()))
+ 			to_delete.push_back( rel_it->getOp5());
+ 	}
+ 
  	if ( c != to_delete.size()) correct = false;
  
***************
*** 801,804 ****
--- 914,929 ----
  				rel_it = m_relations.erase( rel_it);
  		}
+ 		rel_it = m_equivRelations.begin();
+ 		while( rel_it != m_equivRelations.end())
+ 		{
+ 			if ( rel_it->getOp1() != *ee &&
+ 				rel_it->getOp2() != *ee &&
+ 				rel_it->getOp3() != *ee &&
+ 				rel_it->getOp4() != *ee &&
+ 				rel_it->getOp5() != *ee )
+ 				++rel_it;
+ 			else
+ 				rel_it = m_equivRelations.erase( rel_it);
+ 		}
  	}
  	return correct;
***************
*** 826,830 ****
  	bool error = false;
  
- 	m_entities.sort();
  	Entity_Iterator it_1( m_entities.begin());
  
--- 951,954 ----
***************
*** 833,837 ****
  	for( ; it_1 != m_entities.end(); ++it_1 )
  	{
! 		ObjPointer obj = BON::Object();
  		obj = it_1->getPointer();
  
--- 957,963 ----
  	for( ; it_1 != m_entities.end(); ++it_1 )
  	{
! 		if ( it_1->isDeleted()) continue;
! 
! 		ObjPointer obj = BON::FCO();
  		obj = it_1->getPointer();
  
***************
*** 840,844 ****
  		Folder parent_folder( it_1->getParentFolder());
  
! 		if (!obj) global_vars.err << "Populate sheet: tries to create Rep with empty Object.\n";
  		else if ( !fco) global_vars.err << "Populate sheet: tries to create Rep with empty FCO.\n";
  		else
--- 966,970 ----
  		Folder parent_folder( it_1->getParentFolder());
  
! 		if (!obj) global_vars.err << "Populate sheet: tries to create Rep with empty FCO.\n";
  		else if ( !fco) global_vars.err << "Populate sheet: tries to create Rep with empty FCO.\n";
  		else
***************
*** 858,864 ****
  				new_elem = m_sheet->createReferenceRep( fco);
  			else if ( obj->getObjectMeta().name() == "Folder" )
! 				new_elem = m_sheet->createFolderRep( fco, (resp != BON::Object())?resp:fco);
  			else if ( obj->getObjectMeta().name() == "Aspect" )
! 				new_elem = m_sheet->createAspectRep( fco, (resp != BON::Object())?resp:fco);
  			else if ( obj->getObjectMeta().name() == "Constraint" )
  				new_elem = m_sheet->createConstraintRep( fco);
--- 984,990 ----
  				new_elem = m_sheet->createReferenceRep( fco);
  			else if ( obj->getObjectMeta().name() == "Folder" )
! 				new_elem = m_sheet->createFolderRep( fco, (resp != BON::FCO())?resp:fco);
  			else if ( obj->getObjectMeta().name() == "Aspect" )
! 				new_elem = m_sheet->createAspectRep( fco, (resp != BON::FCO())?resp:fco);
  			else if ( obj->getObjectMeta().name() == "Constraint" )
  				new_elem = m_sheet->createConstraintRep( fco);
***************
*** 877,881 ****
--- 1003,1011 ----
  			}
  			if (new_elem)
+ 			{
  				new_elem->setParentFolder( parent_folder); 
+ 				if ( m_equivBag.find( obj) != m_equivBag.end())
+ 					new_elem->setEquivPeers( m_equivBag[ obj]);
+ 			}
  		}
  	} // for m_entities
***************
*** 1053,1057 ****
  			else global_vars.err << "ERROR after dynamic_cast - conn\n";
  		}
! 		else if ( obj3 == BON::Object() )
  			global_vars.err << "Association relation is not complete. Association class missing. Op1: " + obj1->getName() + " Op2: " + obj2->getName() + "\n";
  		else 
--- 1183,1187 ----
  			else global_vars.err << "ERROR after dynamic_cast - conn\n";
  		}
! 		else if ( obj3 == BON::FCO() )
  			global_vars.err << "Association relation is not complete. Association class missing. Op1: " + obj1->getName() + " Op2: " + obj2->getName() + "\n";
  		else 
***************
*** 1257,1262 ****
  			if ( !aspect_obj) global_vars.err << "ERROR after dynamic_cast - aspect member - aspect is 0\n";
  
! 			if ( rel_it.getOp3() != BON::Object() && 
! 				rel_it.getOp4() != BON::Object()) // means a role is only the aspect member
  			{
  				std::string rolename = Connection( rel_it.getOp3())->getAttribute("Rolename")->getStringValue();
--- 1387,1392 ----
  			if ( !aspect_obj) global_vars.err << "ERROR after dynamic_cast - aspect member - aspect is 0\n";
  
! 			if ( rel_it.getOp3() != BON::FCO() && 
! 				rel_it.getOp4() != BON::FCO()) // means a role is only the aspect member
  			{
  				std::string rolename = Connection( rel_it.getOp3())->getAttribute("Rolename")->getStringValue();
***************
*** 1365,1374 ****
  		if (rel_it->getOperation() == Relation::ASSOCIATION_OP)
  		{
! 			bool three_op = rel_it->getOp3() != BON::Object();
! 			if( rel_it->getOp1() == BON::Object() || 
! 				rel_it->getOp2() == BON::Object() || 
! 				rel_it->getOp3() == BON::Object() || 
! 				rel_it->getOp4() == BON::Object() || 
! 				rel_it->getOp5() == BON::Object() )
  				global_vars.err << "Internal error: Assocation has one operand 0\n";
  			Entity ent1 = entitySearch( rel_it->getOp1());
--- 1495,1504 ----
  		if (rel_it->getOperation() == Relation::ASSOCIATION_OP)
  		{
! 			bool three_op = rel_it->getOp3() != BON::FCO();
! 			if( rel_it->getOp1() == BON::FCO() || 
! 				rel_it->getOp2() == BON::FCO() || 
! 				rel_it->getOp3() == BON::FCO() || 
! 				rel_it->getOp4() == BON::FCO() || 
! 				rel_it->getOp5() == BON::FCO() )
  				global_vars.err << "Internal error: Assocation has one operand 0\n";
  			Entity ent1 = entitySearch( rel_it->getOp1());
***************
*** 1380,1388 ****
  			ObjPointer ptr, o2 = rel_it->getOp2();
  
! 			if ( ent1 == Entity( BON::Folder(), BON::Object()) )
  			{
  				ptr = rel_it->getOp1();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
! 				if ( ptr != BON::Object())
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
--- 1510,1518 ----
  			ObjPointer ptr, o2 = rel_it->getOp2();
  
! 			if ( ent1 == Entity( BON::Folder(), BON::FCO()) )
  			{
  				ptr = rel_it->getOp1();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
! 				if ( ptr != BON::FCO())
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
***************
*** 1390,1398 ****
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is null\n";
  			}
! 			if ( ent2 == Entity( BON::Folder(), BON::Object()))
  			{
  				ptr = rel_it->getOp2();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp2()));
! 				if ( ptr != BON::Object())
  					global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is not present in Entities\n" << 
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
--- 1520,1528 ----
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is null\n";
  			}
! 			if ( ent2 == Entity( BON::Folder(), BON::FCO()))
  			{
  				ptr = rel_it->getOp2();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp2()));
! 				if ( ptr != BON::FCO())
  					global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is not present in Entities\n" << 
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
***************
*** 1400,1404 ****
  					global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is null\n";
  			}
! 			if ( ent3 == Entity( BON::Folder(), BON::Object()))
  			{
  				if ( three_op )
--- 1530,1534 ----
  					global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is null\n";
  			}
! 			if ( ent3 == Entity( BON::Folder(), BON::FCO()))
  			{
  				if ( three_op )
***************
*** 1417,1432 ****
  		else
  		{
! 			if( rel_it->getOp1() == BON::Object() ||
! 				rel_it->getOp2() == BON::Object() )
  				global_vars.err << "Internal error: " << rel_it->getOperationStr() << " has one operand 0\n";
  
  			Entity ent1 = entitySearch( rel_it->getOp1());
  			Entity ent2 = entitySearch( rel_it->getOp2());
! 			ObjPointer ptr = BON::Object();
! 			if ( ent1 == Entity( BON::Folder(), BON::Object()))
  			{
  				ptr = rel_it->getOp1();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
! 				if ( ptr != BON::Object())
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" << 
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
--- 1547,1562 ----
  		else
  		{
! 			if( rel_it->getOp1() == BON::FCO() ||
! 				rel_it->getOp2() == BON::FCO() )
  				global_vars.err << "Internal error: " << rel_it->getOperationStr() << " has one operand 0\n";
  
  			Entity ent1 = entitySearch( rel_it->getOp1());
  			Entity ent2 = entitySearch( rel_it->getOp2());
! 			ObjPointer ptr = BON::FCO();
! 			if ( ent1 == Entity( BON::Folder(), BON::FCO()))
  			{
  				ptr = rel_it->getOp1();
  				m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
! 				if ( ptr != BON::FCO())
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" << 
  						ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
***************
*** 1434,1438 ****
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() + " is null\n"; 
  			}
! 			if ( ent2 == Entity( BON::Folder(), BON::Object()))
  			{
  				ptr = rel_it->getOp2();
--- 1564,1568 ----
  					global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() + " is null\n"; 
  			}
! 			if ( ent2 == Entity( BON::Folder(), BON::FCO()))
  			{
  				ptr = rel_it->getOp2();
***************
*** 1440,1444 ****
  				ObjPointer ptr2 = rel_it->getOp1();
  				std::string peer1, peer2;
! 				if ( ptr2 != BON::Object())
  					peer1 = ptr2->getName() + " " + ptr2->getObjectMeta().name();
  				if ( rel_it->getOp2())
--- 1570,1574 ----
  				ObjPointer ptr2 = rel_it->getOp1();
  				std::string peer1, peer2;
! 				if ( ptr2 != BON::FCO())
  					peer1 = ptr2->getName() + " " + ptr2->getObjectMeta().name();
  				if ( rel_it->getOp2())
***************
*** 1476,1480 ****
  				rel_it->getOperation() == Relation::FOLDER_CONTAINMENT_OP )
  			{
! 				if (rel_it->getOp3() == BON::Object())
  					global_vars.err << "Internal error: (Folder)Containment line object not present in m_relations list\n";
  			}
--- 1606,1610 ----
  				rel_it->getOperation() == Relation::FOLDER_CONTAINMENT_OP )
  			{
! 				if (rel_it->getOp3() == BON::FCO())
  					global_vars.err << "Internal error: (Folder)Containment line object not present in m_relations list\n";
  			}
***************
*** 1519,1522 ****
--- 1649,1653 ----
  
  	global_vars.silent_mode = (lParam == GME_SILENT_MODE);
+ 
  	initMembers( project);
  
***************
*** 1541,1544 ****
--- 1672,1678 ----
  
  		CHECK();
+ 
+ 		m_entities.sort();
+ 		m_equivRelations.sort();
  
  		selectFromSameAspectsFolders();

Index: BON2Component.h
===================================================================
RCS file: /var/lib/gme/GMESRC/Paradigms/MetaGME/MetaInterpreter2004/BON2Component.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** BON2Component.h	12 Jul 2004 22:01:08 -0000	1.7
--- BON2Component.h	16 Jul 2004 22:39:07 -0000	1.8
***************
*** 65,71 ****
  	typedef Relations::const_iterator Relation_Const_Iterator;
  
! 	typedef Object ObjPointer;
  	typedef std::map< ObjPointer, ObjPointer> RealMap;
  	typedef std::map< ObjPointer, ObjPointer>::iterator RealMap_Iterator;
  
  private: // members
--- 65,73 ----
  	typedef Relations::const_iterator Relation_Const_Iterator;
  
! 	typedef FCO ObjPointer;
  	typedef std::map< ObjPointer, ObjPointer> RealMap;
  	typedef std::map< ObjPointer, ObjPointer>::iterator RealMap_Iterator;
+ 	typedef std::map< ObjPointer, std::set < ObjPointer > > EquivBag;
+ 	typedef std::map< ObjPointer, std::set < ObjPointer > >::iterator EquivBag_Iterator;
  
  private: // members
***************
*** 74,81 ****
  
  	Entities m_entities;
! 	Entities m_toBeDeletedEntities;
  	Relations m_relations;
  	RealMap m_realObj;
  
  private: // methods
  	void initMembers( Project& project);
--- 76,86 ----
  
  	Entities m_entities;
! 	//Entities m_toBeDeletedEntities;
  	Relations m_relations;
+ 	Relations m_equivRelations;
  	RealMap m_realObj;
  
+ 	EquivBag m_equivBag;
+ 
  private: // methods
  	void initMembers( Project& project);
***************
*** 91,97 ****
  	void equivalenceFinder();
  	void removeProxiesAndEquiv();
! 	int isProxy( ObjPointer ptr);
! 	void operandSearchAndReplace( ObjPointer proxy_obj, ObjPointer real_obj);
! 	Entity entitySearch( ObjPointer p_ptr);
  	bool checkForProxies();
  	
--- 96,105 ----
  	void equivalenceFinder();
  	void removeProxiesAndEquiv();
! 	int isProxy( const ObjPointer& ptr);
! 	void operandSearchAndReplace( const std::vector<ObjPointer>& proxy_obj, const ObjPointer& real_obj);
! 	void operandSearchAndReplace( const ObjPointer& proxy_obj, const ObjPointer& real_obj);
! 	void insertIntoEquivBag( const ObjPointer& obj1, const ObjPointer& obj2);
! 	void markEquivEntities();
! 	Entity entitySearch( const ObjPointer& p_ptr);
  	bool checkForProxies();
  	

Index: entity.h
===================================================================
RCS file: /var/lib/gme/GMESRC/Paradigms/MetaGME/MetaInterpreter2004/entity.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** entity.h	2 Mar 2004 19:43:04 -0000	1.3
--- entity.h	16 Jul 2004 22:39:07 -0000	1.4
***************
*** 8,13 ****
  
  public:
! 	explicit Entity( const BON::Folder& parent, const BON::Object& p, const BON::Object& p2 = BON::Object())
! 		: m_pointer( p), m_respPointer( p2), m_parentFolder( parent) { }
  
  	Entity( const Entity & operand )
--- 8,13 ----
  
  public:
! 	explicit Entity( const BON::Folder& parent, const BON::FCO& p, const BON::FCO& p2 = BON::FCO())
! 		: m_pointer( p), m_respPointer( p2), m_parentFolder( parent), m_deleted( false) { }
  
  	Entity( const Entity & operand )
***************
*** 15,18 ****
--- 15,19 ----
  		, m_respPointer( operand.m_respPointer)
  		, m_parentFolder( operand.m_parentFolder)
+ 		, m_deleted( operand.m_deleted)
  	{ }
  
***************
*** 24,27 ****
--- 25,29 ----
  		m_respPointer = operand.m_respPointer;
  		m_parentFolder = operand.m_parentFolder;
+ 		m_deleted = operand.m_deleted;
  		
  		return *this;
***************
*** 30,34 ****
  	~Entity() { }
  
! 	bool operator==( const Entity& peer) { return (m_pointer == peer.m_pointer) && (m_respPointer == peer.m_respPointer) && (m_parentFolder == peer.m_parentFolder); }
  	bool operator!=( const Entity& peer) { return !(*this==peer); }
  	bool operator<( const Entity& peer) const
--- 32,36 ----
  	~Entity() { }
  
! 	bool operator==( const Entity& peer) { return (m_pointer == peer.m_pointer) && (m_respPointer == peer.m_respPointer) && (m_parentFolder == peer.m_parentFolder) && (m_deleted == peer.m_deleted); }
  	bool operator!=( const Entity& peer) { return !(*this==peer); }
  	bool operator<( const Entity& peer) const
***************
*** 39,53 ****
  	}
  
! 	BON::Object getPointer() const { return m_pointer; }
! 	BON::Object getRespPointer() const { return m_respPointer; }
  	BON::Folder getParentFolder() const { return m_parentFolder; }
! 	void setPointer( const BON::Object& p) { m_pointer = p; }
! 	void setRespPointer( const BON::Object& r_p) { m_respPointer = r_p; }
  	void setParentFolder( const BON::Folder& pf) { m_parentFolder = pf; }
  
  private:
! 	BON::Object m_pointer;
! 	BON::Object m_respPointer;
  	BON::Folder m_parentFolder;
  };
  
--- 41,58 ----
  	}
  
! 	BON::FCO getPointer() const { return m_pointer; }
! 	BON::FCO getRespPointer() const { return m_respPointer; }
  	BON::Folder getParentFolder() const { return m_parentFolder; }
! 	void setPointer( const BON::FCO& p) { m_pointer = p; }
! 	void setRespPointer( const BON::FCO& r_p) { m_respPointer = r_p; }
  	void setParentFolder( const BON::Folder& pf) { m_parentFolder = pf; }
+ 	bool isDeleted() const { return m_deleted; }
+ 	void deleted( const bool val) { m_deleted = val; }
  
  private:
! 	BON::FCO m_pointer;
! 	BON::FCO m_respPointer;
  	BON::Folder m_parentFolder;
+ 	bool m_deleted;
  };
  

Index: relation.h
===================================================================
RCS file: /var/lib/gme/GMESRC/Paradigms/MetaGME/MetaInterpreter2004/relation.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** relation.h	4 Dec 2003 16:45:27 -0000	1.1
--- relation.h	16 Jul 2004 22:39:07 -0000	1.2
***************
*** 93,116 ****
  
  	inline OPER_TYPE getOperation() const { return m_operation; }
! 	inline const BON::Object getOp1() const { return m_operand1; }
! 	inline const BON::Object getOp2() const { return m_operand2; }
! 	inline const BON::Object getOp3() const { return m_operand3; }
! 	inline const BON::Object getOp4() const { return m_operand4; }
! 	inline const BON::Object getOp5() const { return m_operand5; }
  
  	inline void setOperation( OPER_TYPE oper_t) { m_operation = oper_t; }
! 	inline void setOp1(const BON::Object op_1) { m_operand1 = op_1; }
! 	inline void setOp2(const BON::Object op_2) { m_operand2 = op_2; }
! 	inline void setOp3(const BON::Object op_3) { m_operand3 = op_3; }
! 	inline void setOp4(const BON::Object op_4) { m_operand4 = op_4; }
! 	inline void setOp5(const BON::Object op_5) { m_operand5 = op_5; }
  
  	explicit Relation( 
  		OPER_TYPE oper_t, 
! 		const BON::Object operd1 = BON::Object(),
! 		const BON::Object operd2 = BON::Object(),
! 		const BON::Object operd3 = BON::Object(),
! 		const BON::Object operd4 = BON::Object(),
! 		const BON::Object operd5 = BON::Object())
  		:	m_operation( oper_t),
  		m_operand1( operd1),
--- 93,116 ----
  
  	inline OPER_TYPE getOperation() const { return m_operation; }
! 	inline const BON::FCO getOp1() const { return m_operand1; }
! 	inline const BON::FCO getOp2() const { return m_operand2; }
! 	inline const BON::FCO getOp3() const { return m_operand3; }
! 	inline const BON::FCO getOp4() const { return m_operand4; }
! 	inline const BON::FCO getOp5() const { return m_operand5; }
  
  	inline void setOperation( OPER_TYPE oper_t) { m_operation = oper_t; }
! 	inline void setOp1(const BON::FCO op_1) { m_operand1 = op_1; }
! 	inline void setOp2(const BON::FCO op_2) { m_operand2 = op_2; }
! 	inline void setOp3(const BON::FCO op_3) { m_operand3 = op_3; }
! 	inline void setOp4(const BON::FCO op_4) { m_operand4 = op_4; }
! 	inline void setOp5(const BON::FCO op_5) { m_operand5 = op_5; }
  
  	explicit Relation( 
  		OPER_TYPE oper_t, 
! 		const BON::FCO operd1 = BON::FCO(),
! 		const BON::FCO operd2 = BON::FCO(),
! 		const BON::FCO operd3 = BON::FCO(),
! 		const BON::FCO operd4 = BON::FCO(),
! 		const BON::FCO operd5 = BON::FCO())
  		:	m_operation( oper_t),
  		m_operand1( operd1),
***************
*** 130,134 ****
  		m_operand5( operand.m_operand5) { };
  	
!   const Relation & operator=(const Relation & operand)
  	{
  		if ( this == &operand) return *this;
--- 130,134 ----
  		m_operand5( operand.m_operand5) { };
  	
! 	const Relation & operator=(const Relation & operand)
  	{
  		if ( this == &operand) return *this;
***************
*** 151,161 ****
  			(m_operand5 == peer.m_operand5);
  	}
  private:
  	OPER_TYPE m_operation;
!   BON::Object m_operand1;
!   BON::Object m_operand2;
!   BON::Object m_operand3;
! 	BON::Object m_operand4;
! 	BON::Object m_operand5;
  };
  
--- 151,175 ----
  			(m_operand5 == peer.m_operand5);
  	}
+ 
+ 	bool operator<( const Relation& peer) const
+ 	{
+ 		if ( m_operation != peer.m_operation) return m_operation < peer.m_operation;
+ 		
+ 		int k;
+ 		k = m_operand1->getName().compare( peer.m_operand1->getName());
+ 		if( k != 0) return k < 0;
+ 		k = m_operand2->getName().compare( peer.m_operand2->getName());
+ 		if( k != 0) return k < 0;
+ 		k = m_operand3->getName().compare( peer.m_operand3->getName());
+ 		return ( k < 0);
+ 	}
+ 
  private:
  	OPER_TYPE m_operation;
! 	BON::FCO m_operand1;
! 	BON::FCO m_operand2;
! 	BON::FCO m_operand3;
! 	BON::FCO m_operand4;
! 	BON::FCO m_operand5;
  };
  



More information about the GME-commit mailing list