LCOV - code coverage report
Current view: top level - src - TagInfo.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 33 45 73.3 %
Date: 2020-12-16 07:07:30 Functions: 5 6 83.3 %
Branches: 28 68 41.2 %

           Branch data     Line data    Source code
       1                 :            : #include "TagInfo.hpp"
       2                 :            : #include "moab/Error.hpp"
       3                 :            : #include "moab/ErrorHandler.hpp"
       4                 :            : #include <string.h> /* memcpy */
       5                 :            : #include <stdlib.h> /* realloc & free */
       6                 :            : #include <assert.h>
       7                 :            : 
       8                 :            : namespace moab
       9                 :            : {
      10                 :            : 
      11                 :       3037 : TagInfo::TagInfo( const char* name, int size, DataType type, const void* default_value, int default_value_size )
      12                 :            :     : mDefaultValue( NULL ), mMeshValue( NULL ), mDefaultValueSize( default_value_size ), mMeshValueSize( 0 ),
      13                 :       3037 :       mDataSize( size ), dataType( type )
      14                 :            : {
      15         [ +  + ]:       3037 :     if( default_value )
      16                 :            :     {
      17                 :       2236 :         mDefaultValue = malloc( mDefaultValueSize );
      18                 :       2236 :         memcpy( mDefaultValue, default_value, mDefaultValueSize );
      19                 :            :     }
      20 [ +  + ][ +  - ]:       3037 :     if( name ) mTagName = name;
      21                 :       3037 : }
      22                 :            : 
      23                 :       6006 : TagInfo::~TagInfo()
      24                 :            : {
      25                 :       3003 :     free( mDefaultValue );
      26                 :       3003 :     mDefaultValue     = 0;
      27                 :       3003 :     mDefaultValueSize = 0;
      28         [ -  + ]:       3003 : }
      29                 :            : 
      30                 :      36054 : int TagInfo::size_from_data_type( DataType t )
      31                 :            : {
      32                 :            :     static const int sizes[] = { 1, sizeof( int ), sizeof( double ), 1, sizeof( EntityHandle ), 0 };
      33                 :      36054 :     return sizes[t];
      34                 :            : }
      35                 :            : 
      36                 :       1477 : bool TagInfo::equals_default_value( const void* data, int size ) const
      37                 :            : {
      38         [ +  + ]:       1477 :     if( !get_default_value() ) return false;
      39                 :            : 
      40 [ -  + ][ #  # ]:       1360 :     if( variable_length() && size != get_default_value_size() ) return false;
                 [ -  + ]
      41                 :            : 
      42 [ +  - ][ +  + ]:       1360 :     if( !variable_length() && size >= 0 && size != get_size() ) return false;
         [ -  + ][ -  + ]
      43                 :            : 
      44         [ -  + ]:       1360 :     if( get_data_type() == MB_TYPE_BIT )
      45                 :            :     {
      46 [ #  # ][ #  # ]:          0 :         assert( get_size() <= 8 && get_default_value_size() == 1 );
      47                 :          0 :         unsigned char byte1 = *reinterpret_cast< const unsigned char* >( data );
      48                 :          0 :         unsigned char byte2 = *reinterpret_cast< const unsigned char* >( get_default_value() );
      49                 :          0 :         unsigned char mask  = (unsigned char)( ( 1u << get_size() ) - 1 );
      50                 :          0 :         return ( byte1 & mask ) == ( byte2 & mask );
      51                 :            :     }
      52                 :            :     else
      53                 :            :     {
      54                 :       1360 :         return !memcmp( data, get_default_value(), get_default_value_size() );
      55                 :            :     }
      56                 :            : }
      57                 :            : 
      58                 :            : // Check that all lengths are valid multiples of the type size.
      59                 :            : // Returns true if all lengths are valid, false otherwise.
      60                 :          0 : bool TagInfo::check_valid_sizes( const int* sizes, int num_sizes ) const
      61                 :            : {
      62                 :          0 :     const unsigned size = size_from_data_type( get_data_type() );
      63         [ #  # ]:          0 :     if( 1 == size ) return true;
      64                 :            : 
      65                 :          0 :     unsigned sum = 0;
      66         [ #  # ]:          0 :     for( int i = 0; i < num_sizes; ++i )
      67                 :          0 :         sum |= ( (unsigned)sizes[i] ) % size;
      68                 :            : 
      69                 :          0 :     return ( 0 == sum );
      70                 :            : }
      71                 :            : 
      72                 :       1017 : ErrorCode TagInfo::validate_lengths( Error* /* error_handler */, const int* lengths, size_t num_lengths ) const
      73                 :            : {
      74                 :       1017 :     int bits = 0;
      75         [ +  + ]:       1017 :     if( variable_length() )
      76                 :            :     {
      77 [ -  + ][ #  # ]:        997 :         if( !lengths ) { MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No size specified for variable-length tag" ); }
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      78                 :        997 :         const unsigned type_size = size_from_data_type( get_data_type() );
      79         [ +  + ]:        997 :         if( type_size == 1 ) return MB_SUCCESS;
      80         [ +  + ]:       2074 :         for( size_t i = 0; i < num_lengths; ++i )
      81                 :       1079 :             bits |= lengths[i] % type_size;
      82                 :            :     }
      83         [ +  + ]:         20 :     else if( lengths )
      84                 :            :     {
      85         [ +  + ]:         12 :         for( size_t i = 0; i < num_lengths; ++i )
      86                 :          6 :             bits |= lengths[i] - get_size();
      87                 :            :     }
      88         [ +  - ]:       1015 :     if( 0 == bits ) return MB_SUCCESS;
      89                 :            : 
      90 [ #  # ][ #  # ]:       1017 :     MB_SET_ERR( MB_INVALID_SIZE, "Tag data with invalid size" );
         [ #  # ][ #  # ]
                 [ #  # ]
      91                 :            : }
      92                 :            : 
      93                 :            : }  // namespace moab

Generated by: LCOV version 1.11