Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SysUtil.hpp
Go to the documentation of this file.
1 #ifndef MB_SYS_UTIL_HPP 2 #define MB_SYS_UTIL_HPP 3  4 #include <cstring> // for size_t 5 #include <cstdio> 6 #include <iosfwd> 7  8 namespace moab 9 { 10  11 namespace SysUtil 12 { 13  14  /**\brief Similar to memset, but accepts values larger than 1 char 15  * 16  * Set block of memory to repeating copies of a sequene of bytes. 17  *\param mem Pointer to start of memory block to initialize 18  *\param value Byte sequence to initialize mem with 19  *\param value_size Size of 'value' 20  *\param num_elem Size of 'mem' as a multiple of value_size (the number of 21  * copies of 'value' to write into 'mem'.) 22  */ 23  void setmem( void* mem, const void* value, unsigned value_size, size_t num_elem ); 24  25  /**\brief Get size of file (if it is a regular file) 26  * 27  * Get size of regular file. 28  *\return - file size if known 29  * - -1 if file size cannot be determined (e.g. a pipe) 30  * - -2 if an unexpected failure occured (may indicate change 31  * in file position.) 32  */ 33  long filesize( FILE* filp ); 34  35  /**\brief Get size of file (if it is a regular file) 36  * 37  * Get size of regular file. 38  *\return - file size if known 39  * - -1 if file size cannot be determined (e.g. a pipe) 40  * - -2 if an unexpected failure occured (may indicate change 41  * in file position.) 42  */ 43  long filesize( std::ifstream& str ); 44  45  /**\brief Check if platform is little-endian 46  * 47  * Check if platform is little-endian (least significant 48  * byte at highest memory address.) 49  */ 50  inline bool little_endian() 51  { 52  const unsigned one = 1; 53  return !*( (char*)&one ); 54  } 55  56  /**\brief Check if platform is big-endian 57  * 58  * Check if platform is big-endian (least significant 59  * byte at lowest memory address.) 60  */ 61  inline bool big_endian() 62  { 63  const unsigned one = 1; 64  return !( ( (char*)&one )[sizeof( unsigned ) - 1] ); 65  } 66  67  /**\brief Swap byte order (e.g. change from big-endian to little-endian) 68  * 69  * Reverse byte order or array of values. 70  *\param data Pointer to beginning of memory block to modify 71  *\param values_size Size of one value 72  *\param num_elem Number of values of size 'value_size' in 'data' 73  */ 74  void byteswap( void* data, unsigned value_size, size_t num_elem ); 75  76  /**\brief Alternate byteswap optimized for 2-byte values */ 77  void byteswap2( void* data, size_t num_elem ); 78  /**\brief Alternate byteswap optimized for 4-byte values */ 79  void byteswap4( void* data, size_t num_elem ); 80  /**\brief Alternate byteswap optimized for 8-byte values */ 81  void byteswap8( void* data, size_t num_elem ); 82  83  /**\brief Type-specific byte swap */ 84  template < typename T > 85  inline void byteswap( T* data, size_t num_elem ) 86  { 87  switch( sizeof( T ) ) 88  { 89  case 1: 90  break; 91  case 2: 92  byteswap2( data, num_elem ); 93  break; 94  case 4: 95  byteswap4( data, num_elem ); 96  break; 97  case 8: 98  byteswap8( data, num_elem ); 99  break; 100  default: 101  byteswap( data, sizeof( T ), num_elem ); 102  break; 103  } 104  } 105  106 } // namespace SysUtil 107  108 } // namespace moab 109  110 #endif