LCOV - code coverage report
Current view: top level - geom - BridgeManager.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 54 103 52.4 %
Date: 2020-06-30 00:58:45 Functions: 11 17 64.7 %
Branches: 65 252 25.8 %

           Branch data     Line data    Source code
       1                 :            : //-------------------------------------------------------------------------
       2                 :            : // Filename      : BridgeManager.cpp
       3                 :            : //
       4                 :            : // Purpose       : Manages the TopologyBridges being used by
       5                 :            : //                 a single TopologyEntity.  Encapsulates the
       6                 :            : //                 merging/unmerging of TopologyBridges into/from
       7                 :            : //                 a TopologyEntity.
       8                 :            : //
       9                 :            : // Creator       : Darryl Melander
      10                 :            : //
      11                 :            : // Creation Date : 02/20/99
      12                 :            : //
      13                 :            : // Owner         : Darryl Melander
      14                 :            : //-------------------------------------------------------------------------
      15                 :            : #include "BridgeManager.hpp"
      16                 :            : #include "TopologyBridge.hpp"
      17                 :            : #include "TopologyEntity.hpp"
      18                 :            : 
      19                 :            : #include <algorithm>
      20                 :            : 
      21                 :            : // Constructor.
      22                 :            : // Attaches this BridgeManager to 'owner'.
      23                 :     295153 : BridgeManager::BridgeManager()
      24         [ +  - ]:     295153 :     : topologyEntity(NULL)
      25                 :            : {
      26                 :     295153 : }
      27                 :            : 
      28                 :            : // Destructor
      29         [ +  - ]:     364720 : BridgeManager::~BridgeManager()
      30                 :            : {
      31         [ +  - ]:     182360 :   std::vector<TopologyBridge*>::iterator iter;
      32 [ +  - ][ #  # ]:     182360 :   for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
         [ +  - ][ +  - ]
                 [ -  + ]
      33                 :            :   {
      34 [ #  # ][ #  # ]:          0 :     delete (*iter);
                 [ #  # ]
      35                 :            :   }
      36         [ +  - ]:     182360 :   mergeList.clear();
      37         [ -  + ]:     182360 : }
      38                 :            : 
      39                 :     295153 : void BridgeManager::set_entity(TopologyEntity* ent)
      40                 :            : {
      41                 :     295153 :   topologyEntity = ent;
      42                 :     295153 : }
      43                 :            : 
      44                 :            : // Adds this TB to the child list.  Tells 'bridge'
      45                 :            : // that it belongs to this BridgeManager.  If bridge is
      46                 :            : // already in this BridgeManager, we return FAILURE.
      47                 :            : // This doesn't mean 'bridge' won't be in this manager,
      48                 :            : // it just means it won't be in the list twice.
      49                 :     170159 : CubitStatus BridgeManager::add_bridge(TopologyBridge* bridge)
      50                 :            : {
      51 [ +  - ][ -  + ]:     170159 :   if( !bridge || bridge->owner() )
                 [ -  + ]
      52                 :            :   {
      53 [ #  # ][ #  # ]:          0 :     assert( bridge && !bridge->owner() );
      54                 :          0 :     return CUBIT_FAILURE;
      55                 :            :   }
      56                 :            : 
      57                 :     170159 :   mergeList.push_back(bridge);
      58                 :            :   
      59                 :     170159 :   bridge->owner(this);
      60                 :     170159 :   return CUBIT_SUCCESS;
      61                 :            : }
      62                 :            : 
      63                 :            : // This function sets the 
      64                 :          0 : CubitStatus BridgeManager::add_bridge_as_representation(TopologyBridge* bridge)
      65                 :            : {
      66                 :            :     // Make sure bridge isn't already owned by someone else
      67 [ #  # ][ #  # ]:          0 :   if( !bridge || bridge->owner() ) 
                 [ #  # ]
      68                 :            :   {
      69 [ #  # ][ #  # ]:          0 :     assert( bridge && !bridge->owner() ); 
      70                 :          0 :     return CUBIT_FAILURE;
      71                 :            :   }
      72                 :            : 
      73                 :            :   // Add the bridge to the beginning of the list
      74                 :          0 :   mergeList.insert(mergeList.begin(), bridge );
      75                 :            :     
      76                 :          0 :   bridge->owner(this);
      77                 :          0 :   return CUBIT_SUCCESS;
      78                 :            : }  
      79                 :            : 
      80                 :            : // Removes 'bridge' from this.  If it wasn't in this,
      81                 :            : // then return FAILURE.
      82                 :     103056 : CubitStatus BridgeManager::remove_bridge(TopologyBridge* bridge )
      83                 :            : {
      84         [ +  - ]:     103056 :   std::vector<TopologyBridge*>::iterator iter;
      85 [ +  - ][ +  - ]:     103056 :   iter = std::find(mergeList.begin(), mergeList.end(), bridge);
                 [ +  - ]
      86 [ +  - ][ +  - ]:     103056 :   if (iter != mergeList.end())
                 [ +  - ]
      87         [ +  - ]:     103056 :     mergeList.erase(iter);
      88                 :            :   else
      89                 :          0 :     return CUBIT_FAILURE;
      90                 :            :   
      91         [ +  - ]:     103056 :   bridge->owner(0);
      92                 :     103056 :   return CUBIT_SUCCESS;
      93                 :            : }
      94                 :            : 
      95                 :     103001 : CubitStatus BridgeManager::bridge_destroyed( TopologyBridge* bridge )
      96                 :            : {
      97                 :            : //  if( firstBridge == bridge &&
      98                 :            : //      bridge->next_bridge() &&
      99                 :            : //      bridge->next_bridge()->bridge_sense() != bridge->bridge_sense() )
     100                 :            : //    topologyEntity->reverse_topology();
     101                 :            : 
     102                 :     103001 :   return remove_bridge( bridge );
     103                 :            : }
     104                 :            :   
     105                 :      98684 : CubitStatus BridgeManager::remove_all_bridges()
     106                 :            : {
     107 [ +  - ][ +  - ]:      98684 :   if (mergeList.empty())
     108                 :      98684 :     return CUBIT_SUCCESS;
     109                 :            : 
     110         [ #  # ]:          0 :   std::vector<TopologyBridge*>::iterator iter;
     111         [ #  # ]:          0 :   std::vector<TopologyBridge*> temp_list;
     112                 :            : 
     113                 :            :   // make a copy of the list so we can modify the real one
     114         [ #  # ]:          0 :   temp_list = mergeList;
     115                 :            : 
     116 [ #  # ][ #  # ]:          0 :   for (iter=temp_list.begin(); iter!=temp_list.end(); iter++)
         [ #  # ][ #  # ]
                 [ #  # ]
     117                 :            :   {
     118 [ #  # ][ #  # ]:          0 :     if (!remove_bridge( *iter ))
                 [ #  # ]
     119                 :          0 :       break;
     120                 :            :   }
     121                 :            : 
     122 [ #  # ][ #  # ]:      98684 :   return mergeList.empty() ? CUBIT_SUCCESS : CUBIT_FAILURE;
                 [ #  # ]
     123                 :            : }
     124                 :            : 
     125                 :            : // Transfer all bridges from 'dead' to 'this'.
     126                 :            : // Set correct pointers.
     127                 :       2604 : CubitStatus BridgeManager::merge(BridgeManager* dead_manager, 
     128                 :            :                                  CubitSense relative_sense )
     129                 :            : {
     130 [ +  - ][ +  + ]:       2604 :   if (dead_manager->mergeList.empty())
     131                 :       1188 :     return CUBIT_SUCCESS;
     132                 :            :   
     133                 :            :     // Remove bridge list from dead BridgeManager
     134         [ +  - ]:       1416 :   std::vector<TopologyBridge*> dead_list = dead_manager->mergeList;
     135         [ +  - ]:       1416 :   dead_manager->mergeList.clear();
     136                 :            : 
     137                 :            :     // Set owner and reverse sense if necessary
     138                 :            :     // for all bridges in merge list.
     139         [ +  - ]:       1416 :   std::vector<TopologyBridge*>::iterator iter;
     140 [ +  - ][ +  - ]:       2832 :   for (iter = dead_list.begin(); iter != dead_list.end(); iter++)
         [ +  - ][ +  - ]
                 [ +  + ]
     141                 :            :   {
     142 [ +  - ][ +  - ]:       1416 :     (*iter)->owner(this);
     143         [ +  + ]:       1416 :     if( relative_sense == CUBIT_REVERSED )
     144 [ +  - ][ +  - ]:         96 :       (*iter)->reverse_bridge_sense();
     145                 :            :   }
     146                 :            :   
     147                 :            :     // append merge list to end of this manager's bridge list
     148 [ +  - ][ +  - ]:       1416 :   mergeList.insert(mergeList.end(), dead_list.begin(), dead_list.end());
         [ +  - ][ +  - ]
     149                 :            :   
     150         [ +  - ]:       2604 :   return CUBIT_SUCCESS;
     151                 :            : }
     152                 :            : 
     153                 :            : // Indicates whether this bridge is in this manager.
     154                 :          0 : CubitBoolean BridgeManager::contains_bridge(TopologyBridge* bridge) const
     155                 :            : {
     156                 :          0 :   return bridge->owner() == (TBOwner*)this;
     157                 :            : }
     158                 :            : 
     159                 :            : // Appends all children TBs to bridge_list.
     160                 :            : // There is no check for duplicates in the list.
     161                 :            : // The number of TBs added is returned.
     162                 :     256493 : int BridgeManager::get_bridge_list(
     163                 :            :   DLIList<TopologyBridge*>& bridge_list) const
     164                 :            : {
     165         [ +  - ]:     256493 :   std::vector<TopologyBridge*>::const_iterator iter;
     166 [ +  - ][ +  - ]:     541150 :   for (iter = mergeList.begin(); iter != mergeList.end(); iter++)
         [ +  - ][ +  - ]
                 [ +  + ]
     167                 :            :   {
     168 [ +  - ][ +  - ]:     284657 :     bridge_list.append(*iter);
     169                 :            :   }
     170         [ +  - ]:     256493 :   return mergeList.size();
     171                 :            : }
     172                 :            : 
     173                 :            : 
     174                 :            : // Get all the child TB's that are owned by the passed
     175                 :            : // BridgeManager.
     176                 :          0 : int BridgeManager::get_bridge_list( 
     177                 :            :         DLIList<TopologyBridge*>& bridge_list,
     178                 :            :   GeometryQueryEngine* gqe_ptr ) const
     179                 :            : {
     180         [ #  # ]:          0 :   std::vector<TopologyBridge*>::const_iterator iter;
     181 [ #  # ][ #  # ]:          0 :   for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
         [ #  # ][ #  # ]
                 [ #  # ]
     182                 :            :   {
     183 [ #  # ][ #  # ]:          0 :     if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
                 [ #  # ]
     184 [ #  # ][ #  # ]:          0 :       bridge_list.append(*iter);
     185                 :            :   }
     186         [ #  # ]:          0 :   return bridge_list.size();
     187                 :            :   // TODO - BWH - return on this function should be consistent with other bridge list function
     188                 :            : }
     189                 :            : 
     190                 :        504 : TopologyBridge* BridgeManager::topology_bridge(
     191                 :            :   GeometryQueryEngine* gqe_ptr ) const
     192                 :            : {
     193         [ +  - ]:        504 :   std::vector<TopologyBridge*>::const_iterator iter;
     194 [ +  - ][ #  # ]:        504 :   for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
         [ +  - ][ +  - ]
                 [ +  - ]
     195                 :            :   {
     196 [ +  - ][ +  - ]:        504 :     if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
                 [ +  - ]
     197         [ +  - ]:        504 :       return *iter;
     198                 :            :   }
     199                 :            :   
     200                 :        504 :   return 0;
     201                 :            : }
     202                 :            : 
     203                 :            : 
     204                 :          0 : void BridgeManager::reverse_bridge_senses ()
     205                 :            : {
     206         [ #  # ]:          0 :   std::vector<TopologyBridge*>::iterator iter;
     207 [ #  # ][ #  # ]:          0 :   for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
         [ #  # ][ #  # ]
                 [ #  # ]
     208                 :            :   {
     209 [ #  # ][ #  # ]:          0 :     (*iter)->reverse_bridge_sense();
     210                 :            :   }
     211                 :          0 : }  
     212                 :            : 
     213                 :          0 : CubitStatus BridgeManager::swap_bridge( TopologyBridge* old_tb,
     214                 :            :                                         TopologyBridge* new_tb,
     215                 :            :                                         bool reversed )
     216                 :            : {
     217                 :            :     // make sure new_tb isn't already owned by someone else
     218 [ #  # ][ #  # ]:          0 :   if( new_tb->owner() != NULL )
     219                 :            :   {
     220 [ #  # ][ #  # ]:          0 :     assert( new_tb->owner() == 0 );
     221                 :          0 :     return CUBIT_FAILURE;
     222                 :            :   }
     223                 :            : 
     224                 :            :     // Replace old bridge with new bridge at same location
     225                 :            :     // in linked list.
     226                 :            : 
     227         [ #  # ]:          0 :   std::vector<TopologyBridge*>::iterator iter;
     228 [ #  # ][ #  # ]:          0 :   iter = std::find(mergeList.begin(), mergeList.end(), old_tb);
                 [ #  # ]
     229 [ #  # ][ #  # ]:          0 :   if (iter != mergeList.end())
                 [ #  # ]
     230                 :            :   {
     231         [ #  # ]:          0 :     iter = mergeList.erase(iter);
     232         [ #  # ]:          0 :     mergeList.insert(iter, new_tb);
     233                 :            :   }
     234                 :            :   else
     235                 :            :   {
     236                 :          0 :     assert(false);
     237                 :            :     return CUBIT_FAILURE;
     238                 :            :   }
     239                 :            :   
     240                 :            :     // Update owner pointers
     241                 :            :   
     242         [ #  # ]:          0 :   new_tb->owner(this);
     243         [ #  # ]:          0 :   old_tb->owner(0);
     244                 :            :   
     245                 :            :     // If 'reversed == true' then make sure bridges have
     246                 :            :     // opposite sense.
     247                 :            :   
     248 [ #  # ][ #  # ]:          0 :   bool same_sense = new_tb->bridge_sense() == old_tb->bridge_sense();
     249         [ #  # ]:          0 :   if (reversed == same_sense) // if (reversed XOR same_sense) 
     250         [ #  # ]:          0 :     new_tb->reverse_bridge_sense();
     251                 :            :     
     252                 :          0 :   return CUBIT_SUCCESS;
     253                 :            : }
     254                 :            : 
     255                 :     287793 : int BridgeManager::number_of_bridges() const
     256                 :            : {
     257                 :     287793 :   return mergeList.size();
     258                 :            : }
     259                 :            : 
     260                 :          0 : void BridgeManager::notify_reversed( TopologyBridge* bridge )
     261                 :            : {
     262                 :          0 :   bridge->reverse_bridge_sense();
     263                 :          0 : }

Generated by: LCOV version 1.11