Exemple #1
0
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 );
  }
}