LCOV - code coverage report
Current view: top level - src - SetIterator.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 115 149 77.2 %
Date: 2020-12-16 07:07:30 Functions: 9 12 75.0 %
Branches: 146 292 50.0 %

           Branch data     Line data    Source code
       1                 :            : #ifndef IS_BUILDING_MB
       2                 :            : #error "SetIterator.hpp isn't supposed to be included into an application"
       3                 :            : #endif
       4                 :            : 
       5                 :            : #include "moab/SetIterator.hpp"
       6                 :            : #include "moab/Core.hpp"
       7                 :            : #include "moab/WriteUtilIface.hpp"
       8                 :            : #include "MeshSet.hpp"
       9                 :            : #include "Internals.hpp"
      10                 :            : #include "moab/CN.hpp"
      11                 :            : #include "moab/Error.hpp"
      12                 :            : 
      13                 :            : namespace moab
      14                 :            : {
      15                 :            : 
      16                 :         48 : SetIterator::~SetIterator()
      17                 :            : {
      18                 :         48 :     myCore->remove_set_iterator( this );
      19         [ -  + ]:         48 : }
      20                 :            : 
      21                 :         24 : RangeSetIterator::RangeSetIterator( Core* core, EntityHandle eset, int chunk_sz, EntityType ent_tp, int ent_dim,
      22                 :            :                                     bool check_valid )
      23                 :         24 :     : SetIterator( core, eset, chunk_sz, ent_tp, ent_dim, check_valid ), iterPos( 0 ), pairPtr( NULL ), numPairs( 0 )
      24                 :            : {
      25         [ -  + ]:         24 :     if( !eset )
      26                 :            :     {
      27                 :            :         // special case for the root set, have to keep a local array
      28         [ #  # ]:          0 :         ErrorCode rval = build_pair_vec();
      29         [ #  # ]:          0 :         assert( MB_SUCCESS == rval );
      30                 :            : 
      31                 :            :         // empty statement to avoid warning
      32                 :            :         (void)( rval );
      33                 :            :     }
      34                 :         24 : }
      35                 :            : 
      36                 :         72 : RangeSetIterator::~RangeSetIterator()
      37                 :            : {
      38 [ -  + ][ #  # ]:         24 :     if( pairPtr ) delete[] pairPtr;
      39                 :         24 :     numPairs = 0;
      40         [ -  + ]:         48 : }
      41                 :            : 
      42                 :          0 : ErrorCode RangeSetIterator::build_pair_vec()
      43                 :            : {
      44                 :            :     // shouldn't be here unless we're iterating the root set
      45         [ #  # ]:          0 :     assert( !entSet );
      46                 :            : 
      47         [ #  # ]:          0 :     Range all_ents;
      48         [ #  # ]:          0 :     ErrorCode rval = myCore->get_entities_by_handle( 0, all_ents );
      49         [ #  # ]:          0 :     if( MB_SUCCESS != rval ) return rval;
      50                 :            : 
      51 [ #  # ][ #  # ]:          0 :     if( pairPtr ) delete[] pairPtr;
      52 [ #  # ][ #  # ]:          0 :     pairPtr = new EntityHandle[2 * all_ents.psize()];
                 [ #  # ]
      53         [ #  # ]:          0 :     Range::const_pair_iterator pi;
      54                 :            :     int i;
      55 [ #  # ][ #  # ]:          0 :     for( pi = all_ents.const_pair_begin(), i = 0; pi != all_ents.const_pair_end(); ++pi, i += 2 )
         [ #  # ][ #  # ]
                 [ #  # ]
      56                 :            :     {
      57         [ #  # ]:          0 :         pairPtr[i]     = ( *pi ).first;
      58         [ #  # ]:          0 :         pairPtr[i + 1] = ( *pi ).second;
      59                 :            :     }
      60         [ #  # ]:          0 :     numPairs = all_ents.psize();
      61                 :            : 
      62                 :          0 :     return MB_SUCCESS;
      63                 :            : }
      64                 :            : 
      65                 :        375 : ErrorCode RangeSetIterator::get_next_arr( std::vector< EntityHandle >& arr, bool& atend )
      66                 :            : {
      67                 :        375 :     atend = false;
      68                 :            : 
      69                 :            :     int count;
      70                 :            :     const EntityHandle* ptr;
      71                 :            :     WriteUtilIface* iface;
      72         [ +  - ]:        375 :     std::vector< EntityHandle > tmp_arr;
      73                 :        375 :     std::vector< EntityHandle >* tmp_ptr = &arr;
      74         [ -  + ]:        375 :     if( checkValid ) tmp_ptr = &tmp_arr;
      75                 :            :     ErrorCode rval;
      76         [ +  - ]:        375 :     if( !pairPtr )
      77                 :            :     {
      78                 :        375 :         Interface* mbImpl = dynamic_cast< Interface* >( myCore );
      79         [ +  - ]:        375 :         rval              = mbImpl->query_interface( iface );
      80         [ -  + ]:        375 :         if( MB_SUCCESS != rval ) return rval;
      81                 :            : 
      82         [ +  - ]:        375 :         rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
      83         [ -  + ]:        375 :         if( MB_SUCCESS != rval ) return rval;
      84         [ +  - ]:        375 :         mbImpl->release_interface( iface );
      85                 :            :     }
      86                 :            :     else
      87                 :            :     {
      88         [ #  # ]:          0 :         if( checkValid )
      89                 :            :         {
      90         [ #  # ]:          0 :             rval = build_pair_vec();
      91         [ #  # ]:          0 :             if( MB_SUCCESS != rval ) return rval;
      92                 :            :         }
      93                 :          0 :         ptr   = pairPtr;
      94                 :          0 :         count = 2 * numPairs;
      95                 :            :     }
      96         [ -  + ]:        375 :     assert( !( count % 2 ) );
      97         [ +  + ]:        375 :     if( !count )
      98                 :            :     {
      99                 :          8 :         atend = true;
     100                 :          8 :         return MB_SUCCESS;
     101                 :            :     }
     102                 :            : 
     103         [ +  + ]:        367 :     if( -1 == entDimension )
     104         [ +  - ]:        334 :         rval = get_next_by_type( ptr, count, *tmp_ptr, atend );
     105                 :            :     else
     106         [ +  - ]:         33 :         rval = get_next_by_dimension( ptr, count, *tmp_ptr, atend );
     107         [ -  + ]:        367 :     if( MB_SUCCESS != rval ) return rval;
     108                 :            : 
     109         [ -  + ]:        367 :     if( checkValid )
     110                 :            :     {
     111 [ #  # ][ #  # ]:          0 :         for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
                 [ #  # ]
     112                 :            :         {
     113 [ #  # ][ #  # ]:          0 :             if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
         [ #  # ][ #  # ]
                 [ #  # ]
     114                 :            :         }
     115                 :            :     }
     116                 :            : 
     117                 :        375 :     return MB_SUCCESS;
     118                 :            : }
     119                 :            : 
     120                 :        334 : ErrorCode RangeSetIterator::get_next_by_type( const EntityHandle*& ptr, int count, std::vector< EntityHandle >& arr,
     121                 :            :                                               bool& atend )
     122                 :            : {
     123                 :        334 :     unsigned int num_ret = 0;
     124                 :        334 :     bool max_type        = ( entType == MBMAXTYPE );
     125                 :        334 :     size_t idx           = 0;
     126                 :            :     // initialize to first relevant handle
     127 [ +  - ][ +  + ]:       1249 :     while( (int)idx < count &&
                 [ +  + ]
     128         [ +  + ]:        344 :            ( iterPos > ptr[idx + 1] ||
     129 [ +  + ][ +  + ]:        180 :              ( !max_type && !iterPos && CREATE_HANDLE( entType, ID_FROM_HANDLE( iterPos ) ) > ptr[idx + 1] ) ) )
     130                 :        571 :         idx += 2;
     131 [ +  - ][ +  + ]:        334 :     if( (int)idx == count || TYPE_FROM_HANDLE( ptr[idx] ) > entType )
                 [ +  + ]
     132                 :            :     {
     133                 :          2 :         atend = true;
     134                 :          2 :         return MB_SUCCESS;
     135                 :            :     }
     136 [ +  + ][ +  + ]:        332 :     if( !iterPos && max_type )
     137                 :          3 :         iterPos = ptr[idx];
     138 [ +  + ][ +  - ]:        329 :     else if( !iterPos && TYPE_FROM_HANDLE( ptr[idx] ) <= entType && TYPE_FROM_HANDLE( ptr[idx + 1] ) >= entType )
         [ +  - ][ +  + ]
     139                 :            :     {
     140         [ +  - ]:          7 :         iterPos = std::max( CREATE_HANDLE( entType, 1 ), ptr[idx] );
     141                 :            :     }
     142                 :            : 
     143                 :            :     // idx points to start of subrange, iterPos in that subrange
     144         [ +  + ]:        338 :     do
     145                 :            :     {
     146                 :        338 :         EntityHandle next = ptr[idx + 1];
     147 [ +  + ][ -  + ]:        338 :         if( TYPE_FROM_HANDLE( next ) != entType && !max_type ) next = LAST_HANDLE( entType );
                 [ -  + ]
     148                 :        338 :         unsigned int this_ret = chunkSize - num_ret;
     149                 :        338 :         unsigned int to_end   = next - iterPos + 1;
     150         [ +  + ]:        338 :         if( to_end < this_ret ) this_ret = to_end;
     151 [ +  - ][ +  - ]:        338 :         std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
     152         [ +  + ]:        338 :         if( this_ret == to_end )
     153                 :            :         {
     154                 :         20 :             idx += 2;
     155         [ +  + ]:         20 :             iterPos = ( (int)idx < count ? ptr[idx] : 0 );
     156                 :            :         }
     157                 :            :         else
     158                 :        318 :             iterPos += this_ret;
     159                 :            : 
     160                 :        338 :         num_ret += this_ret;
     161 [ +  + ][ +  + ]:        342 :     } while( (int)idx < count && num_ret < chunkSize && iterPos &&
         [ +  - ][ +  + ]
     162         [ +  + ]:          4 :              ( max_type || TYPE_FROM_HANDLE( iterPos ) == entType ) );
     163                 :            : 
     164 [ +  + ][ +  + ]:        332 :     if( !iterPos || ( !max_type && TYPE_FROM_HANDLE( iterPos ) != entType ) ) atend = true;
         [ +  + ][ +  + ]
     165                 :            : 
     166                 :        334 :     return MB_SUCCESS;
     167                 :            : }
     168                 :            : 
     169                 :         33 : ErrorCode RangeSetIterator::get_next_by_dimension( const EntityHandle*& ptr, int count,
     170                 :            :                                                    std::vector< EntityHandle >& arr, bool& atend )
     171                 :            : {
     172                 :            :     // iterating by dimension - type should be maxtype
     173 [ -  + ][ #  # ]:         33 :     if( entType != MBMAXTYPE ) { MB_SET_ERR( MB_FAILURE, "Both dimension and type should not be set on an iterator" ); }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     174                 :            : 
     175                 :         33 :     unsigned int num_ret = 0;
     176                 :         33 :     size_t idx           = 0;
     177                 :            :     // initialize to first relevant handle
     178 [ +  - ][ +  + ]:         53 :     while( (int)idx < count && ( iterPos > ptr[idx + 1] ||
         [ +  + ][ +  + ]
     179         [ -  + ]:          4 :                                  ( !iterPos && entDimension > CN::Dimension( TYPE_FROM_HANDLE( ptr[idx + 1] ) ) ) ) )
     180                 :         16 :         idx += 2;
     181 [ +  - ][ -  + ]:         33 :     if( (int)idx == count || CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) > entDimension )
                 [ -  + ]
     182                 :            :     {
     183                 :          0 :         atend = true;
     184                 :          0 :         return MB_SUCCESS;
     185                 :            :     }
     186         [ +  + ]:         33 :     if( !iterPos )
     187                 :          4 :         iterPos = ptr[idx];
     188         [ -  + ]:         29 :     else if( CN::Dimension( TYPE_FROM_HANDLE( ptr[idx] ) ) < entDimension )
     189                 :          0 :         iterPos = CREATE_HANDLE( CN::TypeDimensionMap[entDimension].first, 1 );
     190                 :            : 
     191                 :            :     // idx points to start of subrange, iterPos in that subrange
     192         [ +  + ]:         35 :     do
     193                 :            :     {
     194                 :         35 :         EntityHandle next = ptr[idx + 1];
     195         [ -  + ]:         35 :         if( CN::Dimension( TYPE_FROM_HANDLE( next ) ) != entDimension )
     196                 :          0 :             next = LAST_HANDLE( CN::TypeDimensionMap[entDimension].second );
     197                 :         35 :         unsigned int this_ret = chunkSize - num_ret;
     198                 :         35 :         unsigned int to_end   = next - iterPos + 1;
     199         [ +  + ]:         35 :         if( to_end < this_ret ) this_ret = to_end;
     200 [ +  - ][ +  - ]:         35 :         std::copy( MeshSet::hdl_iter( iterPos ), MeshSet::hdl_iter( iterPos + this_ret ), std::back_inserter( arr ) );
     201         [ +  + ]:         35 :         if( this_ret == to_end )
     202                 :            :         {
     203                 :          8 :             idx += 2;
     204         [ +  - ]:          8 :             iterPos = ( (int)idx < count ? ptr[idx] : 0 );
     205                 :            :         }
     206                 :            :         else
     207                 :         27 :             iterPos += this_ret;
     208                 :            : 
     209                 :         35 :         num_ret += this_ret;
     210 [ +  - ][ +  + ]:         39 :     } while( (int)idx < count && num_ret < chunkSize && iterPos &&
           [ +  -  +  + ]
     211                 :          4 :              CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) == entDimension );
     212                 :            : 
     213 [ +  - ][ +  + ]:         33 :     if( !iterPos || CN::Dimension( TYPE_FROM_HANDLE( iterPos ) ) != entDimension ) atend = true;
                 [ +  + ]
     214                 :            : 
     215                 :         33 :     return MB_SUCCESS;
     216                 :            : }
     217                 :            : 
     218                 :          0 : ErrorCode RangeSetIterator::reset()
     219                 :            : {
     220                 :          0 :     iterPos = 0;
     221                 :          0 :     return MB_SUCCESS;
     222                 :            : }
     223                 :            : 
     224                 :        379 : ErrorCode VectorSetIterator::get_next_arr( std::vector< EntityHandle >& arr, bool& atend )
     225                 :            : {
     226                 :            :     int count;
     227                 :            :     const EntityHandle* ptr;
     228                 :            :     WriteUtilIface* iface;
     229                 :        379 :     Interface* mbImpl = dynamic_cast< Interface* >( myCore );
     230         [ +  - ]:        379 :     ErrorCode rval    = mbImpl->query_interface( iface );
     231         [ -  + ]:        379 :     if( MB_SUCCESS != rval ) return rval;
     232                 :            : 
     233         [ +  - ]:        379 :     rval = iface->get_entity_list_pointers( &entSet, 1, &ptr, WriteUtilIface::CONTENTS, &count );
     234         [ -  + ]:        379 :     if( MB_SUCCESS != rval ) return rval;
     235         [ +  - ]:        379 :     mbImpl->release_interface( iface );
     236                 :            : 
     237 [ +  + ][ -  + ]:        379 :     if( !count || iterPos >= count )
     238                 :            :     {
     239                 :          8 :         atend = true;
     240                 :          8 :         return MB_SUCCESS;
     241                 :            :     }
     242                 :            : 
     243         [ +  - ]:        371 :     std::vector< EntityHandle > tmp_arr;
     244                 :        371 :     std::vector< EntityHandle >* tmp_ptr = &arr;
     245         [ -  + ]:        371 :     if( checkValid ) tmp_ptr = &tmp_arr;
     246                 :            : 
     247                 :            :     // just get the next chunkSize entities, or as many as you can
     248                 :        371 :     int this_ct = 0;
     249 [ +  + ][ +  + ]:       2323 :     while( this_ct < (int)chunkSize && iterPos < count )
     250                 :            :     {
     251 [ +  + ][ +  - ]:       2440 :         if( ( MBMAXTYPE == entType || TYPE_FROM_HANDLE( ptr[iterPos] ) == entType ) &&
         [ +  + ][ +  + ]
                 [ +  + ]
     252 [ +  - ][ +  - ]:        488 :             ( -1 == entDimension || CN::Dimension( TYPE_FROM_HANDLE( ptr[iterPos] ) ) == entDimension ) )
                 [ +  + ]
     253                 :            :         {
     254         [ +  - ]:        842 :             arr.push_back( ptr[iterPos] );
     255                 :        842 :             this_ct++;
     256                 :            :         }
     257                 :       1952 :         iterPos++;
     258                 :            :     }
     259                 :            : 
     260                 :        371 :     atend = ( iterPos == count );
     261                 :            : 
     262         [ -  + ]:        371 :     if( checkValid )
     263                 :            :     {
     264 [ #  # ][ #  # ]:          0 :         for( std::vector< EntityHandle >::iterator vit = tmp_ptr->begin(); vit != tmp_ptr->end(); ++vit )
                 [ #  # ]
     265                 :            :         {
     266 [ #  # ][ #  # ]:          0 :             if( myCore->is_valid( *vit ) ) arr.push_back( *vit );
         [ #  # ][ #  # ]
                 [ #  # ]
     267                 :            :         }
     268                 :            :     }
     269                 :            : 
     270                 :            :     // step along list, adding entities
     271                 :        379 :     return MB_SUCCESS;
     272                 :            : }
     273                 :            : 
     274                 :          0 : ErrorCode VectorSetIterator::reset()
     275                 :            : {
     276                 :          0 :     iterPos = 0;
     277                 :          0 :     return MB_SUCCESS;
     278                 :            : }
     279                 :            : 
     280 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11