LCOV - code coverage report
Current view: top level - src - TagCompare.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 71 145 49.0 %
Date: 2020-12-16 07:07:30 Functions: 26 55 47.3 %
Branches: 114 360 31.7 %

           Branch data     Line data    Source code
       1                 :            : #ifndef TAG_COMPARE_HPP
       2                 :            : #define TAG_COMPARE_HPP
       3                 :            : 
       4                 :            : #include "TagInfo.hpp"
       5                 :            : #include "VarLenTag.hpp"
       6                 :            : #include <vector>
       7                 :            : 
       8                 :            : namespace moab
       9                 :            : {
      10                 :            : 
      11                 :            : /* OPAQUE FUNCTORS */
      12                 :            : 
      13                 :            : /** Test fixed-length opaque tags for equality */
      14                 :            : class TagBytesEqual
      15                 :            : {
      16                 :            :   private:
      17                 :            :     const void* value;
      18                 :            :     int size;
      19                 :            : 
      20                 :            :   public:
      21                 :         17 :     TagBytesEqual( const void* v, int s ) : value( v ), size( s ) {}
      22                 :          3 :     bool operator()( const void* data ) const
      23                 :            :     {
      24                 :          3 :         return !memcmp( value, data, size );
      25                 :            :     }
      26                 :            : };
      27                 :            : /** Test if fixed-length opaque tag values are less than a value */
      28                 :            : class TagBytesLess
      29                 :            : {
      30                 :            :   private:
      31                 :            :     const void* value;
      32                 :            :     int size;
      33                 :            : 
      34                 :            :   public:
      35                 :            :     TagBytesLess( const void* v, int s ) : value( v ), size( s ) {}
      36                 :            :     bool operator()( const void* data ) const
      37                 :            :     {
      38                 :            :         return 0 < memcmp( value, data, size );
      39                 :            :     }
      40                 :            : };
      41                 :            : /** Test variable-length opaque tags for equality */
      42                 :            : class TagVarBytesEqual
      43                 :            : {
      44                 :            :   private:
      45                 :            :     const void* value;
      46                 :            :     int size;
      47                 :            : 
      48                 :            :   public:
      49                 :          0 :     TagVarBytesEqual( const void* v, int s ) : value( v ), size( s ) {}
      50                 :          0 :     bool operator()( const void* data ) const
      51                 :            :     {
      52                 :          0 :         const VarLenTag* vdata = reinterpret_cast< const VarLenTag* >( data );
      53 [ #  # ][ #  # ]:          0 :         return (int)vdata->size() == size && !memcmp( value, vdata->data(), size );
      54                 :            :     }
      55                 :          0 :     bool operator()( const VarLenTag& vdata ) const
      56                 :            :     {
      57 [ #  # ][ #  # ]:          0 :         return (int)vdata.size() == size && !memcmp( value, vdata.data(), size );
      58                 :            :     }
      59                 :            : };
      60                 :            : /** Test if variable-length opaque tag values are less than a value */
      61                 :            : class TagVarBytesLess
      62                 :            : {
      63                 :            :   private:
      64                 :            :     const void* value;
      65                 :            :     int size;
      66                 :            : 
      67                 :            :   public:
      68                 :            :     TagVarBytesLess( const void* v, int s ) : value( v ), size( s ) {}
      69                 :            :     bool operator()( const void* data ) const
      70                 :            :     {
      71                 :            :         const VarLenTag* vdata = reinterpret_cast< const VarLenTag* >( data );
      72                 :            :         if( (int)vdata->size() < size )
      73                 :            :             return 0 <= memcmp( vdata->data(), value, vdata->size() );
      74                 :            :         else
      75                 :            :             return 0 < memcmp( vdata->data(), value, size );
      76                 :            :     }
      77                 :            :     bool operator()( const VarLenTag& vdata ) const
      78                 :            :     {
      79                 :            :         if( (int)vdata.size() < size )
      80                 :            :             return 0 <= memcmp( vdata.data(), value, vdata.size() );
      81                 :            :         else
      82                 :            :             return 0 < memcmp( vdata.data(), value, size );
      83                 :            :     }
      84                 :            : };
      85                 :            : 
      86                 :            : /* TEMPLATE FUNCTORS */
      87                 :            : 
      88                 :            : /** Compare fixed-length tags containing a known data type */
      89                 :            : template < typename T >
      90                 :            : class TagTypeEqual
      91                 :            : {
      92                 :            :   private:
      93                 :            :     const T* value;
      94                 :            :     int size;
      95                 :            : 
      96                 :            :   public:
      97                 :          0 :     TagTypeEqual( const void* v, int s ) : value( reinterpret_cast< const T* >( v ) ), size( s / sizeof( T ) ) {}
      98                 :            : 
      99                 :          0 :     bool operator()( const void* data ) const
     100                 :            :     {
     101                 :          0 :         const T* ddata = reinterpret_cast< const T* >( data );
     102         [ #  # ]:          0 :         for( int i = 0; i < size; ++i )
     103         [ #  # ]:          0 :             if( value[i] != ddata[i] ) return false;
     104                 :          0 :         return true;
     105                 :            :     }
     106                 :            : };
     107                 :            : 
     108                 :            : /** Compare fixed-length tags containing a known data type */
     109                 :            : template < typename T >
     110                 :            : class TagTypeLess
     111                 :            : {
     112                 :            :   private:
     113                 :            :     const T* value;
     114                 :            :     int size;
     115                 :            : 
     116                 :            :   public:
     117                 :            :     TagTypeLess( const void* v, int s ) : value( reinterpret_cast< const T* >( v ) ), size( s / sizeof( T ) ) {}
     118                 :            : 
     119                 :            :     bool operator()( const void* data ) const
     120                 :            :     {
     121                 :            :         const T* ddata = reinterpret_cast< const T* >( data );
     122                 :            :         for( int i = 0; i < size; ++i )
     123                 :            :             if( value[i] <= ddata[i] ) return false;
     124                 :            :         return true;
     125                 :            :     }
     126                 :            : };
     127                 :            : 
     128                 :            : /** Compare single-value tags containing a known data type
     129                 :            :  * Optimization of TagTypeEqual for 1-value case.
     130                 :            :  */
     131                 :            : template < typename T >
     132                 :            : class TagOneTypeEqual
     133                 :            : {
     134                 :            :   private:
     135                 :            :     T value;
     136                 :            :     int size;
     137                 :            : 
     138                 :            :   public:
     139                 :       1361 :     TagOneTypeEqual( const void* v ) : value( *reinterpret_cast< const T* >( v ) ), size( 0 ) {}
     140                 :            : 
     141                 :      61573 :     bool operator()( const void* data ) const
     142                 :            :     {
     143                 :      61573 :         const T* ddata = reinterpret_cast< const T* >( data );
     144                 :      61573 :         return *ddata == value;
     145                 :            :     }
     146                 :            : };
     147                 :            : 
     148                 :            : /** Compare single-value tags containing a known data type
     149                 :            :  * Optimization of TagTypeLess for 1-value case.
     150                 :            :  */
     151                 :            : template < typename T >
     152                 :            : class TagOneTypeLess
     153                 :            : {
     154                 :            :   private:
     155                 :            :     T value;
     156                 :            :     int size;
     157                 :            : 
     158                 :            :   public:
     159                 :            :     TagOneTypeLess( const void* v ) : value( *reinterpret_cast< const T* >( v ) ), size( 0 ) {}
     160                 :            : 
     161                 :            :     bool operator()( const void* data ) const
     162                 :            :     {
     163                 :            :         const T* ddata = reinterpret_cast< const T* >( data );
     164                 :            :         return *ddata < value;
     165                 :            :     }
     166                 :            : };
     167                 :            : 
     168                 :            : /** Compare variable-length tags containing a known data type */
     169                 :            : template < typename T >
     170                 :            : class TagVarTypeEqual
     171                 :            : {
     172                 :            :   private:
     173                 :            :     const T* value;
     174                 :            :     int size;
     175                 :            : 
     176                 :            :   public:
     177                 :          0 :     TagVarTypeEqual( const void* v, int s ) : value( reinterpret_cast< const T* >( v ) ), size( s / sizeof( T ) ) {}
     178                 :            : 
     179                 :          0 :     bool operator()( const void* data ) const
     180                 :            :     {
     181                 :          0 :         const VarLenTag* vdata = reinterpret_cast< const VarLenTag* >( data );
     182         [ #  # ]:          0 :         if( vdata->size() != size * sizeof( T ) ) return false;
     183                 :          0 :         const T* ddata = reinterpret_cast< const T* >( vdata->data() );
     184         [ #  # ]:          0 :         for( int i = 0; i < size; ++i )
     185         [ #  # ]:          0 :             if( value[i] != ddata[i] ) return false;
     186                 :          0 :         return true;
     187                 :            :     }
     188                 :            : 
     189                 :          0 :     bool operator()( const VarLenTag& vdata ) const
     190                 :            :     {
     191         [ #  # ]:          0 :         if( vdata.size() != size * sizeof( T ) ) return false;
     192                 :          0 :         const T* ddata = reinterpret_cast< const T* >( vdata.data() );
     193         [ #  # ]:          0 :         for( int i = 0; i < size; ++i )
     194         [ #  # ]:          0 :             if( value[i] != ddata[i] ) return false;
     195                 :          0 :         return true;
     196                 :            :     }
     197                 :            : };
     198                 :            : 
     199                 :            : /** Compare variable-length tags containing a known data type */
     200                 :            : template < typename T >
     201                 :            : class TagVarTypeLess
     202                 :            : {
     203                 :            :   private:
     204                 :            :     const T* value;
     205                 :            :     int size;
     206                 :            : 
     207                 :            :   public:
     208                 :            :     TagVarTypeLess( const void* v, int s ) : value( reinterpret_cast< const T* >( v ) ), size( s / sizeof( T ) ) {}
     209                 :            :     bool operator()( const void* data ) const
     210                 :            :     {
     211                 :            :         const VarLenTag* vdata = reinterpret_cast< const VarLenTag* >( data );
     212                 :            :         const T* ddata         = reinterpret_cast< const T* >( vdata->data() );
     213                 :            :         if( (int)vdata->size() < sizeof( T ) * size )
     214                 :            :         {
     215                 :            :             for( int i = 0; i < vdata->size() / sizeof( T ); ++i )
     216                 :            :                 if( value[i] < ddata[i] ) return false;
     217                 :            :         }
     218                 :            :         else
     219                 :            :         {
     220                 :            :             for( int i = 0; i < vdata->size() / sizeof( T ); ++i )
     221                 :            :                 if( value[i] <= ddata[i] ) return false;
     222                 :            :         }
     223                 :            :         return true;
     224                 :            :     }
     225                 :            :     bool operator()( const VarLenTag& vdata ) const
     226                 :            :     {
     227                 :            :         const T* ddata = reinterpret_cast< const T* >( vdata.data() );
     228                 :            :         if( (int)vdata.size() < sizeof( T ) * size )
     229                 :            :         {
     230                 :            :             for( int i = 0; i < vdata.size() / sizeof( T ); ++i )
     231                 :            :                 if( value[i] < ddata[i] ) return false;
     232                 :            :         }
     233                 :            :         else
     234                 :            :         {
     235                 :            :             for( int i = 0; i < vdata.size() / sizeof( T ); ++i )
     236                 :            :                 if( value[i] <= ddata[i] ) return false;
     237                 :            :         }
     238                 :            :         return true;
     239                 :            :     }
     240                 :            : };
     241                 :            : 
     242                 :            : /* TYPE FUNCTORS */
     243                 :            : 
     244                 :            : typedef TagBytesEqual TagIntsEqual;
     245                 :            : typedef TagVarBytesEqual TagVarIntsEqual;
     246                 :            : typedef TagTypeLess< int > TagIntsLess;
     247                 :            : typedef TagVarTypeLess< int > TagVarIntsLess;
     248                 :            : typedef TagOneTypeEqual< int > TagOneIntEqual;
     249                 :            : typedef TagOneTypeLess< int > TagOneIntLess;
     250                 :            : 
     251                 :            : typedef TagBytesEqual TagHandlesEqual;
     252                 :            : typedef TagVarBytesEqual TagVarHandlesEqual;
     253                 :            : typedef TagTypeLess< EntityHandle > TagHandlesLess;
     254                 :            : typedef TagVarTypeLess< EntityHandle > TagVarHandlesLess;
     255                 :            : typedef TagOneTypeEqual< EntityHandle > TagOneHandleEqual;
     256                 :            : typedef TagOneTypeLess< EntityHandle > TagOneHandleLess;
     257                 :            : 
     258                 :            : typedef TagTypeEqual< double > TagDoublesEqual;
     259                 :            : typedef TagVarTypeEqual< double > TagVarDoublesEqual;
     260                 :            : typedef TagTypeLess< double > TagDoublesLess;
     261                 :            : typedef TagVarTypeLess< double > TagVarDoublesLess;
     262                 :            : typedef TagOneTypeEqual< double > TagOneDoubleEqual;
     263                 :            : typedef TagOneTypeLess< double > TagOneDoubleLess;
     264                 :            : 
     265                 :            : /* SEARCHING */
     266                 :            : 
     267                 :            : template < class Functor, class IteratorType >
     268                 :        175 : static inline void find_tag_values( Functor compare, IteratorType begin, IteratorType end, Range& results )
     269                 :            : {
     270 [ +  - ][ #  # ]:        175 :     Range::iterator insert = results.begin();
         [ +  - ][ #  # ]
                 [ +  - ]
     271 [ +  - ][ +  - ]:       2829 :     for( IteratorType i = begin; i != end; ++i )
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
                 [ +  + ]
     272 [ +  - ][ +  - ]:       2654 :         if( compare( i->second ) ) insert = results.insert( insert, i->first );
         [ +  + ][ +  - ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
                 [ +  - ]
     273                 :        175 : }
     274                 :            : 
     275                 :            : template < class Functor, class IteratorType >
     276                 :            : static inline void find_tag_values( Functor compare, IteratorType begin, IteratorType end,
     277                 :            :                                     std::vector< EntityHandle >& results )
     278                 :            : {
     279                 :            :     for( IteratorType i = begin; i != end; ++i )
     280                 :            :         if( compare( i->second ) ) results.push_back( i->first );
     281                 :            : }
     282                 :            : 
     283                 :            : template < class Functor, class TagMap >
     284                 :       1203 : static inline void find_map_values( Functor compare, Range::const_iterator lower, Range::const_iterator upper,
     285                 :            :                                     const TagMap& tag_map, Range& results )
     286                 :            : {
     287 [ +  - ][ #  # ]:       1203 :     Range::iterator insert = results.begin();
         [ #  # ][ +  - ]
                 [ +  - ]
     288 [ +  - ][ +  - ]:     279956 :     for( ; lower != upper; ++lower )
         [ +  + ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ +  - ]
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
                 [ +  + ]
     289                 :            :     {
     290 [ +  - ][ +  - ]:     278753 :         typename TagMap::const_iterator i = tag_map.find( *lower );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     291 [ +  - ][ +  - ]:     278753 :         if( i != tag_map.end() && compare( i->second ) ) insert = results.insert( insert, *lower );
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
         [ +  + ][ +  - ]
         [ +  - ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
         [ +  + ][ +  - ]
         [ +  - ][ #  # ]
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
         [ +  + ][ +  - ]
         [ +  + ][ +  - ]
         [ +  - ][ #  # ]
     292                 :            :     }
     293                 :       1203 : }
     294                 :            : 
     295                 :            : /** Find all entities for which a tag has a specific value
     296                 :            :  *\param IteratorType : an iterator that has map behavior:
     297                 :            :  *                      the value of 'first' is the entity handle.
     298                 :            :  *                      the value of 'second' is a pointer to the tag data.
     299                 :            :  *\param ContainerType : std::vector<EntityHandle> or Range
     300                 :            :  */
     301                 :            : template < class IteratorType, class ContainerType >
     302                 :        175 : static inline void find_tag_values_equal( const TagInfo& tag_info, const void* value, int size, IteratorType begin,
     303                 :            :                                           IteratorType end, ContainerType& results )
     304                 :            : {
     305   [ +  +  +  - ]:        175 :     switch( tag_info.get_data_type() )
     306                 :            :     {
     307                 :            :         case MB_TYPE_INTEGER:
     308         [ +  - ]:        139 :             if( size == sizeof( int ) )
     309         [ +  - ]:        139 :                 find_tag_values< TagOneIntEqual, IteratorType >( TagOneIntEqual( value ), begin, end, results );
     310                 :            :             else
     311         [ #  # ]:          0 :                 find_tag_values< TagIntsEqual, IteratorType >( TagIntsEqual( value, size ), begin, end, results );
     312                 :        139 :             break;
     313                 :            : 
     314                 :            :         case MB_TYPE_DOUBLE:
     315         [ +  - ]:          1 :             if( size == sizeof( double ) )
     316         [ +  - ]:          1 :                 find_tag_values< TagOneDoubleEqual, IteratorType >( TagOneDoubleEqual( value ), begin, end, results );
     317                 :            :             else
     318         [ #  # ]:          0 :                 find_tag_values< TagDoublesEqual, IteratorType >( TagDoublesEqual( value, size ), begin, end, results );
     319                 :          1 :             break;
     320                 :            : 
     321                 :            :         case MB_TYPE_HANDLE:
     322         [ +  - ]:         35 :             if( size == sizeof( EntityHandle ) )
     323         [ +  - ]:         35 :                 find_tag_values< TagOneHandleEqual, IteratorType >( TagOneHandleEqual( value ), begin, end, results );
     324                 :            :             else
     325         [ #  # ]:          0 :                 find_tag_values< TagHandlesEqual, IteratorType >( TagHandlesEqual( value, size ), begin, end, results );
     326                 :         35 :             break;
     327                 :            : 
     328                 :            :         default:
     329         [ #  # ]:          0 :             find_tag_values< TagBytesEqual, IteratorType >( TagBytesEqual( value, size ), begin, end, results );
     330                 :          0 :             break;
     331                 :            :     }
     332                 :        175 : }
     333                 :            : template < class IteratorType, class ContainerType >
     334                 :          0 : static inline void find_tag_varlen_values_equal( const TagInfo& tag_info, const void* value, int size,
     335                 :            :                                                  IteratorType begin, IteratorType end, ContainerType& results )
     336                 :            : {
     337   [ #  #  #  # ]:          0 :     switch( tag_info.get_data_type() )
     338                 :            :     {
     339                 :            :         case MB_TYPE_INTEGER:
     340         [ #  # ]:          0 :             find_tag_values< TagVarIntsEqual, IteratorType >( TagVarIntsEqual( value, size ), begin, end, results );
     341                 :          0 :             break;
     342                 :            :         case MB_TYPE_DOUBLE:
     343         [ #  # ]:          0 :             find_tag_values< TagVarDoublesEqual, IteratorType >( TagVarDoublesEqual( value, size ), begin, end,
     344                 :          0 :                                                                  results );
     345                 :          0 :             break;
     346                 :            :         case MB_TYPE_HANDLE:
     347         [ #  # ]:          0 :             find_tag_values< TagVarHandlesEqual, IteratorType >( TagVarHandlesEqual( value, size ), begin, end,
     348                 :          0 :                                                                  results );
     349                 :          0 :             break;
     350                 :            :         default:
     351         [ #  # ]:          0 :             find_tag_values< TagVarBytesEqual, IteratorType >( TagVarBytesEqual( value, size ), begin, end, results );
     352                 :          0 :             break;
     353                 :            :     }
     354                 :          0 : }
     355                 :            : 
     356                 :            : /** Find all entities for which a tag has a specific value
     357                 :            :  *\param IteratorType : an iterator that has map behavior:
     358                 :            :  *                      the value of 'first' is the entity handle.
     359                 :            :  *                      the value of 'second' is a pointer to the tag data.
     360                 :            :  *\param ContainerType : std::vector<EntityHandle> or Range
     361                 :            :  */
     362                 :            : template < class TagMap >
     363                 :       1203 : static inline void find_map_values_equal( const TagInfo& tag_info, const void* value, int size,
     364                 :            :                                           Range::const_iterator begin, Range::const_iterator end, const TagMap& tag_map,
     365                 :            :                                           Range& results )
     366                 :            : {
     367   [ +  -  +  + ]:       1203 :     switch( tag_info.get_data_type() )
     368                 :            :     {
     369                 :            :         case MB_TYPE_INTEGER:
     370         [ +  - ]:       1151 :             if( size == sizeof( int ) )
     371         [ +  - ]:       1151 :                 find_map_values< TagOneIntEqual, TagMap >( TagOneIntEqual( value ), begin, end, tag_map, results );
     372                 :            :             else
     373         [ #  # ]:          0 :                 find_map_values< TagIntsEqual, TagMap >( TagIntsEqual( value, size ), begin, end, tag_map, results );
     374                 :       1151 :             break;
     375                 :            : 
     376                 :            :         case MB_TYPE_DOUBLE:
     377         [ #  # ]:          0 :             if( size == sizeof( double ) )
     378         [ #  # ]:          0 :                 find_map_values< TagOneDoubleEqual, TagMap >( TagOneDoubleEqual( value ), begin, end, tag_map,
     379                 :          0 :                                                               results );
     380                 :            :             else
     381         [ #  # ]:          0 :                 find_map_values< TagDoublesEqual, TagMap >( TagDoublesEqual( value, size ), begin, end, tag_map,
     382                 :          0 :                                                             results );
     383                 :          0 :             break;
     384                 :            : 
     385                 :            :         case MB_TYPE_HANDLE:
     386         [ +  - ]:         35 :             if( size == sizeof( EntityHandle ) )
     387         [ +  - ]:         35 :                 find_map_values< TagOneHandleEqual, TagMap >( TagOneHandleEqual( value ), begin, end, tag_map,
     388                 :         70 :                                                               results );
     389                 :            :             else
     390         [ #  # ]:          0 :                 find_map_values< TagHandlesEqual, TagMap >( TagHandlesEqual( value, size ), begin, end, tag_map,
     391                 :          0 :                                                             results );
     392                 :         35 :             break;
     393                 :            : 
     394                 :            :         default:
     395         [ +  - ]:         17 :             find_map_values< TagBytesEqual, TagMap >( TagBytesEqual( value, size ), begin, end, tag_map, results );
     396                 :         17 :             break;
     397                 :            :     }
     398                 :       1203 : }
     399                 :            : template < class TagMap >
     400                 :          0 : static inline void find_map_varlen_values_equal( const TagInfo& tag_info, const void* value, int size,
     401                 :            :                                                  Range::const_iterator begin, Range::const_iterator end,
     402                 :            :                                                  const TagMap& tag_map, Range& results )
     403                 :            : {
     404   [ #  #  #  # ]:          0 :     switch( tag_info.get_data_type() )
     405                 :            :     {
     406                 :            :         case MB_TYPE_INTEGER:
     407         [ #  # ]:          0 :             find_map_values< TagVarIntsEqual, TagMap >( TagVarIntsEqual( value, size ), begin, end, tag_map, results );
     408                 :          0 :             break;
     409                 :            :         case MB_TYPE_DOUBLE:
     410         [ #  # ]:          0 :             find_map_values< TagVarDoublesEqual, TagMap >( TagVarDoublesEqual( value, size ), begin, end, tag_map,
     411                 :          0 :                                                            results );
     412                 :          0 :             break;
     413                 :            :         case MB_TYPE_HANDLE:
     414         [ #  # ]:          0 :             find_map_values< TagVarHandlesEqual, TagMap >( TagVarHandlesEqual( value, size ), begin, end, tag_map,
     415                 :          0 :                                                            results );
     416                 :          0 :             break;
     417                 :            :         default:
     418         [ #  # ]:          0 :             find_map_values< TagVarBytesEqual, TagMap >( TagVarBytesEqual( value, size ), begin, end, tag_map,
     419                 :          0 :                                                          results );
     420                 :          0 :             break;
     421                 :            :     }
     422                 :          0 : }
     423                 :            : 
     424                 :            : /** Iterator to use in find_tag_values_equal for arrays of data */
     425                 :            : class ByteArrayIterator
     426                 :            : {
     427                 :            :   public:
     428                 :            :     typedef std::pair< EntityHandle, const char* > data_type;
     429                 :            : 
     430                 :            :   private:
     431                 :            :     size_t step;
     432                 :            :     data_type data;
     433                 :            : 
     434                 :            :   public:
     435                 :        175 :     ByteArrayIterator( EntityHandle start_handle, const void* data_array, size_t tag_size )
     436         [ +  - ]:        175 :         : step( tag_size ), data( start_handle, reinterpret_cast< const char* >( data_array ) )
     437                 :            : 
     438                 :            :     {
     439                 :        175 :     }
     440                 :        175 :     ByteArrayIterator( EntityHandle start_handle, const void* data_array, const TagInfo& tag_info )
     441                 :        350 :         : step( tag_info.get_size() == MB_VARIABLE_LENGTH ? sizeof( VarLenTag ) : tag_info.get_size() ),
     442 [ -  + ][ +  - ]:        350 :           data( start_handle, reinterpret_cast< const char* >( data_array ) )
     443                 :            :     {
     444                 :        175 :     }
     445                 :            :     bool operator==( const ByteArrayIterator& other ) const
     446                 :            :     {
     447                 :            :         return data.first == other.data.first;
     448                 :            :     }
     449                 :       2829 :     bool operator!=( const ByteArrayIterator& other ) const
     450                 :            :     {
     451                 :       2829 :         return data.first != other.data.first;
     452                 :            :     }
     453                 :       2654 :     ByteArrayIterator& operator++()
     454                 :            :     {
     455                 :       2654 :         ++data.first;
     456                 :       2654 :         data.second += step;
     457                 :       2654 :         return *this;
     458                 :            :     }
     459                 :            :     ByteArrayIterator operator++( int )
     460                 :            :     {
     461                 :            :         ByteArrayIterator result( *this );
     462                 :            :         operator++();
     463                 :            :         return result;
     464                 :            :     }
     465                 :            :     ByteArrayIterator& operator--()
     466                 :            :     {
     467                 :            :         --data.first;
     468                 :            :         data.second -= step;
     469                 :            :         return *this;
     470                 :            :     }
     471                 :            :     ByteArrayIterator operator--( int )
     472                 :            :     {
     473                 :            :         ByteArrayIterator result( *this );
     474                 :            :         operator--();
     475                 :            :         return result;
     476                 :            :     }
     477                 :          0 :     ByteArrayIterator& operator+=( size_t amt )
     478                 :            :     {
     479                 :          0 :         data.first += amt;
     480                 :          0 :         data.second += amt * step;
     481                 :          0 :         return *this;
     482                 :            :     }
     483                 :            :     ByteArrayIterator& operator-=( size_t amt )
     484                 :            :     {
     485                 :            :         data.first -= amt;
     486                 :            :         data.second -= amt * step;
     487                 :            :         return *this;
     488                 :            :     }
     489                 :            :     EntityHandle operator-( const ByteArrayIterator& other ) const
     490                 :            :     {
     491                 :            :         return data.first - other.data.first;
     492                 :            :     }
     493                 :            :     const data_type& operator*() const
     494                 :            :     {
     495                 :            :         return data;
     496                 :            :     }
     497                 :       2828 :     const data_type* operator->() const
     498                 :            :     {
     499                 :       2828 :         return &data;
     500                 :            :     }
     501                 :            : };
     502                 :            : 
     503                 :        209 : static inline std::pair< EntityType, EntityType > type_range( EntityType type )
     504                 :            : {
     505         [ +  + ]:        209 :     if( type == MBMAXTYPE )
     506         [ +  - ]:         88 :         return std::pair< EntityType, EntityType >( MBVERTEX, MBMAXTYPE );
     507                 :            :     else
     508                 :            :     {
     509                 :        121 :         EntityType next = type;
     510         [ +  - ]:        121 :         ++next;
     511         [ +  - ]:        209 :         return std::pair< EntityType, EntityType >( type, next );
     512                 :            :     }
     513                 :            : }
     514                 :            : 
     515                 :            : /** Dummy container that counts insertions rather than maintaining a list of entities */
     516                 :            : class InsertCount
     517                 :            : {
     518                 :            :   private:
     519                 :            :     size_t mCount;
     520                 :            : 
     521                 :            :   public:
     522                 :         36 :     InsertCount( size_t initial_count = 0 ) : mCount( initial_count ) {}
     523                 :            : 
     524                 :            :     typedef int iterator;
     525                 :         36 :     iterator begin() const
     526                 :            :     {
     527                 :         36 :         return 0;
     528                 :            :     }
     529                 :         40 :     iterator end() const
     530                 :            :     {
     531                 :         40 :         return mCount;
     532                 :            :     }
     533                 :          0 :     iterator insert( iterator /* hint */, EntityHandle first, EntityHandle last )
     534                 :            :     {
     535                 :          0 :         mCount += last - first + 1;
     536                 :          0 :         return end();
     537                 :            :     }
     538                 :          4 :     iterator insert( iterator /* hint */, EntityHandle /* value */ )
     539                 :            :     {
     540                 :          4 :         ++mCount;
     541                 :          4 :         return end();
     542                 :            :     }
     543                 :            : };
     544                 :            : 
     545                 :            : }  // namespace moab
     546                 :            : 
     547                 :            : #endif

Generated by: LCOV version 1.11