void BulkData::destroy_relation( Entity & e1 , Entity & e2 , unsigned kind ) { // When removing a relationship may need to // remove part membership and set field relation pointer to NULL PartSet del ; bool to_e1 = false ; std::vector<Relation>::iterator i ; for ( i = e1.m_relation.end() ; i != e1.m_relation.begin() ; ) { --i ; if ( i->entity() == & e2 && i->kind() == kind ) { if ( i->forward() ) { clear_field_relations( e1 , i->entity_type() , i->identifier() , i->kind() ); deduce_part_relations( e1, e2, i->identifier(), i->kind(), del ); } i = e1.m_relation.erase( i ); } } for ( i = e2.m_relation.end() ; i != e2.m_relation.begin() ; ) { --i ; if ( i->entity() == & e1 && i->kind() == kind ) { if ( i->forward() ) { clear_field_relations( e2 , i->entity_type() , i->identifier() , i->kind() ); deduce_part_relations( e2, e1, i->identifier(), i->kind(), del ); to_e1 = true ; } i = e2.m_relation.erase( i ); } } Entity & e_to = to_e1 ? e1 : e2 ; { PartSet keep ; deduce_part_relations( e_to , keep ); if ( ! keep.empty() ) { // Eliminate the 'keep' from the accumulated 'del' for ( PartSet::iterator j = del.end() ; j != del.begin() ; ) { --j ; if ( contain( keep , **j ) ) { j = del.erase( j ); } } } } if ( ! del.empty() ) { PartSet add ; internal_change_entity_parts( e_to , add , del ); } }