00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef VRS_IO_MEMORYUTIL_H
00047 #define VRS_IO_MEMORYUTIL_H
00048
00049 #include <vrs/config.h>
00050
00051 namespace VRS {
00052
00054 class VRS_CORE_API MemoryUtil {
00055 public:
00056
00057 enum Endianess { LE, BE, LittleEndian = LE, BigEndian = BE };
00058
00059 static char getInt8(MemoryUtil::Endianess endian,
00060 const void* data, unsigned int byteOffset = 0);
00061 static char getInt8LE(const void* data, unsigned int byteOffset = 0);
00062 static char getInt8BE(const void* data, unsigned int byteOffset = 0);
00066 static unsigned char getUInt8(MemoryUtil::Endianess endian,
00067 const void* data, unsigned int byteOffset = 0);
00068 static unsigned char getUInt8LE(const void* data, unsigned int byteOffset = 0);
00069 static unsigned char getUInt8BE(const void* data, unsigned int byteOffset = 0);
00073 static short getInt16(MemoryUtil::Endianess endian,
00074 const void* data, unsigned int byteOffset = 0);
00075 static short getInt16LE(const void* data, unsigned int byteOffset = 0);
00076 static short getInt16BE(const void* data, unsigned int byteOffset = 0);
00080 static unsigned short getUInt16(MemoryUtil::Endianess endian,
00081 const void* data, unsigned int byteOffset = 0);
00082 static unsigned short getUInt16LE(const void* data, unsigned int byteOffset = 0);
00083 static unsigned short getUInt16BE(const void* data, unsigned int byteOffset = 0);
00087 static int getInt32(MemoryUtil::Endianess endian,
00088 const void* data, unsigned int byteOffset = 0);
00089 static int getInt32LE(const void* data, unsigned int byteOffset = 0);
00090 static int getInt32BE(const void* data, unsigned int byteOffset = 0);
00094 static unsigned int getUInt32(MemoryUtil::Endianess endian,
00095 const void* data, unsigned int byteOffset = 0);
00096 static unsigned int getUInt32LE(const void* data, unsigned int byteOffset = 0);
00097 static unsigned int getUInt32BE(const void* data, unsigned int byteOffset = 0);
00101 static float getFloat32(MemoryUtil::Endianess endian,
00102 const void* data, unsigned int byteOffset = 0);
00103 static float getFloat32LE(const void* data, unsigned int byteOffset = 0);
00104 static float getFloat32BE(const void* data, unsigned int byteOffset = 0);
00108 static double getFloat64(MemoryUtil::Endianess endian,
00109 const void* data, unsigned int byteOffset = 0);
00110 static double getFloat64LE(const void* data, unsigned int byteOffset = 0);
00111 static double getFloat64BE(const void* data, unsigned int byteOffset = 0);
00115 template<typename T>
00116 static void getValue(MemoryUtil::Endianess endian,
00117 T& value, const void* data, unsigned int byteOffset = 0) {
00118 getBuiltin(data, byteOffset, endian, value);
00119 }
00120 template<typename T>
00121 static void getValueLE(T& value, const void* data, unsigned int byteOffset = 0) {
00122 getValue(LE, value, data, byteOffset);
00123 }
00124 template<typename T>
00125 static void getValueBE(T& value, const void* data, unsigned int byteOffset = 0) {
00126 getValue(BE, value, data, byteOffset);
00127 }
00132 static void putInt8(MemoryUtil::Endianess endian,
00133 char value, void* data, unsigned int byteOffset = 0);
00134 static void putInt8LE(char value, void* data, unsigned int byteOffset = 0);
00135 static void putInt8BE(char value, void* data, unsigned int byteOffset = 0);
00139 static void putUInt8(MemoryUtil::Endianess endian,
00140 unsigned char value, void* data, unsigned int byteOffset = 0);
00141 static void putUInt8LE(unsigned char value, void* data, unsigned int byteOffset = 0);
00142 static void putUInt8BE(unsigned char value, void* data, unsigned int byteOffset = 0);
00146 static void putInt16(MemoryUtil::Endianess endian,
00147 short value, void* data, unsigned int byteOffset = 0);
00148 static void putInt16LE(short value, void* data, unsigned int byteOffset = 0);
00149 static void putInt16BE(short value, void* data, unsigned int byteOffset = 0);
00153 static void putUInt16(MemoryUtil::Endianess endian,
00154 unsigned short value, void* data, unsigned int byteOffset = 0);
00155 static void putUInt16LE(unsigned short value, void* data, unsigned int byteOffset = 0);
00156 static void putUInt16BE(unsigned short value, void* data, unsigned int byteOffset = 0);
00160 static void putInt32(MemoryUtil::Endianess endian,
00161 int value, void* data, unsigned int byteOffset = 0);
00162 static void putInt32LE(int value, void* data, unsigned int byteOffset = 0);
00163 static void putInt32BE(int value, void* data, unsigned int byteOffset = 0);
00167 static void putUInt32(MemoryUtil::Endianess endian,
00168 unsigned int value, void* data, unsigned int byteOffset = 0);
00169 static void putUInt32LE(unsigned int value, void* data, unsigned int byteOffset = 0);
00170 static void putUInt32BE(unsigned int value, void* data, unsigned int byteOffset = 0);
00174 static void putFloat32(MemoryUtil::Endianess endian,
00175 float value, void* data, unsigned int byteOffset = 0);
00176 static void putFloat32LE(float value, void* data, unsigned int byteOffset = 0);
00177 static void putFloat32BE(float value, void* data, unsigned int byteOffset = 0);
00181 static void putFloat64(MemoryUtil::Endianess endian,
00182 double value, void* data, unsigned int byteOffset = 0);
00183 static void putFloat64LE(double value, void* data, unsigned int byteOffset = 0);
00184 static void putFloat64BE(double value, void* data, unsigned int byteOffset = 0);
00188 template<typename T>
00189 static void putValue(MemoryUtil::Endianess endian,
00190 T value, void* data, unsigned int byteOffset = 0) {
00191 putBuiltin(data, byteOffset, endian, value);
00192 }
00193 template<typename T>
00194 static void putValueLE(T value, void* data, unsigned int byteOffset = 0) {
00195 putValue(LE, value, data, byteOffset);
00196 }
00197 template<typename T>
00198 static void putValueBE(T value, void* data, unsigned int byteOffset = 0) {
00199 putValue(BE, value, data, byteOffset);
00200 }
00204 private:
00205 template<typename T>
00206 static inline void getBuiltin(const void* const data, const unsigned int byteOffset,
00207 const MemoryUtil::Endianess endian, T& t) {
00208 VRS_CheckArg(data, "no data");
00209
00210 const bool needSwap = (!ENDIAN.IS.LITTLE == (endian != MemoryUtil::LittleEndian));
00211 char* const ptr = reinterpret_cast<char*>(&t);
00212 const char* const dataPtr = static_cast<const char*>(data) + byteOffset;
00213 for(UINT i = 0; i < sizeof(T); ++i) {
00214 if(needSwap) {
00215 ptr[i] = dataPtr[i];
00216 } else {
00217 ptr[i] = dataPtr[sizeof(T) - 1 - i];
00218 }
00219 }
00220 }
00221
00222 template<typename T>
00223 static inline void putBuiltin(void* const data, const unsigned int byteOffset,
00224 const MemoryUtil::Endianess endian, const T& t) {
00225 VRS_CheckArg(data, "no data");
00226
00227 const bool needSwap = (!ENDIAN.IS.LITTLE == (endian != MemoryUtil::LittleEndian));
00228 const char* const ptr = reinterpret_cast<const char*>(&t);
00229 char* const dataPtr = static_cast<char*>(data) + byteOffset;
00230 for(UINT i = 0; i < sizeof(T); ++i) {
00231 if(needSwap) {
00232 dataPtr[i] = ptr[i];
00233 } else {
00234 dataPtr[i] = ptr[sizeof(T) - 1 - i];
00235 }
00236 }
00237 }
00238 };
00239
00240 }
00241
00242 #endif // VRS_IO_MEMORYUTIL_H