00001
00064 #ifndef INC_MI32_MEMBUF_H
00065 #define INC_MI32_MEMBUF_H
00066
00067 #ifndef INC_MI32_STDDEFNS_H
00068 #include <mi32/stddefns.h>
00069 #endif
00070
00071 #if defined(__cplusplus)
00072
00076
00078 inline char SwapBytes (
00079 char& value
00080 ) {
00081 return (value);
00082 }
00083
00085 inline INT8 SwapBytes (
00086 INT8& value
00087 ) {
00088 return (value);
00089 }
00090
00092 inline UINT8 SwapBytes (
00093 UINT8& value
00094 ) {
00095 return (value);
00096 }
00097
00099 inline INT16 SwapBytes (
00100 INT16& value
00101 ) {
00102 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00103 UINT8 tmp = p[0]; p[0] = p[1]; p[1] = tmp;
00104 return (value);
00105 }
00106
00108 inline UINT16 SwapBytes (
00109 UINT16& value
00110 ) {
00111 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00112 UINT8 tmp = p[0]; p[0] = p[1]; p[1] = tmp;
00113 return (value);
00114 }
00115
00116 #if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER >= 1400)
00118 inline UINT16 SwapBytes (
00119 MIUNICODE& value
00120 ) {
00121 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00122 UINT8 tmp = p[0]; p[0] = p[1]; p[1] = tmp;
00123 return (value);
00124 }
00125 #endif
00126
00128 inline INT32 SwapBytes (
00129 INT32& value
00130 ) {
00131 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00132 UINT8 tmp = p[0]; p[0] = p[3]; p[3] = tmp;
00133 tmp = p[1]; p[1] = p[2]; p[2] = tmp;
00134 return (value);
00135 }
00136
00138 inline UINT32 SwapBytes (
00139 UINT32& value
00140 ) {
00141 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00142 UINT8 tmp = p[0]; p[0] = p[3]; p[3] = tmp;
00143 tmp = p[1]; p[1] = p[2]; p[2] = tmp;
00144 return (value);
00145 }
00146
00148 inline float SwapBytes (
00149 float& value
00150 ) {
00151 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00152 UINT8 tmp = p[0]; p[0] = p[3]; p[3] = tmp;
00153 tmp = p[1]; p[1] = p[2]; p[2] = tmp;
00154 return (value);
00155 }
00156
00158 inline INT64 SwapBytes (
00159 INT64& value
00160 ) {
00161 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00162 UINT8 tmp = p[0]; p[0] = p[7]; p[7] = tmp;
00163 tmp = p[1]; p[1] = p[6]; p[6] = tmp;
00164 tmp = p[2]; p[2] = p[5]; p[5] = tmp;
00165 tmp = p[3]; p[3] = p[4]; p[4] = tmp;
00166 return (value);
00167 }
00168
00170 inline UINT64 SwapBytes (
00171 UINT64& value
00172 ) {
00173 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00174 UINT8 tmp = p[0]; p[0] = p[7]; p[7] = tmp;
00175 tmp = p[1]; p[1] = p[6]; p[6] = tmp;
00176 tmp = p[2]; p[2] = p[5]; p[5] = tmp;
00177 tmp = p[3]; p[3] = p[4]; p[4] = tmp;
00178 return (value);
00179 }
00180
00182 inline double SwapBytes (
00183 double& value
00184 ) {
00185 UINT8 *p = reinterpret_cast<UINT8*>(&value);
00186 UINT8 tmp = p[0]; p[0] = p[7]; p[7] = tmp;
00187 tmp = p[1]; p[1] = p[6]; p[6] = tmp;
00188 tmp = p[2]; p[2] = p[5]; p[5] = tmp;
00189 tmp = p[3]; p[3] = p[4]; p[4] = tmp;
00190 return (value);
00191 }
00192
00194 template <class _BUF>
00195 inline void SwapBytes (
00196 _BUF *alist,
00197 INT32 num
00198 ) {
00199 for (INT32 _xy_ = 0; (_xy_ < num); ++_xy_) SwapBytes(alist[_xy_]);
00200 return;
00201 }
00202
00204 inline void SwapBytes2 (
00205 void *data,
00206 int num
00207 ) {
00208 SwapBytes(static_cast<UINT16*>(data), num);
00209 return;
00210 }
00211
00213 inline void SwapBytes4 (
00214 void *data,
00215 int num
00216 ) {
00217 SwapBytes(static_cast<UINT32*>(data), num);
00218 return;
00219 }
00220
00222 inline void SwapBytes8 (
00223 void *data,
00224 int num
00225 ) {
00226 SwapBytes(static_cast<double*>(data), num);
00227 return;
00228 }
00229
00230 #endif
00231
00232 #ifndef GENERATING_DOXYGEN_OUTPUT
00233 extern UINT8 _bitrevtable[];
00234 #endif
00235
00237 #if defined(__cplusplus)
00238 inline UINT8 bitrev (
00239 UINT8 b
00240 ) {
00241 return (_bitrevtable[b]);
00242 }
00243 #else
00244 #define bitrev(b) _bitrevtable[b]
00245 #endif
00246
00251 inline int getbit (
00252 const UINT8 *array,
00253 INT32 index
00254 ) {
00255 return ((array[index>>3] >> (index & 7)) & 1);
00256 }
00257
00261 inline int getbitn (
00262 const UINT8 *array,
00263 INT32 index
00264 ) {
00265 if (array == 0) return (0);
00266 return ((array[index>>3] >> (index & 7)) & 1);
00267 }
00268
00270 inline void memswap (
00271 void *vb1,
00272 void *vb2,
00273 int count
00274 ) {
00275 UINT8* b1 = static_cast<UINT8*>(vb1);
00276 UINT8* b2 = static_cast<UINT8*>(vb2);
00277
00278 for (int i = 0 ; i < count ; ++i, ++b1, ++b2) {
00279 UINT8 t = *b1; *b1 = *b2 ; *b2 = t;
00280 }
00281 }
00282
00284 inline void putbit (
00285 UINT8 *array,
00286 INT32 index,
00287 int value
00288 ) {
00289 if (value)
00290 array[index >> 3] |= 1 << (index & 7);
00291 else
00292 array[index >> 3] &= ~(1 << (index & 7));
00293 }
00294
00295
00296 #if defined(__cplusplus)
00297 extern "C" {
00298 #endif
00299
00301 void bitrevlin (
00302 UINT8 *buf,
00303 int numbytes
00304 );
00305
00310 void packbits (
00311 UINT8 *dest,
00312 UINT8 *source,
00313 int count
00314 );
00315
00320 void packbitsr (
00321 UINT8 *dest,
00322 UINT8 *source,
00323 int count
00324 );
00325
00327 void revbuffer (
00328 void *vbuf,
00329 int cols
00330 );
00331
00333 void SwapDataInBuffer (
00334 void *data,
00335 INT32 NumItems,
00336 int ItemSize
00337 );
00338
00339 #if defined(__cplusplus)
00340 }
00341 #endif
00342
00344
00345 #endif