LCOV - code coverage report
Current view: top level - src - SparseTag.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 181 195 92.8 %
Date: 2020-12-16 07:07:30 Functions: 31 32 96.9 %
Branches: 252 620 40.6 %

           Branch data     Line data    Source code
       1                 :            : /**
       2                 :            :  * MOAB, a Mesh-Oriented datABase, is a software component for creating,
       3                 :            :  * storing and accessing finite element mesh data.
       4                 :            :  *
       5                 :            :  * Copyright 2004 Sandia Corporation.  Under the terms of Contract
       6                 :            :  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
       7                 :            :  * retains certain rights in this software.
       8                 :            :  *
       9                 :            :  * This library is free software; you can redistribute it and/or
      10                 :            :  * modify it under the terms of the GNU Lesser General Public
      11                 :            :  * License as published by the Free Software Foundation; either
      12                 :            :  * version 2.1 of the License, or (at your option) any later version.
      13                 :            :  *
      14                 :            :  */
      15                 :            : 
      16                 :            : #include <memory.h>
      17                 :            : #include <algorithm>
      18                 :            : 
      19                 :            : #include "SparseTag.hpp"
      20                 :            : #include "moab/Range.hpp"
      21                 :            : #include "TagCompare.hpp"
      22                 :            : #include "SysUtil.hpp"
      23                 :            : #include "SequenceManager.hpp"
      24                 :            : #include "moab/Error.hpp"
      25                 :            : #include "moab/ErrorHandler.hpp"
      26                 :            : #include "moab/CN.hpp"
      27                 :            : 
      28                 :            : namespace moab
      29                 :            : {
      30                 :            : 
      31                 :       2119 : SparseTag::SparseTag( const char* name, int size, DataType type, const void* default_value )
      32 [ +  - ][ +  - ]:       2119 :     : TagInfo( name, size, type, default_value, size )
      33                 :            : {
      34                 :       2119 : }
      35                 :            : 
      36                 :       6282 : SparseTag::~SparseTag()
      37                 :            : {
      38                 :       2094 :     release_all_data( 0, 0, true );
      39         [ -  + ]:       4188 : }
      40                 :            : 
      41                 :       1706 : TagType SparseTag::get_storage_type() const
      42                 :            : {
      43                 :       1706 :     return MB_TAG_SPARSE;
      44                 :            : }
      45                 :            : 
      46                 :       4701 : ErrorCode SparseTag::release_all_data( SequenceManager*, Error*, bool )
      47                 :            : {
      48 [ +  - ][ +  - ]:      11266 :     for( MapType::iterator i = mData.begin(); i != mData.end(); ++i )
                 [ +  + ]
      49 [ +  - ][ +  - ]:       6565 :         mAllocator.destroy( i->second );
      50                 :       4701 :     mData.clear();
      51                 :       4701 :     return MB_SUCCESS;
      52                 :            : }
      53                 :            : 
      54                 :       6780 : ErrorCode SparseTag::set_data( Error*, EntityHandle entity_handle, const void* data )
      55                 :            : {
      56                 :            : #ifdef MOAB_HAVE_UNORDERED_MAP
      57         [ +  - ]:       6780 :     MapType::iterator iter = mData.find( entity_handle );
      58                 :            : #else
      59                 :            :     MapType::iterator iter = mData.lower_bound( entity_handle );
      60                 :            : #endif
      61                 :            : 
      62                 :            :     // Data space already exists
      63 [ +  - ][ +  + ]:       6780 :     if( iter != mData.end() && iter->first == entity_handle ) memcpy( iter->second, data, get_size() );
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
                 [ #  # ]
      64                 :            :     // We need to make some data space
      65                 :            :     else
      66                 :            :     {
      67 [ +  - ][ +  - ]:       6013 :         void* new_data = allocate_data( entity_handle, iter, false );
      68         [ +  - ]:       6013 :         memcpy( new_data, data, get_size() );
      69                 :            :     }
      70                 :            : 
      71                 :       6780 :     return MB_SUCCESS;
      72                 :            : }
      73                 :            : 
      74                 :      25838 : ErrorCode SparseTag::get_data_ptr( EntityHandle entity_handle, const void*& ptr, bool allocate ) const
      75                 :            : {
      76         [ +  - ]:      25838 :     MapType::const_iterator iter = mData.find( entity_handle );
      77                 :            : 
      78 [ +  - ][ +  + ]:      25838 :     if( iter != mData.end() )
      79         [ +  - ]:      19319 :         ptr = iter->second;
      80 [ +  - ][ +  + ]:       6519 :     else if( get_default_value() && allocate )
         [ +  + ][ +  + ]
      81         [ +  - ]:       1149 :         ptr = const_cast< SparseTag* >( this )->allocate_data( entity_handle, iter, allocate );
      82                 :            :     else
      83                 :       5370 :         return MB_FAILURE;
      84                 :            : 
      85                 :      25838 :     return MB_SUCCESS;
      86                 :            : }
      87                 :            : 
      88                 :      19548 : ErrorCode SparseTag::get_data( Error* /* error */, EntityHandle entity_handle, void* data ) const
      89                 :            : {
      90                 :      19548 :     const void* ptr = 0;
      91         [ +  - ]:      19548 :     ErrorCode rval  = get_data_ptr( entity_handle, ptr, false );
      92         [ +  + ]:      19548 :     if( MB_SUCCESS == rval )
      93                 :            :     {
      94         [ +  - ]:      14255 :         memcpy( data, ptr, get_size() );
      95                 :      14255 :         return rval;
      96                 :            :     }
      97 [ +  - ][ +  + ]:       5293 :     else if( get_default_value() )
      98                 :            :     {
      99 [ +  - ][ +  - ]:       5146 :         memcpy( data, get_default_value(), get_size() );
     100                 :       5146 :         return MB_SUCCESS;
     101                 :            :     }
     102                 :            :     else
     103                 :      19548 :         return MB_TAG_NOT_FOUND;
     104                 :            : }
     105                 :            : 
     106                 :       5342 : ErrorCode SparseTag::remove_data( Error* /* error */, EntityHandle entity_handle )
     107                 :            : {
     108         [ +  - ]:       5342 :     MapType::iterator i = mData.find( entity_handle );
     109 [ +  - ][ +  + ]:       5342 :     if( i == mData.end() ) return MB_TAG_NOT_FOUND;
     110                 :            : 
     111 [ +  - ][ +  - ]:        356 :     mAllocator.destroy( i->second );
     112         [ +  - ]:        356 :     mData.erase( i );
     113                 :            : 
     114                 :       5342 :     return MB_SUCCESS;
     115                 :            : }
     116                 :            : 
     117                 :      17587 : ErrorCode SparseTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
     118                 :            :                                size_t num_entities, void* data ) const
     119                 :            : {
     120                 :            :     ErrorCode rval;
     121                 :      17587 :     unsigned char* ptr = reinterpret_cast< unsigned char* >( data );
     122         [ +  + ]:      35132 :     for( size_t i = 0; i < num_entities; ++i, ptr += get_size() )
     123                 :            :     {
     124                 :      17687 :         rval = get_data( NULL, entities[i], ptr );
     125         [ +  + ]:      17687 :         if( MB_SUCCESS != rval ) return rval;
     126                 :            :     }
     127                 :            : 
     128                 :      17445 :     return MB_SUCCESS;
     129                 :            : }
     130                 :            : 
     131                 :        176 : ErrorCode SparseTag::get_data( const SequenceManager*, Error* /* error */, const Range& entities, void* data ) const
     132                 :            : {
     133                 :            :     ErrorCode rval;
     134                 :        176 :     unsigned char* ptr = reinterpret_cast< unsigned char* >( data );
     135         [ +  - ]:        176 :     Range::const_iterator i;
     136 [ +  - ][ +  - ]:       2032 :     for( i = entities.begin(); i != entities.end(); ++i, ptr += get_size() )
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
     137                 :            :     {
     138 [ +  - ][ +  - ]:       1861 :         rval = get_data( NULL, *i, ptr );
     139         [ +  + ]:       1861 :         if( MB_SUCCESS != rval ) return rval;
     140                 :            :     }
     141                 :            : 
     142                 :        176 :     return MB_SUCCESS;
     143                 :            : }
     144                 :            : 
     145                 :        270 : ErrorCode SparseTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
     146                 :            :                                size_t num_entities, const void** pointers, int* data_lengths ) const
     147                 :            : {
     148         [ +  + ]:        270 :     if( data_lengths )
     149                 :            :     {
     150         [ +  - ]:        264 :         int len = get_size();
     151         [ +  - ]:        264 :         SysUtil::setmem( data_lengths, &len, sizeof( int ), num_entities );
     152                 :            :     }
     153                 :            : 
     154                 :        270 :     ErrorCode rval = MB_SUCCESS, rval_tmp;
     155         [ +  + ]:        464 :     for( size_t i = 0; i < num_entities; ++i, ++pointers )
     156                 :            :     {
     157                 :        270 :         rval_tmp = get_data_ptr( entities[i], *pointers );
     158 [ +  + ][ -  + ]:        270 :         if( MB_SUCCESS != rval_tmp && get_default_value() ) { *pointers = get_default_value(); }
                 [ -  + ]
     159         [ +  + ]:        270 :         else if( MB_SUCCESS != rval_tmp )
     160                 :            :         {
     161                 :         76 :             return MB_TAG_NOT_FOUND;
     162                 :            :         }
     163                 :            :     }
     164                 :            : 
     165                 :        270 :     return rval;
     166                 :            : }
     167                 :            : 
     168                 :         14 : ErrorCode SparseTag::get_data( const SequenceManager*, Error* /* error */, const Range& entities, const void** pointers,
     169                 :            :                                int* data_lengths ) const
     170                 :            : {
     171         [ +  + ]:         14 :     if( data_lengths )
     172                 :            :     {
     173         [ +  - ]:          2 :         int len = get_size();
     174 [ +  - ][ +  - ]:          2 :         SysUtil::setmem( data_lengths, &len, sizeof( int ), entities.size() );
     175                 :            :     }
     176                 :            : 
     177                 :         14 :     ErrorCode rval = MB_SUCCESS, rval_tmp;
     178         [ +  - ]:         14 :     Range::const_iterator i;
     179 [ +  - ][ +  - ]:        153 :     for( i = entities.begin(); i != entities.end(); ++i, ++pointers )
         [ +  - ][ +  - ]
                 [ +  + ]
     180                 :            :     {
     181 [ +  - ][ +  - ]:        140 :         rval_tmp = get_data_ptr( *i, *pointers );
     182 [ +  + ][ +  - ]:        140 :         if( MB_SUCCESS != rval_tmp && get_default_value() ) { *pointers = get_default_value(); }
         [ -  + ][ -  + ]
                 [ #  # ]
     183         [ +  + ]:        140 :         else if( MB_SUCCESS != rval_tmp )
     184                 :            :         {
     185                 :          1 :             return MB_TAG_NOT_FOUND;
     186                 :            :         }
     187                 :            :     }
     188                 :            : 
     189                 :         14 :     return rval;
     190                 :            : }
     191                 :            : 
     192                 :       3751 : ErrorCode SparseTag::set_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     193                 :            :                                size_t num_entities, const void* data )
     194                 :            : {
     195 [ +  + ][ -  + ]:       3751 :     ErrorCode rval = seqman->check_valid_entities( NULL, entities, num_entities, true );MB_CHK_ERR( rval );
     196                 :            : 
     197                 :       3741 :     const unsigned char* ptr = reinterpret_cast< const unsigned char* >( data );
     198         [ +  + ]:       7660 :     for( size_t i = 0; i < num_entities; ++i, ptr += get_size() )
     199                 :            :     {
     200 [ -  + ][ #  # ]:       3919 :         rval = set_data( NULL, entities[i], ptr );MB_CHK_ERR( rval );
     201                 :            :     }
     202                 :            : 
     203                 :       3741 :     return MB_SUCCESS;
     204                 :            : }
     205                 :            : 
     206                 :        199 : ErrorCode SparseTag::set_data( SequenceManager* seqman, Error* /* error */, const Range& entities, const void* data )
     207                 :            : {
     208 [ +  - ][ +  + ]:        199 :     ErrorCode rval = seqman->check_valid_entities( NULL, entities );MB_CHK_ERR( rval );
         [ -  + ][ +  - ]
     209                 :            : 
     210                 :        197 :     const unsigned char* ptr = reinterpret_cast< const unsigned char* >( data );
     211         [ +  - ]:        197 :     Range::const_iterator i;
     212 [ +  - ][ +  - ]:       3010 :     for( i = entities.begin(); i != entities.end(); ++i, ptr += get_size() )
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
     213 [ +  - ][ +  - ]:       2813 :         if( MB_SUCCESS != ( rval = set_data( NULL, *i, ptr ) ) ) return rval;
                 [ -  + ]
     214                 :            : 
     215                 :        199 :     return MB_SUCCESS;
     216                 :            : }
     217                 :            : 
     218                 :          6 : ErrorCode SparseTag::set_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     219                 :            :                                size_t num_entities, void const* const* pointers, const int* lengths )
     220                 :            : {
     221 [ -  + ][ #  # ]:          6 :     ErrorCode rval = validate_lengths( NULL, lengths, num_entities );MB_CHK_ERR( rval );
     222                 :            : 
     223 [ +  + ][ -  + ]:          6 :     rval = seqman->check_valid_entities( NULL, entities, num_entities, true );MB_CHK_ERR( rval );
     224                 :            : 
     225         [ +  + ]:          8 :     for( size_t i = 0; i < num_entities; ++i, ++pointers )
     226                 :            :     {
     227 [ -  + ][ #  # ]:          4 :         rval = set_data( NULL, entities[i], *pointers );MB_CHK_ERR( rval );
     228                 :            :     }
     229                 :            : 
     230                 :          4 :     return MB_SUCCESS;
     231                 :            : }
     232                 :            : 
     233                 :          4 : ErrorCode SparseTag::set_data( SequenceManager* seqman, Error* /* error */, const Range& entities,
     234                 :            :                                void const* const* pointers, const int* lengths )
     235                 :            : {
     236 [ +  - ][ +  - ]:          4 :     ErrorCode rval = validate_lengths( NULL, lengths, entities.size() );MB_CHK_ERR( rval );
         [ -  + ][ #  # ]
                 [ #  # ]
     237                 :            : 
     238 [ +  - ][ +  + ]:          4 :     rval = seqman->check_valid_entities( NULL, entities );MB_CHK_ERR( rval );
         [ -  + ][ +  - ]
     239                 :            : 
     240         [ +  - ]:          2 :     Range::const_iterator i;
     241 [ +  - ][ +  - ]:         22 :     for( i = entities.begin(); i != entities.end(); ++i, ++pointers )
         [ +  - ][ +  - ]
                 [ +  + ]
     242                 :            :     {
     243 [ +  - ][ +  - ]:         20 :         rval = set_data( NULL, *i, *pointers );MB_CHK_ERR( rval );
         [ -  + ][ #  # ]
                 [ #  # ]
     244                 :            :     }
     245                 :            : 
     246                 :          4 :     return MB_SUCCESS;
     247                 :            : }
     248                 :            : 
     249                 :          4 : ErrorCode SparseTag::clear_data( SequenceManager* seqman, Error* /* error */, const EntityHandle* entities,
     250                 :            :                                  size_t num_entities, const void* value_ptr, int value_len )
     251                 :            : {
     252 [ -  + ][ #  # ]:          4 :     if( value_len && value_len != get_size() )
                 [ -  + ]
     253                 :            :     {
     254 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_INVALID_SIZE, "Invalid data size " << get_size() << " specified for sparse tag " << get_name()
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     255                 :            :                                                           << " of size " << value_len );
     256                 :            :     }
     257                 :            : 
     258 [ -  + ][ #  # ]:          4 :     ErrorCode rval = seqman->check_valid_entities( NULL, entities, num_entities, true );MB_CHK_ERR( rval );
     259                 :            : 
     260         [ +  + ]:          8 :     for( size_t i = 0; i < num_entities; ++i )
     261                 :            :     {
     262 [ -  + ][ #  # ]:          4 :         rval = set_data( NULL, entities[i], value_ptr );MB_CHK_ERR( rval );
     263                 :            :     }
     264                 :            : 
     265                 :          4 :     return MB_SUCCESS;
     266                 :            : }
     267                 :            : 
     268                 :          2 : ErrorCode SparseTag::clear_data( SequenceManager* seqman, Error* /* error */, const Range& entities,
     269                 :            :                                  const void* value_ptr, int value_len )
     270                 :            : {
     271 [ -  + ][ #  # ]:          2 :     if( value_len && value_len != get_size() )
         [ #  # ][ -  + ]
     272                 :            :     {
     273 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_INVALID_SIZE, "Invalid data size " << get_size() << " specified for sparse tag " << get_name()
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     274                 :            :                                                           << " of size " << value_len );
     275                 :            :     }
     276                 :            : 
     277 [ +  - ][ -  + ]:          2 :     ErrorCode rval = seqman->check_valid_entities( NULL, entities );MB_CHK_ERR( rval );
         [ #  # ][ #  # ]
     278                 :            : 
     279         [ +  - ]:          2 :     Range::const_iterator i;
     280 [ +  - ][ +  - ]:         22 :     for( i = entities.begin(); i != entities.end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
     281                 :            :     {
     282 [ +  - ][ +  - ]:         20 :         rval = set_data( NULL, *i, value_ptr );MB_CHK_ERR( rval );
         [ -  + ][ #  # ]
                 [ #  # ]
     283                 :            :     }
     284                 :            : 
     285                 :          2 :     return MB_SUCCESS;
     286                 :            : }
     287                 :            : 
     288                 :       4927 : ErrorCode SparseTag::remove_data( SequenceManager*, Error* /* error */, const EntityHandle* entities,
     289                 :            :                                   size_t num_entities )
     290                 :            : {
     291                 :            :     ErrorCode rval;
     292         [ +  + ]:       5261 :     for( size_t i = 0; i < num_entities; ++i )
     293                 :            :     {
     294                 :       5129 :         rval = remove_data( NULL, entities[i] );
     295         [ +  + ]:       5129 :         if( MB_SUCCESS != rval ) return rval;
     296                 :            :     }
     297                 :            : 
     298                 :        132 :     return MB_SUCCESS;
     299                 :            : }
     300                 :            : 
     301                 :        361 : ErrorCode SparseTag::remove_data( SequenceManager*, Error* /* error */, const Range& entities )
     302                 :            : {
     303 [ +  - ][ +  - ]:        383 :     for( Range::const_iterator i = entities.begin(); i != entities.end(); ++i )
         [ +  - ][ +  - ]
                 [ +  + ]
     304 [ +  - ][ +  - ]:        213 :         if( MB_SUCCESS != remove_data( NULL, *i ) ) return MB_TAG_NOT_FOUND;
                 [ +  + ]
     305                 :            : 
     306                 :        361 :     return MB_SUCCESS;
     307                 :            : }
     308                 :            : 
     309                 :       5882 : ErrorCode SparseTag::tag_iterate( SequenceManager* seqman, Error* /* error */, Range::iterator& iter,
     310                 :            :                                   const Range::iterator& end, void*& data_ptr, bool allocate )
     311                 :            : {
     312                 :            :     // Note: We are asked to returning a block of contiguous storage
     313                 :            :     //       for some block of contiguous handles for which the tag
     314                 :            :     //       storage is also contiguous. As sparse tag storage is
     315                 :            :     //       never contiguous, all we can do is return a pointer to the
     316                 :            :     //       data for the first entity.
     317                 :            : 
     318                 :            :     // If asked for nothing, successfully return nothing.
     319 [ +  - ][ -  + ]:       5882 :     if( iter == end ) return MB_SUCCESS;
     320                 :            : 
     321                 :            :     // Note: get_data_ptr will return the default value if the
     322                 :            :     //       handle is not found, so test to make sure that the
     323                 :            :     //       handle is valid.
     324 [ +  - ][ +  - ]:       5882 :     ErrorCode rval = seqman->check_valid_entities( NULL, &*iter, 1 );MB_CHK_ERR( rval );
         [ +  + ][ -  + ]
                 [ +  - ]
     325                 :            : 
     326                 :            :     // Get pointer to tag storage for entity pointed to by iter
     327                 :       5880 :     const void* ptr = NULL;
     328 [ +  - ][ +  - ]:       5880 :     rval            = get_data_ptr( *iter, ptr );
     329         [ +  - ]:       5880 :     if( MB_SUCCESS == rval )
     330                 :       5880 :         data_ptr = const_cast< void* >( ptr );
     331 [ #  # ][ #  # ]:          0 :     else if( get_default_value() && allocate )
         [ #  # ][ #  # ]
     332                 :            :     {
     333 [ #  # ][ #  # ]:          0 :         ptr      = allocate_data( *iter, mData.end() );
                 [ #  # ]
     334                 :          0 :         data_ptr = const_cast< void* >( ptr );
     335                 :            :     }
     336                 :            :     else
     337                 :            :     {
     338                 :            :         // If allocation was not requested, need to increment the iterator so that
     339                 :            :         // the count can be computed properly
     340 [ #  # ][ #  # ]:          0 :         if( get_default_value() && !allocate ) ++iter;
         [ #  # ][ #  # ]
                 [ #  # ]
     341                 :            :         // return not_found(get_name(), *iter);
     342                 :            :     }
     343                 :            : 
     344                 :            :     // Increment iterator and return
     345         [ +  - ]:       5880 :     ++iter;
     346                 :       5882 :     return MB_SUCCESS;
     347                 :            : }
     348                 :            : 
     349                 :            : template < class Container >
     350                 :         18 : static inline void get_tagged( const SparseTag::MapType& mData, EntityType type, Container& output_range )
     351                 :            : {
     352 [ +  - ][ #  # ]:         18 :     SparseTag::MapType::const_iterator iter;
     353 [ +  - ][ #  # ]:         18 :     typename Container::iterator hint = output_range.begin();
     354 [ +  - ][ #  # ]:         18 :     if( MBMAXTYPE == type )
     355                 :            :     {
     356 [ +  - ][ +  - ]:         20 :         for( iter = mData.begin(); iter != mData.end(); ++iter )
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
     357 [ +  - ][ +  - ]:          2 :             hint = output_range.insert( hint, iter->first );
         [ #  # ][ #  # ]
     358                 :            :     }
     359                 :            :     else
     360                 :            :     {
     361                 :            : #ifdef MOAB_HAVE_UNORDERED_MAP
     362 [ #  # ][ #  # ]:          0 :         for( iter = mData.begin(); iter != mData.end(); ++iter )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     363 [ #  # ][ #  # ]:          0 :             if( TYPE_FROM_HANDLE( iter->first ) == type ) hint = output_range.insert( hint, iter->first );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     364                 :            : #else
     365                 :            :         iter                                   = mData.lower_bound( FIRST_HANDLE( type ) );
     366                 :            :         SparseTag::MapType::const_iterator end = mData.lower_bound( LAST_HANDLE( type ) + 1 );
     367                 :            :         for( ; iter != end; ++iter )
     368                 :            :             hint = output_range.insert( hint, iter->first );
     369                 :            : #endif
     370                 :            :     }
     371                 :         18 : }
     372                 :            : 
     373                 :            : template < class Container >
     374                 :        659 : static inline void get_tagged( const SparseTag::MapType& mData, Range::const_iterator begin, Range::const_iterator end,
     375                 :            :                                Container& output_range )
     376                 :            : {
     377         [ +  - ]:        659 :     typename Container::iterator hint = output_range.begin();
     378 [ +  - ][ +  - ]:     644447 :     for( Range::const_iterator i = begin; i != end; ++i )
         [ +  + ][ +  - ]
         [ +  - ][ +  + ]
     379 [ +  - ][ +  - ]:     643788 :         if( mData.find( *i ) != mData.end() ) hint = output_range.insert( hint, *i );
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
     380                 :        659 : }
     381                 :            : 
     382                 :            : template < class Container >
     383                 :        677 : static inline void get_tagged( const SparseTag::MapType& mData, Container& entities, EntityType type,
     384                 :            :                                const Range* intersect )
     385                 :            : {
     386 [ +  + ][ -  + ]:        677 :     if( !intersect )
     387                 :         18 :         get_tagged< Container >( mData, type, entities );
     388 [ +  - ][ +  + ]:        659 :     else if( MBMAXTYPE == type )
     389                 :        382 :         get_tagged< Container >( mData, intersect->begin(), intersect->end(), entities );
     390                 :            :     else
     391                 :            :     {
     392 [ #  # ][ +  - ]:        277 :         std::pair< Range::iterator, Range::iterator > r = intersect->equal_range( type );
     393 [ #  # ][ +  - ]:        277 :         get_tagged< Container >( mData, r.first, r.second, entities );
     394                 :            :     }
     395                 :        677 : }
     396                 :            : 
     397                 :            : //! Gets all entity handles that match a type and tag
     398                 :        641 : ErrorCode SparseTag::get_tagged_entities( const SequenceManager*, Range& output_range, EntityType type,
     399                 :            :                                           const Range* intersect ) const
     400                 :            : {
     401                 :        641 :     get_tagged( mData, output_range, type, intersect );
     402                 :        641 :     return MB_SUCCESS;
     403                 :            : }
     404                 :            : 
     405                 :            : //! Gets all entity handles that match a type and tag
     406                 :         36 : ErrorCode SparseTag::num_tagged_entities( const SequenceManager*, size_t& output_count, EntityType type,
     407                 :            :                                           const Range* intersect ) const
     408                 :            : {
     409         [ +  - ]:         36 :     InsertCount counter( output_count );
     410         [ +  - ]:         36 :     get_tagged( mData, counter, type, intersect );
     411         [ +  - ]:         36 :     output_count = counter.end();
     412                 :         36 :     return MB_SUCCESS;
     413                 :            : }
     414                 :            : 
     415                 :       1203 : ErrorCode SparseTag::find_entities_with_value(
     416                 :            : #ifdef MOAB_HAVE_UNORDERED_MAP
     417                 :            :     const SequenceManager* seqman,
     418                 :            : #else
     419                 :            :     const SequenceManager*,
     420                 :            : #endif
     421                 :            :     Error* /* error */, Range& output_entities, const void* value, int value_bytes, EntityType type,
     422                 :            :     const Range* intersect_entities ) const
     423                 :            : {
     424 [ -  + ][ #  # ]:       1203 :     if( value_bytes && value_bytes != get_size() )
         [ #  # ][ -  + ]
     425                 :            :     {
     426 [ #  # ][ #  # ]:          0 :         MB_SET_ERR( MB_INVALID_SIZE, "Invalid data size " << get_size() << " specified for sparse tag " << get_name()
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     427                 :            :                                                           << " of size " << value_bytes );
     428                 :            :     }
     429                 :            : 
     430 [ +  - ][ +  - ]:       1203 :     MapType::const_iterator iter, end;
     431                 :            : #ifdef MOAB_HAVE_UNORDERED_MAP
     432         [ +  - ]:       1203 :     if( intersect_entities )
     433                 :            :     {
     434         [ +  - ]:       1203 :         std::pair< Range::iterator, Range::iterator > r;
     435         [ +  + ]:       1203 :         if( type == MBMAXTYPE )
     436                 :            :         {
     437         [ +  - ]:         24 :             r.first  = intersect_entities->begin();
     438         [ +  - ]:         24 :             r.second = intersect_entities->end();
     439                 :            :         }
     440                 :            :         else
     441                 :            :         {
     442         [ +  - ]:       1179 :             r = intersect_entities->equal_range( type );
     443                 :            :         }
     444                 :            : 
     445 [ +  - ][ +  - ]:       1203 :         find_map_values_equal( *this, value, get_size(), r.first, r.second, mData, output_entities );
     446                 :            :     }
     447         [ #  # ]:          0 :     else if( type == MBMAXTYPE )
     448                 :            :     {
     449 [ #  # ][ #  # ]:          0 :         find_tag_values_equal( *this, value, get_size(), mData.begin(), mData.end(), output_entities );
     450                 :            :     }
     451                 :            :     else
     452                 :            :     {
     453         [ #  # ]:          0 :         Range tmp;
     454         [ #  # ]:          0 :         seqman->get_entities( type, tmp );
     455 [ #  # ][ #  # ]:          0 :         find_map_values_equal( *this, value, get_size(), tmp.begin(), tmp.end(), mData, output_entities );
         [ #  # ][ #  # ]
     456                 :            :     }
     457                 :            : #else
     458                 :            :     if( intersect_entities )
     459                 :            :     {
     460                 :            :         for( Range::const_pair_iterator p = intersect_entities->begin(); p != intersect_entities->end(); ++p )
     461                 :            :         {
     462                 :            :             iter = mData.lower_bound( p->first );
     463                 :            :             end = mData.upper_bound( p->second );
     464                 :            :             find_tag_values_equal( *this, value, get_size(), iter, end, output_entities );
     465                 :            :         }
     466                 :            :     }
     467                 :            :     else
     468                 :            :     {
     469                 :            :         if( type == MBMAXTYPE )
     470                 :            :         {
     471                 :            :             iter = mData.begin();
     472                 :            :             end = mData.end();
     473                 :            :         }
     474                 :            :         else
     475                 :            :         {
     476                 :            :             iter = mData.lower_bound( CREATE_HANDLE( type, MB_START_ID ) );
     477                 :            :             end = mData.upper_bound( CREATE_HANDLE( type, MB_END_ID ) );
     478                 :            :         }
     479                 :            :         find_tag_values_equal( *this, value, get_size(), iter, end, output_entities );
     480                 :            :     }
     481                 :            : #endif
     482                 :            : 
     483                 :       1203 :     return MB_SUCCESS;
     484                 :            : }
     485                 :            : 
     486                 :        687 : bool SparseTag::is_tagged( const SequenceManager*, EntityHandle h ) const
     487                 :            : {
     488 [ +  - ][ +  - ]:        687 :     return mData.find( h ) != mData.end();
     489                 :            : }
     490                 :            : 
     491                 :         36 : ErrorCode SparseTag::get_memory_use( const SequenceManager*, unsigned long& total, unsigned long& per_entity ) const
     492                 :            : 
     493                 :            : {
     494                 :         36 :     per_entity = get_size() + 4 * sizeof( void* );
     495                 :         36 :     total      = ( mData.size() * per_entity ) + sizeof( *this ) + TagInfo::get_memory_use();
     496                 :            : 
     497                 :         36 :     return MB_SUCCESS;
     498                 :            : }
     499                 :            : 
     500                 :            : }  // namespace moab

Generated by: LCOV version 1.11