Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
SysUtil.cpp
Go to the documentation of this file.
1 #include "SysUtil.hpp"
2 
3 #include <fstream>
4 #include <algorithm>
5 #include <cassert>
6 
7 #include "moab/EntityHandle.hpp"
8 
9 namespace moab
10 {
11 
12 namespace SysUtil
13 {
14 
15  void setmem( void* mem, const void* value, unsigned value_size, size_t num_elem )
16  {
17  if( !num_elem ) return;
18 
19  char* array = reinterpret_cast< char* >( mem );
20  memcpy( array, value, value_size );
21  size_t count;
22  for( count = 1; count * 2 < num_elem; count *= 2 )
23  memcpy( array + count * value_size, array, count * value_size );
24  memcpy( array + count * value_size, array, ( num_elem - count ) * value_size );
25  }
26 
27  long filesize( FILE* filp )
28  {
29  long curr_pos = ftell( filp );
30  if( fseek( filp, 0, SEEK_END ) ) return -1;
31 
32  long length = ftell( filp );
33  if( fseek( filp, curr_pos, SEEK_SET ) )
34  {
35  assert( 0 );
36  return -2;
37  }
38 
39  return length;
40  }
41 
42  long filesize( std::ifstream& str )
43  {
44  std::istream::pos_type curr_pos = str.tellg();
45  if( !str.seekg( 0, std::ios_base::end ) ) return -1;
46 
47  long length = static_cast< long >( str.tellg() );
48  if( !str.seekg( curr_pos, std::ios_base::beg ) )
49  {
50  assert( 0 );
51  return -2;
52  }
53 
54  return length;
55  }
56 
57  void byteswap( void* data, unsigned value_size, size_t num_elem )
58  {
59  char* mem = reinterpret_cast< char* >( data );
60  char* const end = mem + value_size * num_elem;
61  for( ; mem < end; mem += value_size )
62  {
63  unsigned i = 0, j = value_size - 1;
64  while( i < j )
65  std::swap( mem[i++], mem[j--] );
66  }
67  }
68 
69  inline static uint16_t swap_bytes( uint16_t value )
70  {
71  return ( value >> 8 ) | ( value << 8 );
72  }
73 
74  inline static uint32_t swap_bytes( uint32_t value )
75  {
76  return ( ( value /*& (uint32_t)0xFF000000*/ ) >> 24 ) | ( ( value & (uint32_t)0x00FF0000 ) >> 8 ) |
77  ( ( 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  inline static uint64_t swap_bytes( uint64_t value )
90  {
91  return ( ( value /*& m64b8*/ ) >> 56 ) | ( ( value & m64b7 ) >> 40 ) | ( ( value & m64b6 ) >> 24 ) |
92  ( ( value & m64b5 ) >> 8 ) | ( ( value & m64b4 ) << 8 ) | ( ( value & m64b3 ) << 24 ) |
93  ( ( 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  void byteswap2( void* data, size_t num_elem )
129  {
130  uint16_t* mem = reinterpret_cast< uint16_t* >( data );
131  uint16_t* end = mem + num_elem;
132  for( ; mem < end; ++mem )
133  *mem = swap_bytes( *mem );
134  }
135 
136  void byteswap4( void* data, size_t num_elem )
137  {
138  uint32_t* mem = reinterpret_cast< uint32_t* >( data );
139  uint32_t* end = mem + num_elem;
140  for( ; mem < end; ++mem )
141  *mem = swap_bytes( *mem );
142  }
143 
144  void byteswap8( void* data, size_t num_elem )
145  {
146  if( sizeof( void* ) >= 8 )
147  {
148  uint64_t* mem = reinterpret_cast< uint64_t* >( data );
149  uint64_t* end = mem + num_elem;
150  for( ; mem < end; ++mem )
151  *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  }
165 
166 } // namespace SysUtil
167 
168 } // namespace moab