LCOV - code coverage report
Current view: top level - src - DenseTag.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 266 294 90.5 %
Date: 2020-12-16 07:07:30 Functions: 30 32 93.8 %
Branches: 361 748 48.3 %

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

Generated by: LCOV version 1.11