LCOV - code coverage report
Current view: top level - src - VarLenDenseTag.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 158 284 55.6 %
Date: 2020-12-16 07:07:30 Functions: 21 34 61.8 %
Branches: 175 858 20.4 %

           Branch data     Line data    Source code
       1                 :            : /** \file   VarLenDenseTag.cpp
       2                 :            :  *  \author Jason Kraftcheck
       3                 :            :  *  \date   2010-12-14
       4                 :            :  */
       5                 :            : 
       6                 :            : #include "VarLenDenseTag.hpp"
       7                 :            : #include "moab/Range.hpp"
       8                 :            : #include "TagCompare.hpp"
       9                 :            : #include "SysUtil.hpp"
      10                 :            : #include "SequenceManager.hpp"
      11                 :            : #include "SequenceData.hpp"
      12                 :            : #include "RangeSeqIntersectIter.hpp"
      13                 :            : #include "moab/Error.hpp"
      14                 :            : #include "moab/ErrorHandler.hpp"
      15                 :            : #include "moab/CN.hpp"
      16                 :            : #include <utility>
      17                 :            : 
      18                 :            : namespace moab
      19                 :            : {
      20                 :            : 
      21                 :          2 : inline static ErrorCode not_found( std::string /*name*/, EntityHandle /*h*/ )
      22                 :            : {
      23                 :            : #if 0
      24                 :            :   // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
      25                 :            :   // Print warning messages for debugging only
      26                 :            :   if (h)
      27                 :            :     fprintf(stderr, "[Warning]: No variable-length dense tag %s value for %s %lu\n",
      28                 :            :         name.c_str(),
      29                 :            :         CN::EntityTypeName(TYPE_FROM_HANDLE(h)),
      30                 :            :         (unsigned long)ID_FROM_HANDLE(h));
      31                 :            :   else
      32                 :            :     fprintf(stderr, "[Warning]: No variable-length dense tag %s value for root set\n", name.c_str());
      33                 :            : #endif
      34                 :            : 
      35                 :          2 :     return MB_TAG_NOT_FOUND;
      36                 :            : }
      37                 :            : 
      38                 :         12 : VarLenDenseTag::VarLenDenseTag( int index, const char* name, DataType type, const void* default_value,
      39                 :            :                                 int default_value_size )
      40         [ +  - ]:         12 :     : TagInfo( name, MB_VARIABLE_LENGTH, type, default_value, default_value_size ), mySequenceArray( index )
      41                 :            : {
      42                 :         12 : }
      43                 :            : 
      44                 :         12 : VarLenDenseTag* VarLenDenseTag::create_tag( SequenceManager* seqman, Error* error, const char* name, DataType type,
      45                 :            :                                             const void* default_value, int default_value_size )
      46                 :            : {
      47                 :            :     int index;
      48 [ +  - ][ -  + ]:         12 :     if( MB_SUCCESS != seqman->reserve_tag_array( error, MB_VARIABLE_LENGTH, index ) ) return NULL;
      49                 :            : 
      50 [ +  - ][ +  - ]:         12 :     return new VarLenDenseTag( index, name, type, default_value, default_value_size );
      51                 :            : }
      52                 :            : 
      53                 :         36 : VarLenDenseTag::~VarLenDenseTag()
      54                 :            : {
      55         [ -  + ]:         12 :     assert( mySequenceArray < 0 );
      56         [ -  + ]:         24 : }
      57                 :            : 
      58                 :          9 : TagType VarLenDenseTag::get_storage_type() const
      59                 :            : {
      60                 :          9 :     return MB_TAG_DENSE;
      61                 :            : }
      62                 :            : 
      63                 :         12 : ErrorCode VarLenDenseTag::release_all_data( SequenceManager* seqman, Error* error, bool delete_pending )
      64                 :            : {
      65         [ +  - ]:         12 :     Range all_ents;
      66         [ +  - ]:         12 :     seqman->get_entities( all_ents );
      67         [ +  - ]:         12 :     ErrorCode rval = remove_data( seqman, error, all_ents );
      68         [ +  - ]:         12 :     if( MB_SUCCESS == rval )
      69                 :            :     {
      70         [ +  - ]:         12 :         rval = seqman->release_tag_array( error, mySequenceArray, delete_pending );
      71 [ +  - ][ +  - ]:         12 :         if( MB_SUCCESS == rval && delete_pending ) mySequenceArray = -1;
      72                 :            :     }
      73                 :            : 
      74                 :         12 :     return rval;
      75                 :            : }
      76                 :            : 
      77                 :         50 : ErrorCode VarLenDenseTag::get_array( const SequenceManager* seqman, Error* /* error */, EntityHandle h,
      78                 :            :                                      const VarLenTag*& ptr, size_t& count ) const
      79                 :            : {
      80                 :         50 :     const EntitySequence* seq = NULL;
      81         [ +  - ]:         50 :     ErrorCode rval            = seqman->find( h, seq );
      82         [ -  + ]:         50 :     if( MB_SUCCESS != rval )
      83                 :            :     {
      84         [ #  # ]:          0 :         if( !h )
      85                 :            :         {  // Root set
      86                 :          0 :             ptr   = &meshValue;
      87                 :          0 :             count = 1;
      88                 :          0 :             return MB_SUCCESS;
      89                 :            :         }
      90                 :            :         else
      91                 :            :         {
      92                 :          0 :             ptr   = NULL;
      93                 :          0 :             count = 0;
      94 [ #  # ][ #  # ]:          0 :             return not_found( get_name(), h );
      95                 :            :         }
      96                 :            :     }
      97                 :            : 
      98 [ +  - ][ +  - ]:         50 :     const void* mem = seq->data()->get_tag_data( mySequenceArray );
      99                 :         50 :     ptr             = reinterpret_cast< const VarLenTag* >( mem );
     100 [ +  - ][ +  - ]:         50 :     count           = seq->data()->end_handle() - h + 1;
     101 [ +  - ][ +  - ]:         50 :     if( ptr ) ptr += h - seq->data()->start_handle();
                 [ +  - ]
     102                 :            : 
     103                 :         50 :     return MB_SUCCESS;
     104                 :            : }
     105                 :            : 
     106                 :        144 : ErrorCode VarLenDenseTag::get_array( SequenceManager* seqman, Error* /* error */, EntityHandle h, VarLenTag*& ptr,
     107                 :            :                                      size_t& count, bool allocate )
     108                 :            : {
     109                 :        144 :     EntitySequence* seq = NULL;
     110         [ +  - ]:        144 :     ErrorCode rval      = seqman->find( h, seq );
     111         [ -  + ]:        144 :     if( MB_SUCCESS != rval )
     112                 :            :     {
     113         [ #  # ]:          0 :         if( !h )
     114                 :            :         {  // Root set
     115                 :          0 :             ptr   = &meshValue;
     116                 :          0 :             count = 1;
     117                 :          0 :             return MB_SUCCESS;
     118                 :            :         }
     119                 :            :         else
     120                 :            :         {
     121                 :          0 :             ptr   = NULL;
     122                 :          0 :             count = 0;
     123 [ #  # ][ #  # ]:          0 :             return not_found( get_name(), h );
     124                 :            :         }
     125                 :            :     }
     126                 :            : 
     127 [ +  - ][ +  - ]:        144 :     void* mem = seq->data()->get_tag_data( mySequenceArray );
     128 [ +  + ][ +  + ]:        144 :     if( !mem && allocate )
     129                 :            :     {
     130 [ +  - ][ +  - ]:         10 :         mem = seq->data()->allocate_tag_array( mySequenceArray, sizeof( VarLenTag ) );
     131         [ -  + ]:         10 :         if( !mem )
     132 [ #  # ][ #  # ]:          0 :         { MB_SET_ERR( MB_MEMORY_ALLOCATION_FAILED, "Memory allocation for variable-length dense tag data failed" ); }
         [ #  # ][ #  # ]
                 [ #  # ]
     133                 :            : 
     134 [ +  - ][ +  - ]:         10 :         memset( mem, 0, sizeof( VarLenTag ) * seq->data()->size() );
     135                 :            :     }
     136                 :            : 
     137                 :        144 :     ptr   = reinterpret_cast< VarLenTag* >( mem );
     138 [ +  - ][ +  - ]:        144 :     count = seq->data()->end_handle() - h + 1;
     139 [ +  + ][ +  - ]:        144 :     if( ptr ) ptr += h - seq->data()->start_handle();
                 [ +  - ]
     140                 :            : 
     141                 :        144 :     return MB_SUCCESS;
     142                 :            : }
     143                 :            : 
     144                 :          0 : ErrorCode VarLenDenseTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle*, size_t,
     145                 :            :                                     void* ) const
     146                 :            : {
     147 [ #  # ][ #  # ]:          0 :     MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     148                 :            : }
     149                 :            : 
     150                 :          0 : ErrorCode VarLenDenseTag::get_data( const SequenceManager*, Error* /* error */, const Range&, void* ) const
     151                 :            : {
     152 [ #  # ][ #  # ]:          0 :     MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     153                 :            : }
     154                 :            : 
     155                 :         16 : ErrorCode VarLenDenseTag::get_data( const SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     156                 :            :                                     size_t num_entities, const void** pointers, int* lengths ) const
     157                 :            : {
     158         [ -  + ]:         16 :     if( !lengths )
     159 [ #  # ][ #  # ]:          0 :     { MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" ); }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     160                 :            : 
     161                 :         16 :     ErrorCode result              = MB_SUCCESS, rval;
     162                 :         16 :     const EntityHandle* const end = entities + num_entities;
     163                 :         16 :     size_t junk                   = 0;
     164                 :         16 :     const VarLenTag* ptr          = NULL;
     165                 :            : 
     166         [ +  + ]:         32 :     for( const EntityHandle* i = entities; i != end; ++i, ++pointers, ++lengths )
     167                 :            :     {
     168 [ +  - ][ -  + ]:         16 :         rval = get_array( seqman, NULL, *i, ptr, junk );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     169                 :            : 
     170 [ +  - ][ +  - ]:         16 :         if( ptr && ptr->size() )
         [ +  - ][ +  - ]
     171                 :            :         {
     172         [ +  - ]:         16 :             *pointers = ptr->data();
     173         [ +  - ]:         16 :             *lengths  = ptr->size();
     174                 :            :         }
     175 [ #  # ][ #  # ]:          0 :         else if( get_default_value() )
     176                 :            :         {
     177         [ #  # ]:          0 :             *pointers = get_default_value();
     178         [ #  # ]:          0 :             *lengths  = get_default_value_size();
     179                 :            :         }
     180                 :            :         else
     181                 :            :         {
     182                 :          0 :             *pointers = 0;
     183                 :          0 :             *lengths  = 0;
     184 [ #  # ][ #  # ]:          0 :             result    = not_found( get_name(), *i );
     185                 :            :         }
     186                 :            :     }
     187                 :            : 
     188                 :         16 :     return result;
     189                 :            : }
     190                 :            : 
     191                 :         14 : ErrorCode VarLenDenseTag::get_data( const SequenceManager* seqman, Error* /* error */, const Range& entities,
     192                 :            :                                     const void** pointers, int* lengths ) const
     193                 :            : {
     194         [ -  + ]:         14 :     if( !lengths )
     195 [ #  # ][ #  # ]:          0 :     { MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" ); }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     196                 :            : 
     197                 :            :     ErrorCode rval;
     198                 :         14 :     size_t avail           = 0;
     199                 :         14 :     const VarLenTag* array = NULL;
     200                 :            : 
     201 [ +  - ][ +  - ]:         46 :     for( Range::const_pair_iterator p = entities.const_pair_begin(); p != entities.const_pair_end(); ++p )
         [ +  - ][ +  - ]
                 [ +  + ]
     202                 :            :     {
     203         [ +  - ]:         34 :         EntityHandle start = p->first;
     204 [ +  - ][ +  + ]:         66 :         while( start <= p->second )
     205                 :            :         {
     206 [ +  - ][ -  + ]:         48 :             rval = get_array( seqman, NULL, start, array, avail );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     207                 :            : 
     208 [ +  - ][ +  - ]:         34 :             const size_t count = std::min< size_t >( p->second - start + 1, avail );
     209                 :            : 
     210         [ -  + ]:         34 :             if( !array )
     211                 :            :             {
     212         [ #  # ]:          0 :                 const void* defval = get_default_value();
     213         [ #  # ]:          0 :                 const int len      = get_default_value_size();
     214         [ #  # ]:          0 :                 SysUtil::setmem( pointers, &defval, sizeof( void* ), count );
     215         [ #  # ]:          0 :                 SysUtil::setmem( lengths, &len, sizeof( int ), count );
     216                 :          0 :                 pointers += count;
     217                 :          0 :                 lengths += count;
     218 [ #  # ][ #  # ]:          0 :                 if( !defval ) return not_found( get_name(), start );
                 [ #  # ]
     219                 :            :             }
     220                 :            : 
     221                 :         34 :             const VarLenTag* end_data = array + count;
     222         [ +  + ]:        250 :             while( array != end_data )
     223                 :            :             {
     224 [ +  - ][ +  + ]:        218 :                 if( array->size() )
     225                 :            :                 {
     226         [ +  - ]:        178 :                     *pointers = array->data();
     227         [ +  - ]:        178 :                     *lengths  = array->size();
     228                 :            :                 }
     229 [ +  - ][ +  + ]:         40 :                 else if( get_default_value() )
     230                 :            :                 {
     231         [ +  - ]:         38 :                     *pointers = get_default_value();
     232         [ +  - ]:         38 :                     *lengths  = get_default_value_size();
     233                 :            :                 }
     234                 :            :                 else
     235                 :            :                 {
     236                 :          2 :                     *pointers = NULL;
     237                 :          2 :                     *lengths  = 0;
     238 [ +  - ][ +  - ]:          2 :                     return not_found( get_name(), start );
     239                 :            :                 }
     240                 :        216 :                 ++pointers;
     241                 :        216 :                 ++lengths;
     242                 :        216 :                 ++array;
     243                 :        216 :                 ++start;
     244                 :            :             }
     245                 :            :         }
     246                 :            :     }
     247                 :            : 
     248                 :         12 :     return MB_SUCCESS;
     249                 :            : }
     250                 :            : 
     251                 :          0 : ErrorCode VarLenDenseTag::set_data( SequenceManager*, Error* /* error */, const EntityHandle*, size_t, const void* )
     252                 :            : {
     253 [ #  # ][ #  # ]:          0 :     MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     254                 :            : }
     255                 :            : 
     256                 :          0 : ErrorCode VarLenDenseTag::set_data( SequenceManager*, Error* /* error */, const Range&, const void* )
     257                 :            : {
     258 [ #  # ][ #  # ]:          0 :     MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag " << get_name() << " data" );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     259                 :            : }
     260                 :            : 
     261                 :         59 : ErrorCode VarLenDenseTag::set_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     262                 :            :                                     size_t num_entities, bool one_value, void const* const* pointers,
     263                 :            :                                     const int* lengths )
     264                 :            : {
     265 [ +  + ][ +  - ]:         59 :     ErrorCode rval = validate_lengths( NULL, lengths, one_value ? 1 : num_entities );MB_CHK_ERR( rval );
         [ -  + ][ #  # ]
                 [ #  # ]
     266                 :            : 
     267                 :         59 :     const EntityHandle* const end = entities + num_entities;
     268                 :         59 :     VarLenTag* array              = NULL;
     269                 :         59 :     size_t junk                   = 0;
     270         [ +  + ]:         59 :     const size_t step             = one_value ? 0 : 1;
     271                 :            : 
     272         [ +  + ]:        166 :     for( const EntityHandle* i = entities; i != end; ++i )
     273                 :            :     {
     274 [ +  - ][ -  + ]:        107 :         rval = get_array( seqman, NULL, *i, array, junk, true );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     275                 :            : 
     276         [ +  - ]:        107 :         array->set( *pointers, *lengths );
     277                 :        107 :         pointers += step;
     278                 :        107 :         lengths += step;
     279                 :            :     }
     280                 :            : 
     281                 :         59 :     return MB_SUCCESS;
     282                 :            : }
     283                 :            : 
     284                 :          4 : ErrorCode VarLenDenseTag::set_data( SequenceManager* seqman, Error* /* error */, const Range& entities, bool one_value,
     285                 :            :                                     void const* const* pointers, const int* lengths )
     286                 :            : {
     287 [ +  + ][ +  - ]:          4 :     ErrorCode rval = validate_lengths( NULL, lengths, one_value ? 1 : entities.size() );MB_CHK_ERR( rval );
         [ +  - ][ -  + ]
         [ #  # ][ #  # ]
     288                 :            : 
     289                 :          4 :     VarLenTag* array  = NULL;
     290                 :          4 :     size_t avail      = 0;
     291         [ +  + ]:          4 :     const size_t step = one_value ? 0 : 1;
     292                 :            : 
     293 [ +  - ][ +  - ]:         16 :     for( Range::const_pair_iterator p = entities.const_pair_begin(); p != entities.const_pair_end(); ++p )
         [ +  - ][ +  - ]
                 [ +  + ]
     294                 :            :     {
     295         [ +  - ]:         12 :         EntityHandle start = p->first;
     296 [ +  - ][ +  + ]:         24 :         while( start <= p->second )
     297                 :            :         {
     298 [ +  - ][ -  + ]:         12 :             rval = get_array( seqman, NULL, start, array, avail, true );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     299                 :            : 
     300 [ +  - ][ +  - ]:         12 :             const EntityHandle end = std::min< EntityHandle >( p->second + 1, start + avail );
     301         [ +  + ]:         52 :             while( start != end )
     302                 :            :             {
     303         [ +  - ]:         40 :                 array->set( *pointers, *lengths );
     304                 :         40 :                 ++start;
     305                 :         40 :                 ++array;
     306                 :         40 :                 pointers += step;
     307                 :         40 :                 lengths += step;
     308                 :            :             }
     309                 :            :         }
     310                 :            :     }
     311                 :            : 
     312                 :          4 :     return MB_SUCCESS;
     313                 :            : }
     314                 :            : 
     315                 :         55 : ErrorCode VarLenDenseTag::set_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     316                 :            :                                     size_t num_entities, void const* const* pointers, const int* lengths )
     317                 :            : {
     318                 :         55 :     return set_data( seqman, NULL, entities, num_entities, false, pointers, lengths );
     319                 :            : }
     320                 :            : 
     321                 :          2 : ErrorCode VarLenDenseTag::set_data( SequenceManager* seqman, Error* /* error */, const Range& entities,
     322                 :            :                                     void const* const* pointers, const int* lengths )
     323                 :            : {
     324                 :          2 :     return set_data( seqman, NULL, entities, false, pointers, lengths );
     325                 :            : }
     326                 :            : 
     327                 :          4 : ErrorCode VarLenDenseTag::clear_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     328                 :            :                                       size_t num_entities, const void* value_ptr, int value_len )
     329                 :            : {
     330 [ +  - ][ -  + ]:          4 :     if( !value_ptr || !value_len )
     331                 :          0 :         return remove_data( seqman, NULL, entities, num_entities );
     332                 :            :     else
     333                 :          4 :         return set_data( seqman, NULL, entities, num_entities, true, &value_ptr, &value_len );
     334                 :            : }
     335                 :            : 
     336                 :          2 : ErrorCode VarLenDenseTag::clear_data( SequenceManager* seqman, Error* /* error */, const Range& entities,
     337                 :            :                                       const void* value_ptr, int value_len )
     338                 :            : {
     339 [ +  - ][ -  + ]:          2 :     if( !value_ptr || !value_len )
     340                 :          0 :         return remove_data( seqman, NULL, entities );
     341                 :            :     else
     342                 :          2 :         return set_data( seqman, NULL, entities, true, &value_ptr, &value_len );
     343                 :            : }
     344                 :            : 
     345                 :          0 : ErrorCode VarLenDenseTag::remove_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     346                 :            :                                        size_t num_entities )
     347                 :            : {
     348                 :          0 :     const EntityHandle* const end = entities + num_entities;
     349                 :          0 :     VarLenTag* array              = NULL;
     350                 :          0 :     size_t junk                   = 0;
     351                 :            :     ErrorCode rval;
     352                 :            : 
     353         [ #  # ]:          0 :     for( const EntityHandle* i = entities; i != end; ++i )
     354                 :            :     {
     355 [ #  # ][ #  # ]:          0 :         rval = get_array( seqman, NULL, *i, array, junk, false );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     356                 :            : 
     357 [ #  # ][ #  # ]:          0 :         if( array ) array->clear();
     358                 :            :     }
     359                 :            : 
     360                 :          0 :     return MB_SUCCESS;
     361                 :            : }
     362                 :            : 
     363                 :         12 : ErrorCode VarLenDenseTag::remove_data( SequenceManager* seqman, Error* /* error */, const Range& entities )
     364                 :            : {
     365                 :         12 :     VarLenTag* array = NULL;
     366                 :         12 :     size_t avail     = 0;
     367                 :            :     ErrorCode rval;
     368                 :            : 
     369 [ +  - ][ +  - ]:         37 :     for( Range::const_pair_iterator p = entities.const_pair_begin(); p != entities.const_pair_end(); ++p )
         [ +  - ][ +  - ]
                 [ +  + ]
     370                 :            :     {
     371         [ +  - ]:         25 :         EntityHandle start = p->first;
     372 [ +  - ][ +  + ]:         50 :         while( start <= p->second )
     373                 :            :         {
     374 [ +  - ][ -  + ]:         25 :             rval = get_array( seqman, NULL, start, array, avail, false );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     375                 :            : 
     376 [ +  - ][ +  - ]:         25 :             const EntityHandle end = std::min< EntityHandle >( p->second + 1, start + avail );
     377         [ +  + ]:         25 :             if( array )
     378                 :            :             {
     379         [ +  + ]:        196 :                 while( start != end )
     380                 :            :                 {
     381         [ +  - ]:        174 :                     array->clear();
     382                 :        174 :                     ++start;
     383                 :        174 :                     ++array;
     384                 :            :                 }
     385                 :            :             }
     386                 :            :             else
     387                 :            :             {
     388                 :          3 :                 start = end;
     389                 :            :             }
     390                 :            :         }
     391                 :            :     }
     392                 :            : 
     393                 :         12 :     return MB_SUCCESS;
     394                 :            : }
     395                 :            : 
     396                 :          1 : ErrorCode VarLenDenseTag::tag_iterate( SequenceManager*, Error* /* error */, Range::iterator&, const Range::iterator&,
     397                 :            :                                        void*&, bool )
     398                 :            : {
     399 [ +  - ][ +  - ]:          1 :     MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "Cannot iterate over variable-length tag data" );
         [ +  - ][ -  + ]
                 [ +  - ]
     400                 :            : }
     401                 :            : 
     402                 :            : template < class Container >
     403                 :          0 : static inline ErrorCode get_tagged( const SequenceManager* seqman, int mySequenceArray, EntityType type,
     404                 :            :                                     Container& entities )
     405                 :            : {
     406 [ #  # ][ #  # ]:          0 :     typename Container::iterator hint         = entities.begin();
     407 [ #  # ][ #  # ]:          0 :     std::pair< EntityType, EntityType > range = type_range( type );
     408 [ #  # ][ #  # ]:          0 :     TypeSequenceManager::const_iterator i;
     409                 :            :     const VarLenTag *data, *iter, *end;
     410 [ #  # ][ #  # ]:          0 :     for( EntityType t = range.first; t != range.second; ++t )
         [ #  # ][ #  # ]
     411                 :            :     {
     412 [ #  # ][ #  # ]:          0 :         const TypeSequenceManager& map = seqman->entity_map( t );
     413 [ #  # ][ #  # ]:          0 :         for( i = map.begin(); i != map.end(); ++i )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     414                 :            :         {
     415 [ #  # ][ #  # ]:          0 :             data = reinterpret_cast< const VarLenTag* >( ( *i )->data()->get_tag_data( mySequenceArray ) );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     416 [ #  # ][ #  # ]:          0 :             if( !data ) continue;
     417 [ #  # ][ #  # ]:          0 :             end                 = data + ( *i )->end_handle() - ( *i )->data()->start_handle() + 1;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     418 [ #  # ][ #  # ]:          0 :             iter                = data + ( *i )->start_handle() - ( *i )->data()->start_handle();
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     419 [ #  # ][ #  # ]:          0 :             EntityHandle handle = ( *i )->start_handle();
         [ #  # ][ #  # ]
     420 [ #  # ][ #  # ]:          0 :             for( ; iter != end; ++iter, ++handle )
     421 [ #  # ][ #  # ]:          0 :                 if( iter->size() ) hint = entities.insert( hint, handle );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     422                 :            :         }
     423                 :            :     }
     424                 :            : 
     425                 :          0 :     return MB_SUCCESS;
     426                 :            : }
     427                 :            : 
     428                 :            : template < class Container >
     429                 :          3 : static inline ErrorCode get_tagged( const SequenceManager* seqman, int mySequenceArray, Range::const_iterator begin,
     430                 :            :                                     Range::const_iterator end, Container& entities )
     431                 :            : {
     432 [ #  # ][ +  - ]:          3 :     typename Container::iterator hint = entities.begin();
     433 [ #  # ][ +  - ]:          3 :     RangeSeqIntersectIter iter( const_cast< SequenceManager* >( seqman ) );
     434 [ #  # ][ +  - ]:          3 :     ErrorCode rval = iter.init( begin, end );
     435                 :            :     const VarLenTag* data;
     436 [ #  # ][ #  # ]:          6 :     for( ; MB_SUCCESS == rval; rval = iter.step() )
         [ +  - ][ +  + ]
     437                 :            :     {
     438 [ #  # ][ #  # ]:          3 :         data = reinterpret_cast< const VarLenTag* >( iter.get_sequence()->data()->get_tag_data( mySequenceArray ) );
         [ #  # ][ +  - ]
         [ +  - ][ +  - ]
     439 [ #  # ][ +  + ]:          3 :         if( !data ) continue;
     440                 :            : 
     441 [ #  # ][ #  # ]:          2 :         data += iter.get_start_handle() - iter.get_sequence()->data()->start_handle();
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     442 [ #  # ][ #  # ]:          2 :         size_t count = iter.get_end_handle() - iter.get_start_handle() + 1;
         [ +  - ][ +  - ]
     443 [ #  # ][ +  + ]:         52 :         for( size_t i = 0; i < count; ++i )
     444 [ #  # ][ #  # ]:         50 :             if( data[i].size() ) hint = entities.insert( hint, iter.get_start_handle() + i );
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     445 [ #  # ][ +  - ]:          2 :         rval = iter.step();
     446                 :            :     }
     447                 :            : 
     448 [ #  # ][ -  + ]:          3 :     if( MB_FAILURE != rval )  // We get MB_FAILURE at iterator end
     449                 :          0 :         return rval;
     450                 :            : 
     451                 :          3 :     return MB_SUCCESS;
     452                 :            : }
     453                 :            : 
     454                 :            : template < class Container >
     455                 :          3 : static inline ErrorCode get_tagged( const SequenceManager* seqman, int mySequenceArray, Container& entities,
     456                 :            :                                     EntityType type, const Range* intersect )
     457                 :            : {
     458 [ #  # ][ -  + ]:          3 :     if( !intersect )
     459                 :          0 :         return get_tagged< Container >( seqman, mySequenceArray, type, entities );
     460 [ #  # ][ -  + ]:          3 :     else if( MBMAXTYPE == type )
     461                 :          0 :         return get_tagged< Container >( seqman, mySequenceArray, intersect->begin(), intersect->end(), entities );
     462                 :            :     else
     463                 :            :     {
     464 [ #  # ][ +  - ]:          3 :         std::pair< Range::iterator, Range::iterator > r = intersect->equal_range( type );
     465 [ #  # ][ +  - ]:          3 :         return get_tagged< Container >( seqman, mySequenceArray, r.first, r.second, entities );
     466                 :            :     }
     467                 :            : }
     468                 :            : 
     469                 :          3 : ErrorCode VarLenDenseTag::get_tagged_entities( const SequenceManager* seqman, Range& entities, EntityType type,
     470                 :            :                                                const Range* intersect ) const
     471                 :            : {
     472                 :          3 :     return get_tagged( seqman, mySequenceArray, entities, type, intersect );
     473                 :            : }
     474                 :            : 
     475                 :          0 : ErrorCode VarLenDenseTag::num_tagged_entities( const SequenceManager* seqman, size_t& output_count, EntityType type,
     476                 :            :                                                const Range* intersect ) const
     477                 :            : {
     478         [ #  # ]:          0 :     InsertCount counter( output_count );
     479         [ #  # ]:          0 :     ErrorCode rval = get_tagged( seqman, mySequenceArray, counter, type, intersect );
     480         [ #  # ]:          0 :     output_count   = counter.end();
     481                 :          0 :     return rval;
     482                 :            : }
     483                 :            : 
     484                 :          0 : ErrorCode VarLenDenseTag::find_entities_with_value( const SequenceManager* seqman, Error* error, Range& output_entities,
     485                 :            :                                                     const void* value, int value_bytes, EntityType type,
     486                 :            :                                                     const Range* intersect_entities ) const
     487                 :            : {
     488         [ #  # ]:          0 :     if( !intersect_entities )
     489                 :            :     {
     490         [ #  # ]:          0 :         std::pair< EntityType, EntityType > range = type_range( type );
     491         [ #  # ]:          0 :         TypeSequenceManager::const_iterator i;
     492 [ #  # ][ #  # ]:          0 :         for( EntityType t = range.first; t != range.second; ++t )
     493                 :            :         {
     494         [ #  # ]:          0 :             const TypeSequenceManager& map = seqman->entity_map( t );
     495 [ #  # ][ #  # ]:          0 :             for( i = map.begin(); i != map.end(); ++i )
         [ #  # ][ #  # ]
                 [ #  # ]
     496                 :            :             {
     497 [ #  # ][ #  # ]:          0 :                 const void* data = ( *i )->data()->get_tag_data( mySequenceArray );
                 [ #  # ]
     498         [ #  # ]:          0 :                 if( data )
     499                 :            :                 {
     500 [ #  # ][ #  # ]:          0 :                     ByteArrayIterator start( ( *i )->data()->start_handle(), data, *this );
         [ #  # ][ #  # ]
     501 [ #  # ][ #  # ]:          0 :                     ByteArrayIterator end( ( *i )->end_handle() + 1, 0, 0 );
                 [ #  # ]
     502 [ #  # ][ #  # ]:          0 :                     start += ( *i )->start_handle() - ( *i )->data()->start_handle();
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     503         [ #  # ]:          0 :                     find_tag_varlen_values_equal( *this, value, value_bytes, start, end, output_entities );
     504                 :            :                 }
     505                 :            :             }
     506                 :            :         }
     507                 :            :     }
     508                 :            :     else
     509                 :            :     {
     510                 :            :         const VarLenTag* array;
     511                 :            :         size_t count;
     512                 :            :         ErrorCode rval;
     513                 :            : 
     514 [ #  # ][ #  # ]:          0 :         Range::const_pair_iterator p = intersect_entities->begin();
     515         [ #  # ]:          0 :         if( type != MBMAXTYPE )
     516                 :            :         {
     517 [ #  # ][ #  # ]:          0 :             p = intersect_entities->lower_bound( type );
     518 [ #  # ][ #  # ]:          0 :             assert( TYPE_FROM_HANDLE( p->first ) == type );
                 [ #  # ]
     519                 :            :         }
     520 [ #  # ][ #  # ]:          0 :         for( ;
     521 [ #  # ][ #  # ]:          0 :              p != intersect_entities->const_pair_end() && ( MBMAXTYPE == type || TYPE_FROM_HANDLE( p->first ) == type );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     522                 :            :              ++p )
     523                 :            :         {
     524         [ #  # ]:          0 :             EntityHandle start = p->first;
     525 [ #  # ][ #  # ]:          0 :             while( start <= p->second )
     526                 :            :             {
     527 [ #  # ][ #  # ]:          0 :                 rval = get_array( seqman, error, start, array, count );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     528                 :            : 
     529 [ #  # ][ #  # ]:          0 :                 if( p->second - start < count - 1 ) count = p->second - start + 1;
                 [ #  # ]
     530                 :            : 
     531         [ #  # ]:          0 :                 if( array )
     532                 :            :                 {
     533         [ #  # ]:          0 :                     ByteArrayIterator istart( start, array, *this );
     534         [ #  # ]:          0 :                     ByteArrayIterator iend( start + count, 0, 0 );
     535         [ #  # ]:          0 :                     find_tag_varlen_values_equal( *this, value, value_bytes, istart, iend, output_entities );
     536                 :            :                 }
     537                 :          0 :                 start += count;
     538                 :            :             }
     539                 :            :         }
     540                 :            :     }
     541                 :            : 
     542                 :          0 :     return MB_SUCCESS;
     543                 :            : }
     544                 :            : 
     545                 :          0 : bool VarLenDenseTag::is_tagged( const SequenceManager* seqman, EntityHandle h ) const
     546                 :            : {
     547                 :          0 :     const VarLenTag* ptr = NULL;  // Initialize to get rid of warning
     548                 :            :     size_t count;
     549 [ #  # ][ #  # ]:          0 :     return ( MB_SUCCESS == get_array( seqman, 0, h, ptr, count ) ) && ( NULL != ptr ) && ( NULL != ptr->data() );
         [ #  # ][ #  # ]
                 [ #  # ]
     550                 :            : }
     551                 :            : 
     552                 :          0 : ErrorCode VarLenDenseTag::get_memory_use( const SequenceManager* seqman, unsigned long& total,
     553                 :            :                                           unsigned long& per_entity ) const
     554                 :            : 
     555                 :            : {
     556                 :          0 :     total        = 0;
     557                 :          0 :     per_entity   = 0;
     558                 :          0 :     size_t count = 0;
     559 [ #  # ][ #  # ]:          0 :     for( EntityType t = MBVERTEX; t <= MBENTITYSET; ++t )
     560                 :            :     {
     561         [ #  # ]:          0 :         const TypeSequenceManager& map = seqman->entity_map( t );
     562                 :          0 :         const SequenceData* prev_data  = 0;
     563 [ #  # ][ #  # ]:          0 :         for( TypeSequenceManager::const_iterator i = map.begin(); i != map.end(); ++i )
         [ #  # ][ #  # ]
                 [ #  # ]
     564                 :            :         {
     565 [ #  # ][ #  # ]:          0 :             const void* mem = ( *i )->data()->get_tag_data( mySequenceArray );
                 [ #  # ]
     566         [ #  # ]:          0 :             if( !mem ) continue;
     567                 :            : 
     568 [ #  # ][ #  # ]:          0 :             if( ( *i )->data() != prev_data )
                 [ #  # ]
     569                 :            :             {
     570 [ #  # ][ #  # ]:          0 :                 total += ( *i )->data()->size();
                 [ #  # ]
     571 [ #  # ][ #  # ]:          0 :                 prev_data = ( *i )->data();
     572                 :            :             }
     573                 :            : 
     574 [ #  # ][ #  # ]:          0 :             count += ( *i )->size();
     575                 :          0 :             const VarLenTag* array = reinterpret_cast< const VarLenTag* >( mem );
     576 [ #  # ][ #  # ]:          0 :             for( int j = 0; j < ( *i )->size(); ++j )
                 [ #  # ]
     577         [ #  # ]:          0 :                 per_entity += array[j].mem();
     578                 :            :         }
     579                 :            :     }
     580                 :          0 :     total *= sizeof( VarLenTag );
     581                 :          0 :     total += per_entity + sizeof( *this ) + TagInfo::get_memory_use();
     582                 :          0 :     total += meshValue.mem() + sizeof( meshValue );
     583         [ #  # ]:          0 :     if( count ) per_entity /= count;
     584                 :          0 :     per_entity += sizeof( VarLenTag );
     585                 :            : 
     586                 :          0 :     return MB_SUCCESS;
     587                 :            : }
     588                 :            : 
     589                 :            : }  // namespace moab

Generated by: LCOV version 1.11