LCOV - code coverage report
Current view: top level - geom - GroupingEntity.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 102 146 69.9 %
Date: 2020-06-30 00:58:45 Functions: 12 15 80.0 %
Branches: 86 164 52.4 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : GroupingEntity.cpp
       3                 :            : //
       4                 :            : // Purpose       : This file contains the implementation of the class 
       5                 :            : //                 GroupingEntity. 
       6                 :            : //
       7                 :            : // Special Notes :
       8                 :            : //
       9                 :            : // Creator       : Xuechen Liu
      10                 :            : //
      11                 :            : // Creation Date : 07/11/96 
      12                 :            : //
      13                 :            : // Owner         :  Malcolm J. Panthaki
      14                 :            : //-------------------------------------------------------------------------
      15                 :            : 
      16                 :            : // ********** BEGIN STANDARD INCLUDES      **********
      17                 :            : // ********** END STANDARD INCLUDES        **********
      18                 :            : 
      19                 :            : // ********** BEGIN CUBIT INCLUDES         **********
      20                 :            : #include "GroupingEntity.hpp"
      21                 :            : #include "SenseEntity.hpp"
      22                 :            : #include "BasicTopologyEntity.hpp"
      23                 :            : 
      24                 :            : #include "DLIList.hpp"
      25                 :            : #include "ModelQueryEngine.hpp"
      26                 :            : 
      27                 :            : // ********** END CUBIT INCLUDES           **********
      28                 :            : 
      29                 :            : 
      30                 :            : // ********** BEGIN STATIC DECLARATIONS    **********
      31                 :            : // ********** END STATIC DECLARATIONS      **********
      32                 :            : 
      33                 :            : // ********** BEGIN PUBLIC FUNCTIONS       **********
      34                 :            : 
      35                 :            : //-------------------------------------------------------------------------
      36                 :            : // Purpose       : The destructor
      37                 :            : //
      38                 :            : // Special Notes :
      39                 :            : //
      40                 :            : // Creator       : Malcolm J. Panthaki
      41                 :            : //
      42                 :            : // Creation Date : 09/03/96
      43                 :            : //-------------------------------------------------------------------------
      44                 :      71478 : GroupingEntity::~GroupingEntity()
      45                 :            : {
      46         [ -  + ]:      35739 :   if (myParent)
      47         [ #  # ]:          0 :     myParent->remove_grouping_entity(this);
      48 [ -  + ][ #  # ]:      35739 :   while (firstSenseEntity && remove_sense_entity(firstSenseEntity));
         [ #  # ][ -  + ]
      49                 :            :     
      50 [ +  - ][ +  - ]:      35739 :   assert (!myParent && !nextInParent && !firstSenseEntity);
                 [ -  + ]
      51         [ -  + ]:      35739 : }
      52                 :            : 
      53                 :            : //-------------------------------------------------------------------------
      54                 :            : // Purpose       : This function returns a list of SenseEntity
      55                 :            : //                 pointers associated with this grouping entity.
      56                 :            : //
      57                 :            : // Special Notes : Complete reimplementation - j.k. July 2003
      58                 :            : //
      59                 :            : // Creator       : Xuechen Liu
      60                 :            : //
      61                 :            : // Creation Date : 07/28/96
      62                 :            : //-------------------------------------------------------------------------
      63                 :       7164 : CubitStatus GroupingEntity::get_sense_entity_list( DLIList<SenseEntity*>& list)
      64                 :            : {
      65         [ -  + ]:       7164 :   if (!firstSenseEntity)
      66                 :          0 :     return CUBIT_SUCCESS;
      67                 :            :   
      68 [ +  - ][ +  + ]:      32652 :   for (SenseEntity* ptr = firstSenseEntity; ptr; ptr = ptr->next())
      69                 :            :   {
      70 [ +  - ][ -  + ]:      25488 :     assert(ptr->get_grouping_entity_ptr() == this);
      71         [ +  - ]:      25488 :     list.append(ptr);
      72                 :            :   }
      73                 :       7164 :   return CUBIT_SUCCESS;
      74                 :            : }
      75                 :            : 
      76                 :            : //-------------------------------------------------------------------------
      77                 :            : // Purpose       : This function adds a sense entity to the list of 
      78                 :            : //                 sense entities of a grouping entity.
      79                 :            : //
      80                 :            : // Special Notes : In the DAG, the sense entities associated with the 
      81                 :            : //                 current grouping entity are linked from one sense
      82                 :            : //                 entity to another in order to maintain the order in
      83                 :            : //                 which the sense entities were added to the grouping
      84                 :            : //                 entity.
      85                 :            : //
      86                 :            : //                 Complete reimplementation - j.k. July 2003
      87                 :            : //
      88                 :            : // Creator       : Malcolm J. Panthaki
      89                 :            : //
      90                 :            : // Creation Date : 07/31/96
      91                 :            : //-------------------------------------------------------------------------
      92                 :      70502 : CubitStatus GroupingEntity::add_sense_entity(SenseEntity *sense_entity,
      93                 :            :                                              SenseEntity *after_this) 
      94                 :            : {
      95                 :            :     // Check to make sure that we are getting the correct type of 
      96                 :            :     // SenseEntity.
      97 [ +  - ][ +  - ]:      70502 :   if ( dag_type() != sense_entity->dag_type().parent() )
         [ +  - ][ -  + ]
      98                 :          0 :      return CUBIT_FAILURE ;
      99                 :            :    
     100                 :            :     // Check that the sense entity is not already in some other
     101                 :            :     // grouping entity
     102         [ -  + ]:      70502 :   if ( sense_entity->get_grouping_entity_ptr() )
     103                 :          0 :     return CUBIT_FAILURE;
     104                 :            :   
     105                 :            :     // prev and next ptrs should be NULL if sense entity is not
     106                 :            :     // in a grouping entity
     107 [ +  - ][ -  + ]:      70502 :   assert (!sense_entity->next() && !sense_entity->previous());
     108                 :            :   
     109         [ +  + ]:      70502 :   if (after_this)
     110                 :            :   {
     111         [ -  + ]:      35251 :     if (after_this->get_grouping_entity_ptr() != this )
     112                 :          0 :       return CUBIT_FAILURE;
     113                 :            :   
     114         [ -  + ]:      35251 :     if (!sense_entity->gpe_insert_after(after_this))
     115                 :          0 :       return CUBIT_FAILURE;
     116                 :            :       
     117         [ +  - ]:      35251 :     if (after_this == lastSenseEntity)
     118                 :      35251 :       lastSenseEntity = sense_entity;
     119                 :            :   }
     120         [ -  + ]:      35251 :   else if (lastSenseEntity)
     121                 :            :   {
     122         [ #  # ]:          0 :     if (!sense_entity->gpe_insert_after(lastSenseEntity))
     123                 :          0 :       return CUBIT_FAILURE;
     124                 :          0 :     lastSenseEntity = sense_entity;
     125                 :            :   }
     126                 :            :   else
     127                 :            :   {
     128                 :      35251 :     firstSenseEntity = lastSenseEntity = sense_entity;
     129                 :            :   }
     130                 :            :   
     131                 :      70502 :   sense_entity->set_grouping_entity_ptr(this);
     132                 :      70502 :   return CUBIT_SUCCESS;
     133                 :            : }
     134                 :            : 
     135                 :            : 
     136                 :            : //-------------------------------------------------------------------------
     137                 :            : // Purpose       : Remove a child sense entity
     138                 :            : //
     139                 :            : // Special Notes : 
     140                 :            : //
     141                 :            : // Creator       : Jason Kraftcheck
     142                 :            : //
     143                 :            : // Creation Date : 07/22/03
     144                 :            : //-------------------------------------------------------------------------
     145                 :      97936 : CubitStatus GroupingEntity::remove_sense_entity( SenseEntity* sense_entity_ptr )
     146                 :            : {
     147         [ -  + ]:      97936 :   if (sense_entity_ptr->get_grouping_entity_ptr() != this)
     148                 :          0 :     return CUBIT_FAILURE;
     149                 :            :   
     150         [ +  + ]:      97936 :   if (firstSenseEntity == sense_entity_ptr)
     151                 :      96547 :     firstSenseEntity = sense_entity_ptr->next();
     152         [ +  + ]:      97936 :   if (lastSenseEntity == sense_entity_ptr)
     153                 :      36472 :     lastSenseEntity = sense_entity_ptr->previous();
     154                 :            :   
     155                 :      97936 :   sense_entity_ptr->gpe_remove();
     156                 :      97936 :   sense_entity_ptr->set_grouping_entity_ptr(NULL);
     157                 :      97936 :   return CUBIT_SUCCESS;
     158                 :            : }
     159                 :            : 
     160                 :            : //-------------------------------------------------------------------------
     161                 :            : // Purpose       : Change/update/re-order child SenseEntity list
     162                 :            : //
     163                 :            : // Special Notes : 
     164                 :            : //
     165                 :            : // Creator       : Jason Kraftcheck
     166                 :            : //
     167                 :            : // Creation Date : 11/03/03
     168                 :            : //-------------------------------------------------------------------------
     169                 :      26518 : CubitStatus GroupingEntity::set_sense_entity_list( 
     170                 :            :                                         DLIList<SenseEntity*>& list,
     171                 :            :                                         DLIList<SenseEntity*>& removed )
     172                 :            : {
     173                 :            :   int i;
     174                 :            :   
     175                 :            :     // Remove all?
     176         [ -  + ]:      26518 :   if (list.size() == 0)
     177                 :            :   {
     178                 :          0 :     get_sense_entity_list( removed );
     179                 :          0 :     return disconnect_all_children();
     180                 :            :   }
     181                 :            :   
     182                 :            :     // Check for error conditions before modifying anything
     183                 :      26518 :   list.reset();
     184         [ +  + ]:     125813 :   for (i = list.size(); i--; )
     185                 :            :   {
     186                 :      99295 :     SenseEntity* sense_entity = list.get_and_step();
     187                 :            :     
     188                 :            :       // Check to make sure that we are getting the correct type of 
     189                 :            :       // SenseEntity.
     190 [ +  - ][ +  - ]:      99295 :     if ( dag_type() != sense_entity->dag_type().parent() )
         [ +  - ][ -  + ]
     191                 :          0 :        return CUBIT_FAILURE ;
     192                 :            :    
     193                 :            :       // Check that the sense entity is not already in some other
     194                 :            :       // grouping entity
     195   [ +  +  -  + ]:     110780 :     if ( sense_entity->get_grouping_entity_ptr() &&
                 [ -  + ]
     196                 :      11485 :          sense_entity->get_grouping_entity_ptr() != this )
     197                 :          0 :       return CUBIT_FAILURE;
     198                 :            :   }
     199                 :            : 
     200                 :            :     // Special case for first entity in list.
     201                 :      26518 :   list.reset();
     202                 :      26518 :   SenseEntity* new_first = list.get_and_step();
     203                 :            :     // No sense entities currently attached...
     204         [ +  + ]:      26518 :   if (!firstSenseEntity)
     205                 :            :   {
     206                 :      22964 :     firstSenseEntity = lastSenseEntity = new_first;
     207                 :      22964 :     new_first->set_grouping_entity_ptr(this);
     208                 :            :   }
     209                 :            :     // Already attached, but not first in list...
     210         [ +  + ]:       3554 :   else if( firstSenseEntity != new_first )
     211                 :            :   {
     212         [ +  + ]:        438 :     if (!new_first->get_grouping_entity_ptr())
     213                 :        297 :       new_first->set_grouping_entity_ptr(this);
     214                 :            :     else
     215                 :            :     {
     216         [ +  + ]:        141 :       if (lastSenseEntity == new_first)
     217                 :         75 :         lastSenseEntity = new_first->previous();
     218                 :        141 :       new_first->gpe_remove();
     219                 :            :     }
     220                 :            :       
     221                 :        438 :     new_first->gpe_insert_before(firstSenseEntity);
     222                 :        438 :     firstSenseEntity = new_first;
     223                 :            :   }
     224                 :            :   
     225                 :            :     // Now loop through remaining sense entities.
     226                 :      26518 :   SenseEntity* prev = new_first;
     227         [ +  + ]:      99295 :   for (i = list.size() - 1; i--; )
     228                 :            :   {
     229                 :      72777 :     SenseEntity* curr = list.get_and_step();
     230                 :            : 
     231                 :            :       // If next sense entity in input list is not
     232                 :            :       // next sense entity in this GroupingEntity...
     233         [ +  + ]:      72777 :     if (prev->next() != curr)
     234                 :            :     {
     235         [ +  + ]:      65586 :       if (!curr->get_grouping_entity_ptr())
     236                 :      64549 :         curr->set_grouping_entity_ptr(this);
     237                 :            :       else
     238                 :            :       {
     239         [ +  + ]:       1037 :         if (lastSenseEntity == curr)
     240                 :        370 :           lastSenseEntity = curr->previous();
     241                 :       1037 :         curr->gpe_remove();
     242                 :            :       }
     243                 :      65586 :       curr->gpe_insert_after(prev);
     244                 :            :     }
     245                 :            :     
     246                 :            :       // update lastSenseEntity if necessary...
     247         [ +  + ]:      72777 :     if (lastSenseEntity == prev)
     248                 :      63064 :       lastSenseEntity = curr;
     249                 :            :       
     250                 :            :       // iterate
     251                 :      72777 :     prev = curr;
     252                 :            :   }
     253                 :            :   
     254                 :            :     // Disconnect any sense entities in this GroupingEntity
     255                 :            :     // that were not in in the input list (they should now
     256                 :            :     // be at the end of the list of sense entities in this)
     257                 :            :     // and pass them back in the 'removed' list.
     258                 :      26518 :   CubitStatus result = CUBIT_SUCCESS;
     259         [ +  + ]:      27706 :   while (prev != lastSenseEntity)
     260                 :            :   {
     261         [ +  - ]:       1188 :     removed.append(prev->next());
     262         [ -  + ]:       1188 :     if (!remove_sense_entity(prev->next()))
     263                 :            :     {
     264                 :          0 :       assert(0);
     265                 :            :       result = CUBIT_FAILURE;
     266                 :            :       prev = prev->next();
     267                 :            :     }
     268                 :            :   }
     269                 :            :   
     270                 :      26518 :   return result;
     271                 :            : }
     272                 :            :   
     273                 :            : 
     274                 :            : //-------------------------------------------------------------------------
     275                 :            : // Purpose       : Invert
     276                 :            : //
     277                 :            : // Special Notes : 
     278                 :            : //
     279                 :            : // Creator       : Jason Kraftcheck
     280                 :            : //
     281                 :            : // Creation Date : 07/22/03
     282                 :            : //-------------------------------------------------------------------------
     283                 :          0 : void GroupingEntity::reverse_direction()
     284                 :            : {
     285                 :            :   SenseEntity* ptr;
     286         [ #  # ]:          0 :   if (!firstSenseEntity)
     287                 :          0 :     return;
     288                 :            :   
     289                 :            :     // For each child sense entity
     290         [ #  # ]:          0 :   for (ptr = firstSenseEntity; ptr; ptr = ptr->previous())
     291                 :            :   {
     292                 :            :       // change linked list pointers
     293                 :          0 :     ptr->swap_gpe_list_ptrs();
     294                 :            :       // change sense
     295                 :          0 :     ptr->reverse_sense();
     296                 :            :   }
     297                 :            :   
     298                 :            :     // Change first pointer the old last entity
     299                 :            :     // (Preserves order as returnd by old DLIList rep and 
     300                 :            :     //  makes this work to reverse a chain.)
     301                 :          0 :   ptr = firstSenseEntity;
     302                 :          0 :   firstSenseEntity = lastSenseEntity;
     303                 :          0 :   lastSenseEntity = ptr;
     304                 :            : }
     305                 :            : 
     306                 :            : //-------------------------------------------------------------------------
     307                 :            : // Purpose       : Get parent basic topology entity.
     308                 :            : //
     309                 :            : // Special Notes : 
     310                 :            : //
     311                 :            : // Creator       : Jason Kraftcheck
     312                 :            : //
     313                 :            : // Creation Date : 07/22/03
     314                 :            : //-------------------------------------------------------------------------
     315                 :      35229 : int GroupingEntity::get_parents( DLIList<TopologyEntity*>* list ) const
     316                 :            : {
     317         [ +  - ]:      35229 :   if (!myParent)
     318                 :      35229 :     return 0;
     319                 :            :   
     320         [ #  # ]:          0 :   if (list)
     321         [ #  # ]:          0 :     list->append(myParent);
     322                 :            :   
     323                 :      35229 :   return 1;
     324                 :            : }
     325                 :            : 
     326                 :            : //-------------------------------------------------------------------------
     327                 :            : // Purpose       : Get child sense entities
     328                 :            : //
     329                 :            : // Special Notes : 
     330                 :            : //
     331                 :            : // Creator       : Jason Kraftcheck
     332                 :            : //
     333                 :            : // Creation Date : 07/22/03
     334                 :            : //-------------------------------------------------------------------------
     335                 :        510 : int GroupingEntity::get_children( DLIList<TopologyEntity*>* list ) const
     336                 :            : {
     337         [ +  - ]:        510 :   if (!firstSenseEntity)
     338                 :        510 :     return 0;
     339                 :            :   
     340                 :          0 :   int count = 0;
     341         [ #  # ]:          0 :   for (SenseEntity* ptr = firstSenseEntity; ptr; ptr = ptr->next() )
     342                 :            :   {
     343         [ #  # ]:          0 :     assert(ptr->get_grouping_entity_ptr() == this);
     344         [ #  # ]:          0 :     if(list)
     345         [ #  # ]:          0 :       list->append(ptr);
     346                 :          0 :     count++;
     347                 :            :   }
     348                 :            :   
     349                 :        510 :   return count;
     350                 :            : }
     351                 :            : 
     352                 :            : // ********** END PUBLIC FUNCTIONS         **********
     353                 :            : 
     354                 :            : // ********** BEGIN PROTECTED FUNCTIONS    **********
     355                 :            : 
     356                 :            : //-------------------------------------------------------------------------
     357                 :            : // Purpose       : Remove a child sense entity
     358                 :            : //
     359                 :            : // Special Notes : 
     360                 :            : //
     361                 :            : // Creator       : Jason Kraftcheck
     362                 :            : //
     363                 :            : // Creation Date : 07/22/03
     364                 :            : //-------------------------------------------------------------------------
     365                 :          0 : CubitStatus GroupingEntity::remove_child_link( TopologyEntity* child_ptr )
     366                 :            : {
     367         [ #  # ]:          0 :   SenseEntity* se = dynamic_cast<SenseEntity*>(child_ptr);
     368         [ #  # ]:          0 :   if (!se)
     369                 :          0 :     return CUBIT_FAILURE;
     370                 :            :   
     371                 :          0 :   return remove_sense_entity(se);
     372                 :            : }
     373                 :            : 
     374                 :            : //-------------------------------------------------------------------------
     375                 :            : // Purpose       : Remove from all parent BasicTopologyEntities
     376                 :            : //
     377                 :            : // Special Notes : 
     378                 :            : //
     379                 :            : // Creator       : Jason Kraftcheck
     380                 :            : //
     381                 :            : // Creation Date : 07/22/03
     382                 :            : //-------------------------------------------------------------------------
     383                 :          0 : CubitStatus GroupingEntity::disconnect_all_parents( DLIList<TopologyEntity*>* list )
     384                 :            : {
     385         [ #  # ]:          0 :   if (!myParent)
     386                 :          0 :     return CUBIT_SUCCESS;
     387         [ #  # ]:          0 :   if (list) 
     388         [ #  # ]:          0 :     list->append(myParent);
     389                 :          0 :   return myParent->remove_grouping_entity(this);
     390                 :            : }
     391                 :            : 
     392                 :            : //-------------------------------------------------------------------------
     393                 :            : // Purpose       : Remove all child SenseEntitys
     394                 :            : //
     395                 :            : // Special Notes : 
     396                 :            : //
     397                 :            : // Creator       : Jason Kraftcheck
     398                 :            : //
     399                 :            : // Creation Date : 07/22/03
     400                 :            : //-------------------------------------------------------------------------
     401                 :      35229 : CubitStatus GroupingEntity::disconnect_all_children( DLIList<TopologyEntity*>* list)
     402                 :            : {
     403         [ +  + ]:     130729 :   while (firstSenseEntity)
     404                 :            :   {
     405         [ +  - ]:      95500 :     if (list)
     406         [ +  - ]:      95500 :       list->append(firstSenseEntity);
     407         [ -  + ]:      95500 :     if (!remove_sense_entity(firstSenseEntity))
     408                 :          0 :       return CUBIT_FAILURE;
     409                 :            :   }
     410                 :      35229 :   return CUBIT_SUCCESS;
     411                 :            : }
     412                 :            : 
     413                 :            : //-------------------------------------------------------------------------
     414                 :            : // Purpose       : Functions to support ModelQueryEngine
     415                 :            : //
     416                 :            : // Special Notes : 
     417                 :            : //
     418                 :            : // Creator       : Jason Kraftcheck
     419                 :            : //
     420                 :            : // Creation Date : 07/24/03
     421                 :            : //-------------------------------------------------------------------------
     422                 :     133561 : CubitBoolean GroupingEntity::query_append_parents( DLIList<TopologyEntity*>& list )
     423                 :            : {
     424 [ +  - ][ +  + ]:     133561 :   if (myParent && !ModelQueryEngine::instance()->encountered(myParent))
                 [ +  + ]
     425                 :            :   {
     426         [ +  - ]:     130981 :     list.append(myParent);
     427                 :     130981 :     return CUBIT_TRUE;
     428                 :            :   }
     429                 :            :   
     430                 :     133561 :   return CUBIT_FALSE;
     431                 :            : }
     432                 :     651511 : CubitBoolean GroupingEntity::query_append_children( DLIList<TopologyEntity*>& list )
     433                 :            : {
     434                 :     651511 :   ModelQueryEngine *const mqe = ModelQueryEngine::instance();
     435                 :     651511 :   CubitBoolean found_some = CUBIT_FALSE;
     436                 :            :   
     437         [ +  + ]:     651511 :   if (!firstSenseEntity)
     438                 :      35251 :     return CUBIT_FALSE;
     439                 :            :   
     440         [ +  + ]:    2355175 :   for (SenseEntity* ptr = firstSenseEntity; ptr; ptr = ptr->next())
     441                 :            :   {
     442         [ +  - ]:    1738915 :     if (!mqe->encountered(ptr))
     443                 :            :     {
     444         [ +  - ]:    1738915 :       list.append(ptr);
     445                 :    1738915 :       found_some = CUBIT_TRUE;
     446                 :            :     }
     447                 :            :   }
     448                 :            :     
     449                 :     651511 :   return found_some;
     450 [ +  - ][ +  - ]:       6540 : }

Generated by: LCOV version 1.11