LCOV - code coverage report
Current view: top level - src - SequenceData.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 81 96 84.4 %
Date: 2020-12-16 07:07:30 Functions: 11 13 84.6 %
Branches: 39 64 60.9 %

           Branch data     Line data    Source code
       1                 :            : #include "SequenceData.hpp"
       2                 :            : #include "SysUtil.hpp"
       3                 :            : #include "VarLenTag.hpp"
       4                 :            : #include <assert.h>
       5                 :            : 
       6                 :            : namespace moab
       7                 :            : {
       8                 :            : 
       9                 :       2951 : SequenceData::~SequenceData()
      10                 :            : {
      11         [ +  + ]:       6535 :     for( int i = -numSequenceData; i <= (int)numTagData; ++i )
      12                 :       5030 :         free( arraySet[i] );
      13                 :       1505 :     free( arraySet - numSequenceData );
      14         [ -  + ]:       2951 : }
      15                 :            : 
      16                 :       3152 : void* SequenceData::create_data( int index, int bytes_per_ent, const void* initial_value )
      17                 :            : {
      18                 :       3152 :     char* array = (char*)malloc( bytes_per_ent * size() );
      19         [ +  + ]:       3152 :     if( initial_value ) SysUtil::setmem( array, initial_value, bytes_per_ent, size() );
      20                 :            : 
      21                 :       3152 :     arraySet[index] = array;
      22                 :       3152 :     return array;
      23                 :            : }
      24                 :            : 
      25                 :       2325 : void* SequenceData::create_sequence_data( int array_num, int bytes_per_ent, const void* initial_value )
      26                 :            : {
      27                 :       2325 :     const int index = -1 - array_num;
      28         [ -  + ]:       2325 :     assert( array_num < numSequenceData );
      29         [ -  + ]:       2325 :     assert( !arraySet[index] );
      30                 :       2325 :     return create_data( index, bytes_per_ent, initial_value );
      31                 :            : }
      32                 :            : 
      33                 :          0 : void* SequenceData::create_custom_data( int array_num, size_t total_bytes )
      34                 :            : {
      35                 :          0 :     const int index = -1 - array_num;
      36         [ #  # ]:          0 :     assert( array_num < numSequenceData );
      37         [ #  # ]:          0 :     assert( !arraySet[index] );
      38                 :            : 
      39                 :          0 :     void* array     = malloc( total_bytes );
      40                 :          0 :     arraySet[index] = array;
      41                 :          0 :     return array;
      42                 :            : }
      43                 :            : 
      44                 :        362 : SequenceData::AdjacencyDataType* SequenceData::allocate_adjacency_data()
      45                 :            : {
      46         [ -  + ]:        362 :     assert( !arraySet[0] );
      47                 :        362 :     const size_t s = sizeof( AdjacencyDataType* ) * size();
      48                 :        362 :     arraySet[0]    = malloc( s );
      49                 :        362 :     memset( arraySet[0], 0, s );
      50                 :        362 :     return reinterpret_cast< AdjacencyDataType* >( arraySet[0] );
      51                 :            : }
      52                 :            : 
      53                 :        812 : void SequenceData::increase_tag_count( unsigned amount )
      54                 :            : {
      55                 :        812 :     void** list     = arraySet - numSequenceData;
      56                 :        812 :     const size_t sz = sizeof( void* ) * ( numSequenceData + numTagData + amount + 1 );
      57                 :        812 :     void** new_list = (void**)realloc( list, sz );
      58         [ -  + ]:        812 :     if( !new_list )
      59                 :            :     {
      60                 :          0 :         fprintf( stderr, "SequenceData::increase_tag_count(): reallocation of list failed\n" );
      61                 :            :         // Note: free(list) will be called in the destructor
      62                 :          0 :         return;
      63                 :            :     }
      64                 :            :     else
      65                 :        812 :         list = new_list;
      66                 :        812 :     arraySet = list + numSequenceData;
      67                 :        812 :     memset( arraySet + numTagData + 1, 0, sizeof( void* ) * amount );
      68                 :        812 :     numTagData += amount;
      69                 :            : }
      70                 :            : 
      71                 :        827 : void* SequenceData::allocate_tag_array( int tag_num, int bytes_per_ent, const void* default_value )
      72                 :            : {
      73         [ +  + ]:        827 :     if( (unsigned)tag_num >= numTagData ) increase_tag_count( tag_num - numTagData + 1 );
      74                 :            : 
      75         [ -  + ]:        827 :     assert( !arraySet[tag_num + 1] );
      76                 :        827 :     return create_data( tag_num + 1, bytes_per_ent, default_value );
      77                 :            : }
      78                 :            : 
      79                 :          6 : SequenceData* SequenceData::subset( EntityHandle start, EntityHandle end, const int* sequence_data_sizes ) const
      80                 :            : {
      81         [ +  - ]:          6 :     return new SequenceData( this, start, end, sequence_data_sizes );
      82                 :            : }
      83                 :            : 
      84                 :          6 : SequenceData::SequenceData( const SequenceData* from, EntityHandle start, EntityHandle end,
      85                 :            :                             const int* sequence_data_sizes )
      86                 :          6 :     : numSequenceData( from->numSequenceData ), numTagData( from->numTagData ), startHandle( start ), endHandle( end )
      87                 :            : {
      88         [ -  + ]:          6 :     assert( start <= end );
      89         [ -  + ]:          6 :     assert( from != 0 );
      90         [ -  + ]:          6 :     assert( from->start_handle() <= start );
      91         [ -  + ]:          6 :     assert( from->end_handle() >= end );
      92                 :            : 
      93                 :          6 :     void** array        = (void**)malloc( sizeof( void* ) * ( numSequenceData + numTagData + 1 ) );
      94                 :          6 :     arraySet            = array + numSequenceData;
      95                 :          6 :     const size_t offset = start - from->start_handle();
      96                 :          6 :     const size_t count  = end - start + 1;
      97                 :            : 
      98         [ +  + ]:          8 :     for( int i = 0; i < numSequenceData; ++i )
      99                 :          2 :         copy_data_subset( -1 - i, sequence_data_sizes[i], from->get_sequence_data( i ), offset, count );
     100                 :          6 :     copy_data_subset( 0, sizeof( AdjacencyDataType* ), from->get_adjacency_data(), offset, count );
     101         [ -  + ]:          6 :     for( unsigned i = 1; i <= numTagData; ++i )
     102                 :          0 :         arraySet[i] = 0;
     103                 :          6 : }
     104                 :            : 
     105                 :          8 : void SequenceData::copy_data_subset( int index, int size_per_ent, const void* source, size_t offset, size_t count )
     106                 :            : {
     107         [ +  + ]:          8 :     if( !source )
     108                 :          6 :         arraySet[index] = 0;
     109                 :            :     else
     110                 :            :     {
     111                 :          2 :         arraySet[index] = malloc( count * size_per_ent );
     112                 :          2 :         memcpy( arraySet[index], (const char*)source + offset * size_per_ent, count * size_per_ent );
     113                 :            :     }
     114                 :          8 : }
     115                 :            : 
     116                 :         22 : void SequenceData::move_tag_data( SequenceData* destination, const int* tag_sizes, int num_tag_sizes )
     117                 :            : {
     118         [ -  + ]:         22 :     assert( destination->start_handle() >= start_handle() );
     119         [ -  + ]:         22 :     assert( destination->end_handle() <= end_handle() );
     120                 :         22 :     const size_t offset = destination->start_handle() - start_handle();
     121                 :         22 :     const size_t count  = destination->size();
     122         [ +  + ]:         22 :     if( destination->numTagData < numTagData ) destination->increase_tag_count( numTagData - destination->numTagData );
     123                 :            : 
     124         [ +  + ]:         33 :     for( unsigned i = 1; i <= numTagData; ++i )
     125                 :            :     {
     126         [ -  + ]:         11 :         if( !arraySet[i] ) continue;
     127                 :            : 
     128         [ -  + ]:         11 :         assert( i <= (unsigned)num_tag_sizes );
     129                 :            :         if( num_tag_sizes ) {}  // empty line to prevent compiler warning
     130                 :            : 
     131                 :         11 :         const int tag_size = tag_sizes[i - 1];
     132         [ +  - ]:         11 :         if( !destination->arraySet[i] ) destination->arraySet[i] = malloc( count * tag_size );
     133                 :         33 :         memcpy( destination->arraySet[i], reinterpret_cast< char* >( arraySet[i] ) + offset * tag_size,
     134                 :         11 :                 count * tag_size );
     135                 :            :     }
     136                 :         22 : }
     137                 :            : 
     138                 :          0 : void SequenceData::release_tag_data( const int* tag_sizes, int num_tag_sizes )
     139                 :            : {
     140         [ #  # ]:          0 :     assert( num_tag_sizes >= (int)numTagData );
     141                 :            :     if( num_tag_sizes ) {}  // empty line to prevent compiler warning
     142         [ #  # ]:          0 :     for( unsigned i = 0; i < numTagData; ++i )
     143                 :          0 :         release_tag_data( i, tag_sizes[i] );
     144                 :          0 : }
     145                 :            : 
     146                 :      11284 : void SequenceData::release_tag_data( int tag_num, int tag_size )
     147                 :            : {
     148         [ +  + ]:      11284 :     if( (unsigned)tag_num < numTagData )
     149                 :            :     {
     150 [ +  + ][ +  + ]:       8080 :         if( tag_size == MB_VARIABLE_LENGTH && arraySet[tag_num + 1] )
     151                 :            :         {
     152                 :         10 :             VarLenTag* iter      = reinterpret_cast< VarLenTag* >( arraySet[tag_num + 1] );
     153                 :         10 :             VarLenTag* const end = iter + size();
     154         [ +  + ]:    3145846 :             for( ; iter != end; ++iter )
     155                 :    3145836 :                 iter->clear();
     156                 :            :         }
     157                 :       8080 :         free( arraySet[tag_num + 1] );
     158                 :       8080 :         arraySet[tag_num + 1] = 0;
     159                 :            :     }
     160                 :      11284 : }
     161                 :            : 
     162                 :            : }  // namespace moab

Generated by: LCOV version 1.11