LCOV - code coverage report
Current view: top level - src - MeshSetSequence.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 223 309 72.2 %
Date: 2020-12-16 07:07:30 Functions: 28 33 84.8 %
Branches: 197 488 40.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * MOAB, a Mesh-Oriented datABase, is a software component for creating,
       3                 :            :  * storing and accessing finite element mesh data.
       4                 :            :  *
       5                 :            :  * Copyright 2004 Sandia Corporation.  Under the terms of Contract
       6                 :            :  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
       7                 :            :  * retains certain rights in this software.
       8                 :            :  *
       9                 :            :  * This library is free software; you can redistribute it and/or
      10                 :            :  * modify it under the terms of the GNU Lesser General Public
      11                 :            :  * License as published by the Free Software Foundation; either
      12                 :            :  * version 2.1 of the License, or (at your option) any later version.
      13                 :            :  *
      14                 :            :  */
      15                 :            : 
      16                 :            : /**\file MeshSetSequence.cpp
      17                 :            :  *\author Jason Kraftcheck ([email protected])
      18                 :            :  *\date 2007-04-30
      19                 :            :  */
      20                 :            : 
      21                 :            : #include "MeshSetSequence.hpp"
      22                 :            : #include "SequenceManager.hpp"
      23                 :            : 
      24                 :            : namespace moab
      25                 :            : {
      26                 :            : 
      27                 :         23 : MeshSetSequence::MeshSetSequence( EntityHandle start, EntityID count, const unsigned* flags, SequenceData* dat )
      28                 :         23 :     : EntitySequence( start, count, dat )
      29                 :            : {
      30         [ +  - ]:         23 :     initialize( flags );
      31                 :         23 : }
      32                 :            : 
      33                 :          0 : MeshSetSequence::MeshSetSequence( EntityHandle start, EntityID count, unsigned flags, SequenceData* dat )
      34                 :          0 :     : EntitySequence( start, count, dat )
      35                 :            : {
      36         [ #  # ]:          0 :     std::vector< unsigned > vect( count, flags );
      37 [ #  # ][ #  # ]:          0 :     initialize( &vect[0] );
      38                 :          0 : }
      39                 :            : 
      40                 :         44 : MeshSetSequence::MeshSetSequence( EntityHandle start, EntityID count, const unsigned* flags, EntityID data_size )
      41         [ +  - ]:         44 :     : EntitySequence( start, count, new SequenceData( 1, start, start + data_size - 1 ) )
      42                 :            : {
      43         [ +  - ]:         44 :     initialize( flags );
      44                 :         44 : }
      45                 :            : 
      46                 :        286 : MeshSetSequence::MeshSetSequence( EntityHandle start, EntityID count, unsigned flags, EntityID data_size )
      47         [ +  - ]:        286 :     : EntitySequence( start, count, new SequenceData( 1, start, start + data_size - 1 ) )
      48                 :            : {
      49         [ +  - ]:        286 :     std::vector< unsigned > vect( count, flags );
      50 [ +  - ][ +  - ]:        286 :     initialize( &vect[0] );
      51                 :        286 : }
      52                 :            : 
      53                 :        353 : void MeshSetSequence::initialize( const unsigned* flags )
      54                 :            : {
      55         [ +  + ]:        353 :     if( !data()->get_sequence_data( 0 ) ) data()->create_sequence_data( 0, SET_SIZE );
      56                 :            : 
      57                 :        353 :     EntityID offset = start_handle() - data()->start_handle();
      58         [ +  + ]:       2060 :     for( EntityID i = 0; i < size(); ++i )
      59                 :       1707 :         allocate_set( flags[i], i + offset );
      60                 :        353 : }
      61                 :            : 
      62                 :      21585 : MeshSetSequence::~MeshSetSequence()
      63                 :            : {
      64                 :       7195 :     EntityID offset = start_handle() - data()->start_handle();
      65                 :       7195 :     EntityID count  = size();
      66         [ +  + ]:      16888 :     for( EntityID i = 0; i < count; ++i )
      67                 :       9693 :         deallocate_set( i + offset );
      68         [ -  + ]:      14390 : }
      69                 :            : 
      70                 :       6846 : EntitySequence* MeshSetSequence::split( EntityHandle here )
      71                 :            : {
      72         [ +  - ]:       6846 :     return new MeshSetSequence( *this, here );
      73                 :            : }
      74                 :            : 
      75                 :       3900 : ErrorCode MeshSetSequence::pop_back( EntityID count )
      76                 :            : {
      77                 :       3900 :     EntityID offset = end_handle() + 1 - count - data()->start_handle();
      78                 :       3900 :     ErrorCode rval  = EntitySequence::pop_back( count );
      79         [ +  - ]:       3900 :     if( MB_SUCCESS == rval )
      80         [ +  + ]:       7804 :         for( EntityID i = 0; i < count; ++i )
      81                 :       3904 :             deallocate_set( i + offset );
      82                 :       3900 :     return rval;
      83                 :            : }
      84                 :            : 
      85                 :      18814 : ErrorCode MeshSetSequence::pop_front( EntityID count )
      86                 :            : {
      87                 :      18814 :     EntityID offset = start_handle() - data()->start_handle();
      88                 :      18814 :     ErrorCode rval  = EntitySequence::pop_front( count );
      89         [ +  - ]:      18814 :     if( MB_SUCCESS == rval )
      90         [ +  + ]:      37628 :         for( EntityID i = 0; i < count; ++i )
      91                 :      18814 :             deallocate_set( i + offset );
      92                 :      18814 :     return rval;
      93                 :            : }
      94                 :            : 
      95                 :      30890 : ErrorCode MeshSetSequence::push_back( EntityID count, const unsigned* flags )
      96                 :            : {
      97                 :      30890 :     EntityID offset = end_handle() + 1 - data()->start_handle();
      98                 :      30890 :     ErrorCode rval  = EntitySequence::append_entities( count );
      99         [ +  - ]:      30890 :     if( MB_SUCCESS == rval )
     100         [ +  + ]:      61780 :         for( EntityID i = 0; i < count; ++i )
     101                 :      30890 :             allocate_set( flags[i], i + offset );
     102                 :      30890 :     return rval;
     103                 :            : }
     104                 :            : 
     105                 :          0 : ErrorCode MeshSetSequence::push_front( EntityID count, const unsigned* flags )
     106                 :            : {
     107                 :          0 :     EntityID offset = start_handle() - data()->start_handle() - count;
     108                 :          0 :     ErrorCode rval  = EntitySequence::prepend_entities( count );
     109         [ #  # ]:          0 :     if( MB_SUCCESS == rval )
     110         [ #  # ]:          0 :         for( EntityID i = 0; i < count; ++i )
     111                 :          0 :             allocate_set( flags[i], i + offset );
     112                 :          0 :     return rval;
     113                 :            : }
     114                 :            : 
     115                 :          0 : void MeshSetSequence::get_const_memory_use( unsigned long& per_ent, unsigned long& seq_size ) const
     116                 :            : {
     117                 :          0 :     per_ent  = SET_SIZE;
     118                 :          0 :     seq_size = sizeof( *this );
     119                 :          0 : }
     120                 :            : 
     121                 :          0 : unsigned long MeshSetSequence::get_per_entity_memory_use( EntityHandle first, EntityHandle last ) const
     122                 :            : {
     123         [ #  # ]:          0 :     if( first < start_handle() ) first = start_handle();
     124         [ #  # ]:          0 :     if( last > end_handle() ) last = end_handle();
     125                 :            : 
     126                 :          0 :     unsigned long sum = 0;
     127         [ #  # ]:          0 :     for( EntityHandle h = first; h <= last; ++h )
     128                 :          0 :         sum += get_set( h )->get_memory_use();
     129                 :          0 :     return sum;
     130                 :            : }
     131                 :            : 
     132                 :      15453 : ErrorCode MeshSetSequence::get_entities( const SequenceManager* seqman, EntityHandle handle, Range& entities,
     133                 :            :                                          bool recursive ) const
     134                 :            : {
     135         [ +  + ]:      15453 :     if( !recursive )
     136                 :            :     {
     137                 :      11210 :         get_set( handle )->get_entities( entities );
     138                 :      11210 :         return MB_SUCCESS;
     139                 :            :     }
     140                 :            :     else
     141                 :            :     {
     142         [ +  - ]:       4243 :         std::vector< const MeshSet* > list;
     143         [ +  - ]:       4243 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     144 [ +  - ][ +  - ]:       8591 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ +  + ]
     145 [ +  - ][ +  - ]:       4348 :             ( *i )->get_non_set_entities( entities );
     146                 :      15453 :         return rval;
     147                 :            :     }
     148                 :            : }
     149                 :            : 
     150                 :       3984 : ErrorCode MeshSetSequence::get_entities( EntityHandle handle, std::vector< EntityHandle >& entities ) const
     151                 :            : {
     152                 :       3984 :     get_set( handle )->get_entities( entities );
     153                 :       3984 :     return MB_SUCCESS;
     154                 :            : }
     155                 :            : 
     156                 :         66 : ErrorCode MeshSetSequence::get_dimension( const SequenceManager* seqman, EntityHandle handle, int dimension,
     157                 :            :                                           std::vector< EntityHandle >& entities, bool recursive ) const
     158                 :            : {
     159         [ +  - ]:         66 :     if( !recursive )
     160                 :            :     {
     161                 :         66 :         get_set( handle )->get_entities_by_dimension( dimension, entities );
     162                 :         66 :         return MB_SUCCESS;
     163                 :            :     }
     164                 :            :     else
     165                 :            :     {
     166         [ #  # ]:          0 :         std::vector< const MeshSet* > list;
     167         [ #  # ]:          0 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     168 [ #  # ][ #  # ]:          0 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ #  # ]
     169 [ #  # ][ #  # ]:          0 :             ( *i )->get_entities_by_dimension( dimension, entities );
     170                 :         66 :         return rval;
     171                 :            :     }
     172                 :            : }
     173                 :            : 
     174                 :      17574 : ErrorCode MeshSetSequence::get_dimension( const SequenceManager* seqman, EntityHandle handle, int dimension,
     175                 :            :                                           Range& entities, bool recursive ) const
     176                 :            : {
     177         [ +  + ]:      17574 :     if( !recursive )
     178                 :            :     {
     179                 :      15046 :         get_set( handle )->get_entities_by_dimension( dimension, entities );
     180                 :      15046 :         return MB_SUCCESS;
     181                 :            :     }
     182                 :            :     else
     183                 :            :     {
     184         [ +  - ]:       2528 :         std::vector< const MeshSet* > list;
     185         [ +  - ]:       2528 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     186 [ +  - ][ +  - ]:       7464 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ +  + ]
     187 [ +  - ][ +  - ]:       4936 :             ( *i )->get_entities_by_dimension( dimension, entities );
     188                 :      17574 :         return rval;
     189                 :            :     }
     190                 :            : }
     191                 :            : 
     192                 :        324 : ErrorCode MeshSetSequence::get_type( const SequenceManager* seqman, EntityHandle handle, EntityType tp,
     193                 :            :                                      std::vector< EntityHandle >& entities, bool recursive ) const
     194                 :            : {
     195         [ +  + ]:        324 :     if( !recursive )
     196                 :            :     {
     197                 :        323 :         get_set( handle )->get_entities_by_type( tp, entities );
     198                 :        323 :         return MB_SUCCESS;
     199                 :            :     }
     200         [ -  + ]:          1 :     else if( tp == MBENTITYSET )
     201                 :            :     {
     202                 :          0 :         return recursive_get_sets( handle, seqman, 0, 0, &entities );
     203                 :            :     }
     204         [ +  - ]:          1 :     else if( tp == MBMAXTYPE )
     205                 :            :     {
     206         [ +  - ]:          1 :         Range tmp;
     207         [ +  - ]:          1 :         ErrorCode rval = get_entities( seqman, handle, tmp, recursive );
     208         [ +  - ]:          1 :         if( MB_SUCCESS == rval )
     209                 :            :         {
     210                 :            : #ifdef MOAB_NO_VECTOR_TEMPLATE_INSERT
     211                 :            :             std::copy( tmp.begin(), tmp.end(), std::back_inserter( entities ) );
     212                 :            : #else
     213 [ +  - ][ +  - ]:          1 :             entities.insert( entities.end(), tmp.begin(), tmp.end() );
                 [ +  - ]
     214                 :            : #endif
     215                 :            :         }
     216                 :          1 :         return rval;
     217                 :            :     }
     218                 :            :     else
     219                 :            :     {
     220         [ #  # ]:          0 :         std::vector< const MeshSet* > list;
     221         [ #  # ]:          0 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     222 [ #  # ][ #  # ]:          0 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ #  # ]
     223 [ #  # ][ #  # ]:          0 :             ( *i )->get_entities_by_type( tp, entities );
     224                 :        324 :         return rval;
     225                 :            :     }
     226                 :            : }
     227                 :            : 
     228                 :      22198 : ErrorCode MeshSetSequence::get_type( const SequenceManager* seqman, EntityHandle handle, EntityType tp, Range& entities,
     229                 :            :                                      bool recursive ) const
     230                 :            : {
     231         [ +  + ]:      22198 :     if( !recursive )
     232                 :            :     {
     233                 :      22088 :         get_set( handle )->get_entities_by_type( tp, entities );
     234                 :      22088 :         return MB_SUCCESS;
     235                 :            :     }
     236         [ -  + ]:        110 :     else if( tp == MBENTITYSET )
     237                 :            :     {
     238                 :          0 :         return recursive_get_sets( handle, seqman, 0, &entities );
     239                 :            :     }
     240         [ +  + ]:        110 :     else if( tp == MBMAXTYPE )
     241                 :            :     {
     242         [ +  - ]:         12 :         std::vector< const MeshSet* > list;
     243         [ +  - ]:         12 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     244 [ +  - ][ +  - ]:         36 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ +  + ]
     245 [ +  - ][ +  - ]:         24 :             ( *i )->get_non_set_entities( entities );
     246                 :         12 :         return rval;
     247                 :            :     }
     248                 :            :     else
     249                 :            :     {
     250         [ +  - ]:         98 :         std::vector< const MeshSet* > list;
     251         [ +  - ]:         98 :         ErrorCode rval = recursive_get_sets( handle, seqman, &list );
     252 [ +  - ][ +  - ]:        691 :         for( std::vector< const MeshSet* >::iterator i = list.begin(); i != list.end(); ++i )
                 [ +  + ]
     253 [ +  - ][ +  - ]:        593 :             ( *i )->get_entities_by_type( tp, entities );
     254                 :      22198 :         return rval;
     255                 :            :     }
     256                 :            : }
     257                 :            : 
     258                 :       7963 : ErrorCode MeshSetSequence::num_entities( const SequenceManager* seqman, EntityHandle handle, int& number,
     259                 :            :                                          bool recursive ) const
     260                 :            : {
     261         [ +  + ]:       7963 :     if( !recursive )
     262                 :            :     {
     263                 :       7962 :         number = get_set( handle )->num_entities();
     264                 :       7962 :         return MB_SUCCESS;
     265                 :            :     }
     266                 :            :     else
     267                 :            :     {
     268         [ +  - ]:          1 :         Range range;
     269         [ +  - ]:          1 :         ErrorCode result = get_entities( seqman, handle, range, true );
     270         [ +  - ]:          1 :         number           = range.size();
     271                 :       7963 :         return result;
     272                 :            :     }
     273                 :            : }
     274                 :            : 
     275                 :         78 : ErrorCode MeshSetSequence::num_dimension( const SequenceManager* seqman, EntityHandle handle, int dimension,
     276                 :            :                                           int& number, bool recursive ) const
     277                 :            : {
     278         [ +  + ]:         78 :     if( !recursive )
     279                 :            :     {
     280                 :         72 :         number = get_set( handle )->num_entities_by_dimension( dimension );
     281                 :         72 :         return MB_SUCCESS;
     282                 :            :     }
     283                 :            :     else
     284                 :            :     {
     285         [ +  - ]:          6 :         Range range;
     286         [ +  - ]:          6 :         ErrorCode result = get_dimension( seqman, handle, dimension, range, true );
     287         [ +  - ]:          6 :         number           = range.size();
     288                 :         78 :         return result;
     289                 :            :     }
     290                 :            : }
     291                 :            : 
     292                 :         91 : ErrorCode MeshSetSequence::num_type( const SequenceManager* seqman, EntityHandle handle, EntityType tp, int& number,
     293                 :            :                                      bool recursive ) const
     294                 :            : {
     295         [ +  + ]:         91 :     if( !recursive )
     296                 :            :     {
     297                 :         70 :         number = get_set( handle )->num_entities_by_type( tp );
     298                 :         70 :         return MB_SUCCESS;
     299                 :            :     }
     300                 :            :     else
     301                 :            :     {
     302         [ +  - ]:         21 :         Range range;
     303         [ +  - ]:         21 :         ErrorCode result = get_type( seqman, handle, tp, range, true );
     304         [ +  - ]:         21 :         number           = range.size();
     305                 :         91 :         return result;
     306                 :            :     }
     307                 :            : }
     308                 :            : 
     309                 :       6881 : ErrorCode MeshSetSequence::recursive_get_sets( EntityHandle start_set, const SequenceManager* seq_sets,
     310                 :            :                                                std::vector< const MeshSet* >* sets, Range* set_handles,
     311                 :            :                                                std::vector< EntityHandle >* set_vector )
     312                 :            : {
     313         [ +  - ]:       6881 :     std::set< EntityHandle > visited;
     314         [ +  - ]:      13762 :     std::vector< EntityHandle > stack;
     315         [ +  - ]:       6881 :     stack.push_back( start_set );
     316                 :       6881 :     bool remove_start_set = true;
     317         [ +  + ]:      16803 :     while( !stack.empty() )
     318                 :            :     {
     319         [ +  - ]:       9922 :         EntityHandle handle = stack.back();
     320         [ +  - ]:       9922 :         stack.pop_back();
     321                 :            : 
     322 [ +  - ][ +  + ]:       9922 :         if( !visited.insert( handle ).second )
     323                 :            :         {
     324         [ +  + ]:         21 :             if( handle == start_set ) remove_start_set = false;
     325                 :         21 :             continue;
     326                 :            :         }
     327                 :            : 
     328                 :            :         const EntitySequence* seq;
     329         [ +  - ]:       9901 :         ErrorCode rval = seq_sets->find( handle, seq );
     330         [ -  + ]:       9901 :         if( MB_SUCCESS != rval ) return rval;
     331                 :            : 
     332                 :       9901 :         const MeshSetSequence* mseq = reinterpret_cast< const MeshSetSequence* >( seq );
     333         [ +  - ]:       9901 :         const MeshSet* ms_ptr       = mseq->get_set( handle );
     334 [ +  - ][ +  - ]:       9901 :         if( sets ) sets->push_back( ms_ptr );
     335                 :            : 
     336         [ +  - ]:       9901 :         Range tmp_range;
     337         [ +  - ]:       9901 :         ms_ptr->get_entities_by_type( MBENTITYSET, tmp_range );
     338 [ +  - ][ +  - ]:       9901 :         std::copy( tmp_range.begin(), tmp_range.end(), std::back_inserter( stack ) );
         [ +  - ][ +  - ]
     339                 :       9901 :     }
     340                 :            : 
     341         [ -  + ]:       6881 :     if( set_handles )
     342                 :            :     {
     343 [ #  # ][ #  # ]:          0 :         if( remove_start_set ) visited.erase( start_set );
     344         [ #  # ]:          0 :         Range::iterator hint = set_handles->begin();
     345         [ #  # ]:          0 :         std::set< EntityHandle >::iterator it;
     346 [ #  # ][ #  # ]:          0 :         for( it = visited.begin(); it != visited.end(); ++it )
                 [ #  # ]
     347 [ #  # ][ #  # ]:          0 :             hint = set_handles->insert( hint, *it, *it );
                 [ #  # ]
     348                 :            :     }
     349                 :            : 
     350         [ -  + ]:       6881 :     if( set_vector )
     351                 :            :     {
     352 [ #  # ][ #  # ]:          0 :         if( remove_start_set ) visited.erase( start_set );
     353 [ #  # ][ #  # ]:          0 :         std::copy( visited.begin(), visited.end(), std::back_inserter( *set_vector ) );
     354                 :            :     }
     355                 :            : 
     356                 :      13762 :     return MB_SUCCESS;
     357                 :            : }
     358                 :            : 
     359                 :          0 : ErrorCode MeshSetSequence::recursive_get_sets( EntityHandle start_set, SequenceManager* seq_sets,
     360                 :            :                                                std::vector< MeshSet* >& sets )
     361                 :            : {
     362         [ #  # ]:          0 :     std::set< EntityHandle > visited;
     363         [ #  # ]:          0 :     std::vector< EntityHandle > stack;
     364         [ #  # ]:          0 :     stack.push_back( start_set );
     365         [ #  # ]:          0 :     while( !stack.empty() )
     366                 :            :     {
     367         [ #  # ]:          0 :         EntityHandle handle = stack.back();
     368         [ #  # ]:          0 :         stack.pop_back();
     369                 :            : 
     370 [ #  # ][ #  # ]:          0 :         if( !visited.insert( handle ).second ) continue;
     371                 :            : 
     372                 :            :         EntitySequence* seq;
     373         [ #  # ]:          0 :         ErrorCode rval = seq_sets->find( handle, seq );
     374         [ #  # ]:          0 :         if( MB_SUCCESS != rval ) return rval;
     375                 :            : 
     376                 :          0 :         MeshSetSequence* mseq = reinterpret_cast< MeshSetSequence* >( seq );
     377         [ #  # ]:          0 :         MeshSet* ms_ptr       = mseq->get_set( handle );
     378         [ #  # ]:          0 :         sets.push_back( ms_ptr );
     379                 :            : 
     380         [ #  # ]:          0 :         Range tmp_range;
     381         [ #  # ]:          0 :         ms_ptr->get_entities_by_type( MBENTITYSET, tmp_range );
     382 [ #  # ][ #  # ]:          0 :         std::copy( tmp_range.begin(), tmp_range.end(), std::back_inserter( stack ) );
         [ #  # ][ #  # ]
     383                 :          0 :     }
     384                 :            : 
     385                 :          0 :     return MB_SUCCESS;
     386                 :            : }
     387                 :            : 
     388                 :        353 : ErrorCode MeshSetSequence::get_parent_child_meshsets( EntityHandle meshset, const SequenceManager* seq_sets,
     389                 :            :                                                       std::vector< EntityHandle >& results, int num_hops,
     390                 :            :                                                       SearchType link_type ) const
     391                 :            : {
     392                 :        353 :     ErrorCode result = MB_SUCCESS;
     393                 :        353 :     std::vector< EntityHandle >::iterator i;
     394                 :        353 :     const EntityHandle *tmp_array = 0, *end;
     395                 :            :     EntityHandle s, e;
     396                 :        353 :     int count = 0;
     397                 :            :     size_t n;
     398                 :            : 
     399                 :            :     // Skip any meshsets already in input vector (yes, don't
     400                 :            :     // get their children either even if num_hops would indicate
     401                 :            :     // that we should.)  There is an exception to that if the
     402                 :            :     // input meshset is in the list, which is handled by the order
     403                 :            :     // of checks in the main loop below.
     404         [ +  - ]:        353 :     std::set< EntityHandle > visited;
     405 [ +  - ][ +  - ]:        364 :     for( i = results.begin(); i != results.end(); ++i )
           [ +  +  #  # ]
     406 [ +  - ][ +  - ]:         11 :         visited.insert( *i );
     407                 :            : 
     408                 :            :     // Two lists for breadth-first search
     409 [ +  - ][ +  + ]:       2118 :     std::vector< EntityHandle > lists[2];
                 [ +  + ]
           [ #  #  #  # ]
     410                 :        353 :     int index = 0;                      // which list to read from (write to lists[1-index])
     411         [ +  - ]:        353 :     lists[index].push_back( meshset );  // begin with input set
     412                 :            :                                         // loop for num_hops (or until no more sets)
     413 [ +  + ][ +  + ]:       1090 :     for( ; num_hops && !lists[index].empty(); --num_hops )
                 [ +  + ]
     414                 :            :     {
     415                 :            :         // for each set at the current num_hops
     416 [ +  - ][ +  - ]:      23100 :         for( i = lists[index].begin(); i != lists[index].end(); ++i )
                 [ +  + ]
     417                 :            :         {
     418                 :            :             // get meshset from handle
     419                 :            :             const EntitySequence* seq;
     420 [ +  - ][ +  - ]:      22363 :             ErrorCode rval = seq_sets->find( *i, seq );
     421         [ +  + ]:      22363 :             if( MB_SUCCESS != rval ) return rval;
     422 [ +  - ][ +  - ]:      22345 :             const MeshSet* ms_ptr = reinterpret_cast< const MeshSetSequence* >( seq )->get_set( *i );
     423                 :            : 
     424   [ -  +  +  - ]:      22345 :             switch( link_type )
     425                 :            :             {
     426                 :            :                 case CONTAINED:
     427         [ #  # ]:          0 :                     tmp_array = ms_ptr->get_contents( n );
     428                 :          0 :                     end       = tmp_array + n;
     429 [ #  # ][ #  # ]:          0 :                     if( ms_ptr->vector_based() )
     430                 :            :                     {
     431         [ #  # ]:          0 :                         for( ; tmp_array != end; ++tmp_array )
     432 [ #  # ][ #  # ]:          0 :                             if( MBENTITYSET == TYPE_FROM_HANDLE( *tmp_array ) && visited.insert( *tmp_array ).second )
         [ #  # ][ #  # ]
                 [ #  # ]
     433         [ #  # ]:          0 :                                 lists[1 - index].push_back( *tmp_array );
     434                 :            :                     }
     435                 :            :                     else
     436                 :            :                     {
     437         [ #  # ]:          0 :                         assert( n % 2 == 0 );
     438 [ #  # ][ #  # ]:          0 :                         tmp_array = std::lower_bound( tmp_array, tmp_array + n, FIRST_HANDLE( MBENTITYSET ) );
     439                 :            :                         // only part of first block is of type
     440         [ #  # ]:          0 :                         if( ( end - tmp_array ) % 2 )
     441                 :            :                         {
     442                 :          0 :                             ++tmp_array;
     443         [ #  # ]:          0 :                             s = FIRST_HANDLE( MBENTITYSET );
     444                 :          0 :                             e = *tmp_array;
     445         [ #  # ]:          0 :                             for( ; s <= e; ++s )
     446 [ #  # ][ #  # ]:          0 :                                 if( visited.insert( s ).second ) lists[1 - index].push_back( s );
                 [ #  # ]
     447                 :            :                         }
     448         [ #  # ]:          0 :                         while( tmp_array < end )
     449                 :            :                         {
     450                 :          0 :                             s = *tmp_array++;
     451                 :          0 :                             e = *tmp_array++;
     452         [ #  # ]:          0 :                             for( ; s <= e; ++s )
     453 [ #  # ][ #  # ]:          0 :                                 if( visited.insert( s ).second ) lists[1 - index].push_back( s );
                 [ #  # ]
     454                 :            :                         }
     455                 :            :                     }
     456                 :          0 :                     continue;
     457                 :            :                 case PARENTS:
     458         [ +  - ]:        195 :                     tmp_array = ms_ptr->get_parents( count );
     459                 :        195 :                     break;
     460                 :            :                 case CHILDREN:
     461         [ +  - ]:      22150 :                     tmp_array = ms_ptr->get_children( count );
     462                 :      22150 :                     break;
     463                 :            :             }
     464                 :            : 
     465                 :            :             // copy any parents/children we haven't visited yet into list
     466         [ +  + ]:      44596 :             for( end = tmp_array + count; tmp_array != end; ++tmp_array )
     467 [ +  - ][ +  + ]:      22251 :                 if( visited.insert( *tmp_array ).second ) lists[1 - index].push_back( *tmp_array );
                 [ +  - ]
     468                 :            :         }
     469                 :            : 
     470                 :            :         // iterate
     471                 :        737 :         lists[index].clear();
     472                 :        737 :         index = 1 - index;
     473                 :            :         // append each level of sets to the output list.
     474                 :            :         // note: to make a more useful search (e.g. get entities 3 hops away,
     475                 :            :         // rather than entities up to and including 3 hops) move this outside
     476                 :            :         // the loop, but then need to handle the get all (num_hops < 0) case
     477                 :            :         // specially.
     478 [ +  - ][ +  - ]:        737 :         std::copy( lists[index].begin(), lists[index].end(), std::back_inserter( results ) );
     479                 :            :     }
     480                 :            : 
     481                 :        688 :     return result;
     482                 :            : }
     483                 :            : 
     484                 :        466 : ErrorCode MeshSetSequence::get_parents( const SequenceManager* seqman, EntityHandle handle,
     485                 :            :                                         std::vector< EntityHandle >& parents, int num_hops ) const
     486                 :            : {
     487         [ +  + ]:        466 :     if( num_hops == 1 )
     488                 :            :     {
     489                 :            :         int count;
     490 [ +  - ][ +  - ]:        377 :         const EntityHandle* tmp_array = get_set( handle )->get_parents( count );
     491         [ +  + ]:        377 :         if( parents.empty() )
     492                 :            :         {
     493         [ +  - ]:        373 :             parents.resize( count );
     494         [ +  - ]:        373 :             std::copy( tmp_array, tmp_array + count, parents.begin() );
     495                 :        373 :             return MB_SUCCESS;
     496                 :            :         }
     497         [ -  + ]:          4 :         else if( !count )
     498                 :            :         {
     499                 :          4 :             return MB_SUCCESS;
     500                 :            :         }
     501                 :            :     }
     502                 :            : 
     503         [ +  + ]:         93 :     if( num_hops > 0 )
     504                 :         34 :         return get_parent_child_meshsets( handle, seqman, parents, num_hops, PARENTS );
     505                 :            :     else
     506                 :        466 :         return get_parent_child_meshsets( handle, seqman, parents, -1, PARENTS );
     507                 :            : }
     508                 :            : 
     509                 :     195629 : ErrorCode MeshSetSequence::get_children( const SequenceManager* seqman, EntityHandle handle,
     510                 :            :                                          std::vector< EntityHandle >& children, int num_hops ) const
     511                 :            : {
     512         [ +  + ]:     195629 :     if( num_hops == 1 )
     513                 :            :     {
     514                 :            :         int count;
     515 [ +  - ][ +  - ]:     195369 :         const EntityHandle* tmp_array = get_set( handle )->get_children( count );
     516         [ +  - ]:     195369 :         if( children.empty() )
     517                 :            :         {
     518         [ +  - ]:     195369 :             children.resize( count );
     519         [ +  - ]:     195369 :             std::copy( tmp_array, tmp_array + count, children.begin() );
     520                 :     195369 :             return MB_SUCCESS;
     521                 :            :         }
     522         [ #  # ]:          0 :         else if( !count )
     523                 :            :         {
     524                 :          0 :             return MB_SUCCESS;
     525                 :            :         }
     526                 :            :     }
     527                 :            : 
     528         [ +  + ]:        260 :     if( num_hops > 0 )
     529                 :         12 :         return get_parent_child_meshsets( handle, seqman, children, num_hops, CHILDREN );
     530                 :            :     else
     531                 :     195629 :         return get_parent_child_meshsets( handle, seqman, children, -1, CHILDREN );
     532                 :            : }
     533                 :            : 
     534                 :          2 : ErrorCode MeshSetSequence::get_contained_sets( const SequenceManager* seqman, EntityHandle handle,
     535                 :            :                                                std::vector< EntityHandle >& contained, int num_hops ) const
     536                 :            : {
     537 [ +  - ][ +  - ]:          2 :     if( num_hops == 1 && contained.empty() )
                 [ +  - ]
     538                 :          2 :     { return get_set( handle )->get_entities_by_type( MBENTITYSET, contained ); }
     539                 :            : 
     540         [ #  # ]:          0 :     if( num_hops > 0 )
     541                 :          0 :         return get_parent_child_meshsets( handle, seqman, contained, num_hops, CONTAINED );
     542                 :            :     else
     543                 :          0 :         return get_parent_child_meshsets( handle, seqman, contained, -1, CONTAINED );
     544                 :            : }
     545                 :            : 
     546                 :        976 : ErrorCode MeshSetSequence::num_parents( const SequenceManager* seqman, EntityHandle handle, int& number,
     547                 :            :                                         int num_hops ) const
     548                 :            : {
     549         [ +  + ]:        976 :     if( num_hops == 1 )
     550                 :            :     {
     551 [ +  - ][ +  - ]:        972 :         number = get_set( handle )->num_parents();
     552                 :        972 :         return MB_SUCCESS;
     553                 :            :     }
     554                 :            : 
     555         [ +  - ]:          4 :     std::vector< EntityHandle > parents;
     556         [ +  - ]:          4 :     ErrorCode result = get_parents( seqman, handle, parents, num_hops );
     557                 :          4 :     number           = parents.size();
     558                 :        976 :     return result;
     559                 :            : }
     560                 :            : 
     561                 :       1064 : ErrorCode MeshSetSequence::num_children( const SequenceManager* seqman, EntityHandle handle, int& number,
     562                 :            :                                          int num_hops ) const
     563                 :            : {
     564         [ +  + ]:       1064 :     if( num_hops == 1 )
     565                 :            :     {
     566 [ +  - ][ +  - ]:       1060 :         number = get_set( handle )->num_children();
     567                 :       1060 :         return MB_SUCCESS;
     568                 :            :     }
     569                 :            : 
     570         [ +  - ]:          4 :     std::vector< EntityHandle > children;
     571         [ +  - ]:          4 :     ErrorCode result = get_children( seqman, handle, children, num_hops );
     572                 :          4 :     number           = children.size();
     573                 :       1064 :     return result;
     574                 :            : }
     575                 :            : 
     576                 :          3 : ErrorCode MeshSetSequence::num_contained_sets( const SequenceManager* seqman, EntityHandle handle, int& number,
     577                 :            :                                                int num_hops ) const
     578                 :            : {
     579         [ +  - ]:          3 :     if( num_hops == 1 )
     580                 :            :     {
     581 [ +  - ][ +  - ]:          3 :         number = get_set( handle )->num_entities_by_type( MBENTITYSET );
     582                 :          3 :         return MB_SUCCESS;
     583                 :            :     }
     584                 :            : 
     585         [ #  # ]:          0 :     std::vector< EntityHandle > contained;
     586         [ #  # ]:          0 :     ErrorCode result = get_contained_sets( seqman, handle, contained, num_hops );
     587                 :          0 :     number           = contained.size();
     588                 :          3 :     return result;
     589                 :            : }
     590                 :            : 
     591 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11