00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined (_XRB_ENDIAN_HPP_)
00012 #define _XRB_ENDIAN_HPP_
00013
00014 #include "xrb.hpp"
00015
00016
00017
00018
00019 namespace Xrb
00020 {
00021
00025 namespace Endian
00026 {
00032 enum Endianness
00033 {
00034 LITTLE = 0,
00035 BIG,
00036
00037
00038 #if defined(WORDS_BIGENDIAN)
00039 MACHINE = BIG,
00040 #else // !defined(WORDS_BIGENDIAN)
00041 MACHINE = LITTLE,
00042 #endif // !defined(WORDS_BIGENDIAN)
00043
00044
00045
00046
00047 SERIALIZER = LITTLE
00048 };
00049
00050
00051
00052
00053
00058 inline void Switch1ByteWord (void *word)
00059 {
00060 ASSERT1(word != NULL);
00061
00062 }
00066 inline void Switch2ByteWord (void *word)
00067 {
00068 ASSERT1(word != NULL);
00069 Uint8 *bytes = static_cast<Uint8 *>(word);
00070
00071 Uint8 temp = *(bytes + 0);
00072 *(bytes + 0) = *(bytes + 1);
00073 *(bytes + 1) = temp;
00074 }
00078 inline void Switch4ByteWord (void *word)
00079 {
00080 ASSERT1(word != NULL);
00081 Uint8 *bytes = static_cast<Uint8 *>(word);
00082
00083 Uint8 temp = *(bytes + 0);
00084 *(bytes + 0) = *(bytes + 3);
00085 *(bytes + 3) = temp;
00086
00087 temp = *(bytes + 1);
00088 *(bytes + 1) = *(bytes + 2);
00089 *(bytes + 2) = temp;
00090 }
00094 inline void Switch8ByteWord (void *word)
00095 {
00096 ASSERT1(word != NULL);
00097 Uint8 *bytes = static_cast<Uint8 *>(word);
00098
00099 Uint8 temp = *(bytes + 0);
00100 *(bytes + 0) = *(bytes + 7);
00101 *(bytes + 7) = temp;
00102
00103 temp = *(bytes + 1);
00104 *(bytes + 1) = *(bytes + 6);
00105 *(bytes + 6) = temp;
00106
00107 temp = *(bytes + 2);
00108 *(bytes + 2) = *(bytes + 5);
00109 *(bytes + 5) = temp;
00110
00111 temp = *(bytes + 3);
00112 *(bytes + 3) = *(bytes + 4);
00113 *(bytes + 4) = temp;
00114 }
00115
00116
00117
00118
00119
00124 inline void ConvertMachineToBig1ByteWord (void *word)
00125 {
00126 #if MACHINE != BIG
00127 Switch1ByteWord(word);
00128 #endif
00129 }
00134 inline void ConvertBigToMachine1ByteWord (void *word)
00135 {
00136 #if MACHINE != BIG
00137 Switch1ByteWord(word);
00138 #endif
00139 }
00144 inline void ConvertMachineToBig2ByteWord (void *word)
00145 {
00146 #if MACHINE != BIG
00147 Switch2ByteWord(word);
00148 #endif
00149 }
00154 inline void ConvertBigToMachine2ByteWord (void *word)
00155 {
00156 #if MACHINE != BIG
00157 Switch2ByteWord(word);
00158 #endif
00159 }
00164 inline void ConvertMachineToBig4ByteWord (void *word)
00165 {
00166 #if MACHINE != BIG
00167 Switch4ByteWord(word);
00168 #endif
00169 }
00174 inline void ConvertBigToMachine4ByteWord (void *word)
00175 {
00176 #if MACHINE != BIG
00177 Switch4ByteWord(word);
00178 #endif
00179 }
00184 inline void ConvertMachineToBig8ByteWord (void *word)
00185 {
00186 #if MACHINE != BIG
00187 Switch8ByteWord(word);
00188 #endif
00189 }
00194 inline void ConvertBigToMachine8ByteWord (void *word)
00195 {
00196 #if MACHINE != BIG
00197 Switch8ByteWord(word);
00198 #endif
00199 }
00200
00201
00202
00203
00204
00209 inline void ConvertMachineToLittle1ByteWord (void *word)
00210 {
00211 #if MACHINE != LITTLE
00212 Switch1ByteWord(word);
00213 #endif
00214 }
00219 inline void ConvertLittleToMachine1ByteWord (void *word)
00220 {
00221 #if MACHINE != LITTLE
00222 Switch1ByteWord(word);
00223 #endif
00224 }
00229 inline void ConvertMachineToLittle2ByteWord (void *word)
00230 {
00231 #if MACHINE != LITTLE
00232 Switch2ByteWord(word);
00233 #endif
00234 }
00239 inline void ConvertLittleToMachine2ByteWord (void *word)
00240 {
00241 #if MACHINE != LITTLE
00242 Switch2ByteWord(word);
00243 #endif
00244 }
00249 inline void ConvertMachineToLittle4ByteWord (void *word)
00250 {
00251 #if MACHINE != LITTLE
00252 Switch4ByteWord(word);
00253 #endif
00254 }
00259 inline void ConvertLittleToMachine4ByteWord (void *word)
00260 {
00261 #if MACHINE != LITTLE
00262 Switch4ByteWord(word);
00263 #endif
00264 }
00269 inline void ConvertMachineToLittle8ByteWord (void *word)
00270 {
00271 #if MACHINE != LITTLE
00272 Switch8ByteWord(word);
00273 #endif
00274 }
00279 inline void ConvertLittleToMachine8ByteWord (void *word)
00280 {
00281 #if MACHINE != LITTLE
00282 Switch8ByteWord(word);
00283 #endif
00284 }
00285
00286
00287
00288
00289
00295 inline void ConvertMachineToGiven1ByteWord (void *word, Endianness const endianness)
00296 {
00297 ASSERT2(endianness == LITTLE || endianness == BIG);
00298 if (MACHINE != endianness)
00299 Switch1ByteWord(word);
00300 }
00306 inline void ConvertGivenToMachine1ByteWord (Endianness const endianness, void *word)
00307 {
00308 ASSERT2(endianness == LITTLE || endianness == BIG);
00309 if (MACHINE != endianness)
00310 Switch1ByteWord(word);
00311 }
00317 inline void ConvertMachineToGiven2ByteWord (void *word, Endianness const endianness)
00318 {
00319 ASSERT2(endianness == LITTLE || endianness == BIG);
00320 if (MACHINE != endianness)
00321 Switch2ByteWord(word);
00322 }
00328 inline void ConvertGivenToMachine2ByteWord (Endianness const endianness, void *word)
00329 {
00330 ASSERT2(endianness == LITTLE || endianness == BIG);
00331 if (MACHINE != endianness)
00332 Switch2ByteWord(word);
00333 }
00339 inline void ConvertMachineToGiven4ByteWord (void *word, Endianness const endianness)
00340 {
00341 ASSERT2(endianness == LITTLE || endianness == BIG);
00342 if (MACHINE != endianness)
00343 Switch4ByteWord(word);
00344 }
00350 inline void ConvertGivenToMachine4ByteWord (Endianness const endianness, void *word)
00351 {
00352 ASSERT2(endianness == LITTLE || endianness == BIG);
00353 if (MACHINE != endianness)
00354 Switch4ByteWord(word);
00355 }
00361 inline void ConvertMachineToGiven8ByteWord (void *word, Endianness const endianness)
00362 {
00363 ASSERT2(endianness == LITTLE || endianness == BIG);
00364 if (MACHINE != endianness)
00365 Switch8ByteWord(word);
00366 }
00372 inline void ConvertGivenToMachine8ByteWord (Endianness const endianness, void *word)
00373 {
00374 ASSERT2(endianness == LITTLE || endianness == BIG);
00375 if (MACHINE != endianness)
00376 Switch8ByteWord(word);
00377 }
00378 }
00379
00380 }
00381
00382 #endif // !defined(_XRB_ENDIAN_HPP_)