Branch data Line data Source code
1 : : #ifndef MB_SYS_UTIL_HPP
2 : : #define MB_SYS_UTIL_HPP
3 : :
4 : : #include <string.h> // for size_t
5 : : #include <stdio.h>
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 : 1 : inline bool little_endian()
51 : : {
52 : 1 : const unsigned one = 1;
53 : 1 : 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 : 1 : 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 : 1 : byteswap4( data, num_elem );
96 : 1 : break;
97 : : case 8:
98 : : byteswap8( data, num_elem );
99 : : break;
100 : : default:
101 : : byteswap( data, sizeof( T ), num_elem );
102 : : break;
103 : : }
104 : 1 : }
105 : :
106 : : } // namespace SysUtil
107 : :
108 : : } // namespace moab
109 : :
110 : : #endif
|