LCOV - code coverage report
Current view: top level - src - SysUtil.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 22 56 39.3 %
Date: 2020-12-16 07:07:30 Functions: 4 10 40.0 %
Branches: 7 38 18.4 %

           Branch data     Line data    Source code
       1                 :            : #include "SysUtil.hpp"
       2                 :            : 
       3                 :            : #include <fstream>
       4                 :            : #include <algorithm>
       5                 :            : #include <assert.h>
       6                 :            : 
       7                 :            : #include "moab/EntityHandle.hpp"
       8                 :            : 
       9                 :            : namespace moab
      10                 :            : {
      11                 :            : 
      12                 :            : namespace SysUtil
      13                 :            : {
      14                 :            : 
      15                 :      10346 :     void setmem( void* mem, const void* value, unsigned value_size, size_t num_elem )
      16                 :            :     {
      17         [ -  + ]:      10346 :         if( !num_elem ) return;
      18                 :            : 
      19                 :      10346 :         char* array = reinterpret_cast< char* >( mem );
      20                 :      10346 :         memcpy( array, value, value_size );
      21                 :            :         size_t count;
      22         [ +  + ]:      20542 :         for( count = 1; count * 2 < num_elem; count *= 2 )
      23                 :      10196 :             memcpy( array + count * value_size, array, count * value_size );
      24                 :      10346 :         memcpy( array + count * value_size, array, ( num_elem - count ) * value_size );
      25                 :            :     }
      26                 :            : 
      27                 :          1 :     long filesize( FILE* filp )
      28                 :            :     {
      29                 :          1 :         long curr_pos = ftell( filp );
      30         [ -  + ]:          1 :         if( fseek( filp, 0, SEEK_END ) ) return -1;
      31                 :            : 
      32                 :          1 :         long length = ftell( filp );
      33         [ -  + ]:          1 :         if( fseek( filp, curr_pos, SEEK_SET ) )
      34                 :            :         {
      35                 :          0 :             assert( 0 );
      36                 :            :             return -2;
      37                 :            :         }
      38                 :            : 
      39                 :          1 :         return length;
      40                 :            :     }
      41                 :            : 
      42                 :          0 :     long filesize( std::ifstream& str )
      43                 :            :     {
      44         [ #  # ]:          0 :         std::istream::pos_type curr_pos = str.tellg();
      45 [ #  # ][ #  # ]:          0 :         if( !str.seekg( 0, std::ios_base::end ) ) return -1;
                 [ #  # ]
      46                 :            : 
      47 [ #  # ][ #  # ]:          0 :         long length = static_cast< long >( str.tellg() );
      48 [ #  # ][ #  # ]:          0 :         if( !str.seekg( curr_pos, std::ios_base::beg ) )
         [ #  # ][ #  # ]
      49                 :            :         {
      50                 :          0 :             assert( 0 );
      51                 :            :             return -2;
      52                 :            :         }
      53                 :            : 
      54                 :          0 :         return length;
      55                 :            :     }
      56                 :            : 
      57                 :          0 :     void byteswap( void* data, unsigned value_size, size_t num_elem )
      58                 :            :     {
      59                 :          0 :         char* mem       = reinterpret_cast< char* >( data );
      60                 :          0 :         char* const end = mem + value_size * num_elem;
      61         [ #  # ]:          0 :         for( ; mem < end; mem += value_size )
      62                 :            :         {
      63                 :          0 :             unsigned i = 0, j = value_size - 1;
      64         [ #  # ]:          0 :             while( i < j )
      65                 :          0 :                 std::swap( mem[i++], mem[j--] );
      66                 :            :         }
      67                 :          0 :     }
      68                 :            : 
      69                 :          0 :     inline static uint16_t swap_bytes( uint16_t value )
      70                 :            :     {
      71                 :          0 :         return ( value >> 8 ) | ( value << 8 );
      72                 :            :     }
      73                 :            : 
      74                 :          1 :     inline static uint32_t swap_bytes( uint32_t value )
      75                 :            :     {
      76                 :          2 :         return ( ( value /*& (uint32_t)0xFF000000*/ ) >> 24 ) | ( ( value & (uint32_t)0x00FF0000 ) >> 8 ) |
      77                 :          1 :                ( ( value & (uint32_t)0x0000FF00 ) << 8 ) | ( ( value /*& (uint32_t)0X000000FF*/ ) << 24 );
      78                 :            :     }
      79                 :            : 
      80                 :            :     const uint64_t m64b1 = 0xFF;
      81                 :            :     const uint64_t m64b2 = m64b1 << 8;
      82                 :            :     const uint64_t m64b3 = m64b1 << 16;
      83                 :            :     const uint64_t m64b4 = m64b1 << 24;
      84                 :            :     const uint64_t m64b5 = m64b1 << 32;
      85                 :            :     const uint64_t m64b6 = m64b1 << 40;
      86                 :            :     const uint64_t m64b7 = m64b1 << 48;
      87                 :            :     // const uint64_t m64b8 = m64b1 << 56;
      88                 :            : 
      89                 :          0 :     inline static uint64_t swap_bytes( uint64_t value )
      90                 :            :     {
      91                 :          0 :         return ( ( value /*& m64b8*/ ) >> 56 ) | ( ( value & m64b7 ) >> 40 ) | ( ( value & m64b6 ) >> 24 ) |
      92                 :          0 :                ( ( value & m64b5 ) >> 8 ) | ( ( value & m64b4 ) << 8 ) | ( ( value & m64b3 ) << 24 ) |
      93                 :          0 :                ( ( value & m64b2 ) << 40 ) | ( ( value /*& m64b1*/ ) << 56 );
      94                 :            :     }
      95                 :            :     /*
      96                 :            :     inline static uint32_t swap_byte_pairs( uint32_t value )
      97                 :            :     {
      98                 :            :       return ((value & (uint32_t)0xFF000000) >> 8) |
      99                 :            :              ((value & (uint32_t)0x00FF0000) << 8) |
     100                 :            :              ((value & (uint32_t)0x0000FF00) >> 8) |
     101                 :            :              ((value & (uint32_t)0X000000FF) << 8);
     102                 :            :     }
     103                 :            : 
     104                 :            :     inline static uint64_t swap_byte_quads( uint64_t value )
     105                 :            :     {
     106                 :            :       return ((value & m64b8) >> 24) |
     107                 :            :              ((value & m64b7) >>  8) |
     108                 :            :              ((value & m64b6) <<  8) |
     109                 :            :              ((value & m64b5) << 24) |
     110                 :            :              ((value & m64b4) >> 24) |
     111                 :            :              ((value & m64b3) >>  8) |
     112                 :            :              ((value & m64b2) <<  8) |
     113                 :            :              ((value & m64b1) << 24);
     114                 :            :     }
     115                 :            : 
     116                 :            :     inline static uint64_t swap_byte_pairs( uint64_t value )
     117                 :            :     {
     118                 :            :       return ((value & m64b8) >> 8) |
     119                 :            :              ((value & m64b7) << 8) |
     120                 :            :              ((value & m64b6) >> 8) |
     121                 :            :              ((value & m64b5) << 8) |
     122                 :            :              ((value & m64b4) >> 8) |
     123                 :            :              ((value & m64b3) << 8) |
     124                 :            :              ((value & m64b2) >> 8) |
     125                 :            :              ((value & m64b1) << 8);
     126                 :            :     }
     127                 :            :     */
     128                 :          0 :     void byteswap2( void* data, size_t num_elem )
     129                 :            :     {
     130                 :          0 :         uint16_t* mem = reinterpret_cast< uint16_t* >( data );
     131                 :          0 :         uint16_t* end = mem + num_elem;
     132         [ #  # ]:          0 :         for( ; mem < end; ++mem )
     133                 :          0 :             *mem = swap_bytes( *mem );
     134                 :          0 :     }
     135                 :            : 
     136                 :          1 :     void byteswap4( void* data, size_t num_elem )
     137                 :            :     {
     138                 :          1 :         uint32_t* mem = reinterpret_cast< uint32_t* >( data );
     139                 :          1 :         uint32_t* end = mem + num_elem;
     140         [ +  + ]:          2 :         for( ; mem < end; ++mem )
     141                 :          1 :             *mem = swap_bytes( *mem );
     142                 :          1 :     }
     143                 :            : 
     144                 :          0 :     void byteswap8( void* data, size_t num_elem )
     145                 :            :     {
     146                 :            :         if( sizeof( void* ) >= 8 )
     147                 :            :         {
     148                 :          0 :             uint64_t* mem = reinterpret_cast< uint64_t* >( data );
     149                 :          0 :             uint64_t* end = mem + num_elem;
     150         [ #  # ]:          0 :             for( ; mem < end; ++mem )
     151                 :          0 :                 *mem = swap_bytes( *mem );
     152                 :            :         }
     153                 :            :         else
     154                 :            :         {
     155                 :            :             uint32_t* mem = reinterpret_cast< uint32_t* >( data );
     156                 :            :             uint32_t* end = mem + 2 * num_elem;
     157                 :            :             for( ; mem < end; mem += 2 )
     158                 :            :             {
     159                 :            :                 uint32_t tmp = swap_bytes( mem[0] );
     160                 :            :                 mem[0]       = swap_bytes( mem[1] );
     161                 :            :                 mem[1]       = tmp;
     162                 :            :             }
     163                 :            :         }
     164                 :          0 :     }
     165                 :            : 
     166                 :            : }  // namespace SysUtil
     167                 :            : 
     168                 :            : }  // namespace moab

Generated by: LCOV version 1.11