|
|
@@ -9,131 +9,115 @@ |
|
|
#include "btypes.h"
|
|
|
|
|
|
/**
|
|
|
- * Write a 32-bit unsigned to an output stream being careful to
|
|
|
+ * Write a 32/64 bit unsigned to an output stream being careful to
|
|
|
* re-endianize if caller-requested endianness differs from current
|
|
|
* host.
|
|
|
*/
|
|
|
-static inline void writeU32(std::ostream& out, uint32_t x, bool toBigEndian) {
|
|
|
- uint32_t y = endianizeU32(x, toBigEndian);
|
|
|
- out.write((const char*)&y, 4);
|
|
|
+template <typename T>
|
|
|
+static inline void writeU(std::ostream& out, T x, bool toBigEndian) {
|
|
|
+ T y = endianizeU<T>(x, toBigEndian);
|
|
|
+ out.write((const char*)&y, sizeof(T));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Write a 32-bit unsigned to an output stream using the native
|
|
|
+ * Write a 32/64 bit unsigned to an output stream using the native
|
|
|
* endianness.
|
|
|
*/
|
|
|
-static inline void writeU32(std::ostream& out, uint32_t x) {
|
|
|
- out.write((const char*)&x, 4);
|
|
|
+template <typename T>
|
|
|
+static inline void writeU(std::ostream& out, T x) {
|
|
|
+ out.write((const char*)&x, sizeof(T));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Write a 32-bit signed int to an output stream being careful to
|
|
|
+ * Write a 32/64 bit signed int to an output stream being careful to
|
|
|
* re-endianize if caller-requested endianness differs from current
|
|
|
* host.
|
|
|
*/
|
|
|
-static inline void writeI32(std::ostream& out, int32_t x, bool toBigEndian) {
|
|
|
- int32_t y = endianizeI32(x, toBigEndian);
|
|
|
- out.write((const char*)&y, 4);
|
|
|
+template <typename T>
|
|
|
+static inline void writeI(std::ostream& out, T x, bool toBigEndian) {
|
|
|
+ T y = endianizeI<T>(x, toBigEndian);
|
|
|
+ out.write((const char*)&y, sizeof(T));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Write a 32-bit unsigned to an output stream using the native
|
|
|
+ * Write a 32/64 bit unsigned to an output stream using the native
|
|
|
* endianness.
|
|
|
*/
|
|
|
-static inline void writeI32(std::ostream& out, int32_t x) {
|
|
|
- out.write((const char*)&x, 4);
|
|
|
+template <typename T>
|
|
|
+static inline void writeI(std::ostream& out, T x) {
|
|
|
+ out.write((const char*)&x, sizeof(T));
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Read a 32-bit unsigned from an input stream, inverting endianness
|
|
|
- * if necessary.
|
|
|
- */
|
|
|
-static inline uint32_t readU32(std::istream& in, bool swap) {
|
|
|
- uint32_t x;
|
|
|
- in.read((char *)&x, 4);
|
|
|
- assert_eq(4, in.gcount());
|
|
|
+template <typename T>
|
|
|
+static inline T readU(std::istream& in, bool swap) {
|
|
|
+ T x;
|
|
|
+ in.read((char *)&x, sizeof(T));
|
|
|
+ assert_eq(sizeof(T), in.gcount());
|
|
|
if(swap) {
|
|
|
- return endianSwapU32(x);
|
|
|
+ if(sizeof(T) == 4) {
|
|
|
+ return endianSwapU32(x);
|
|
|
+ } else if(sizeof(T) == 8) {
|
|
|
+ return endianSwapU64(x);
|
|
|
+ } else {
|
|
|
+ assert(false);
|
|
|
+ }
|
|
|
} else {
|
|
|
return x;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Read a 32-bit unsigned from a file descriptor, optionally inverting
|
|
|
- * endianness.
|
|
|
- */
|
|
|
-static inline uint32_t readU32(int in, bool swap) {
|
|
|
- uint32_t x;
|
|
|
- if(read(in, (void *)&x, 4) != 4) {
|
|
|
- assert(false);
|
|
|
- }
|
|
|
- if(swap) {
|
|
|
- return endianSwapU32(x);
|
|
|
- } else {
|
|
|
- return x;
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-/**
|
|
|
- * Read a 32-bit unsigned from a FILE*, optionally inverting
|
|
|
- * endianness.
|
|
|
- */
|
|
|
-static inline uint32_t readU32(FILE* in, bool swap) {
|
|
|
- uint32_t x;
|
|
|
- if(fread((void *)&x, 1, 4, in) != 4) {
|
|
|
+template <typename T>
|
|
|
+static inline T readU(FILE* in, bool swap) {
|
|
|
+ T x;
|
|
|
+ if(fread((void *)&x, 1, sizeof(T), in) != sizeof(T)) {
|
|
|
assert(false);
|
|
|
}
|
|
|
if(swap) {
|
|
|
- return endianSwapU32(x);
|
|
|
- } else {
|
|
|
- return x;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/**
|
|
|
- * Read a 32-bit signed from an input stream, inverting endianness
|
|
|
- * if necessary.
|
|
|
- */
|
|
|
-static inline int32_t readI32(std::istream& in, bool swap) {
|
|
|
- int32_t x;
|
|
|
- in.read((char *)&x, 4);
|
|
|
- assert_eq(4, in.gcount());
|
|
|
- if(swap) {
|
|
|
- return endianSwapI32(x);
|
|
|
+ if(sizeof(T) == 4) {
|
|
|
+ return endianSwapU32(x);
|
|
|
+ } else if(sizeof(T) == 8) {
|
|
|
+ return endianSwapU64(x);
|
|
|
+ } else {
|
|
|
+ assert(false);
|
|
|
+ }
|
|
|
} else {
|
|
|
return x;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Read a 32-bit unsigned from a file descriptor, optionally inverting
|
|
|
- * endianness.
|
|
|
- */
|
|
|
-static inline uint32_t readI32(int in, bool swap) {
|
|
|
- int32_t x;
|
|
|
- if(read(in, (void *)&x, 4) != 4) {
|
|
|
- assert(false);
|
|
|
- }
|
|
|
+template <typename T>
|
|
|
+static inline T readI(std::istream& in, bool swap) {
|
|
|
+ T x;
|
|
|
+ in.read((char *)&x, sizeof(T));
|
|
|
+ assert_eq(sizeof(T), in.gcount());
|
|
|
if(swap) {
|
|
|
- return endianSwapI32(x);
|
|
|
+ if(sizeof(T) == 4) {
|
|
|
+ return endianSwapI32(x);
|
|
|
+ } else if(sizeof(T) == 8) {
|
|
|
+ return endianSwapI64(x);
|
|
|
+ } else {
|
|
|
+ assert(false);
|
|
|
+ }
|
|
|
} else {
|
|
|
return x;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Read a 32-bit unsigned from a FILE*, optionally inverting
|
|
|
- * endianness.
|
|
|
- */
|
|
|
-static inline uint32_t readI32(FILE* in, bool swap) {
|
|
|
- int32_t x;
|
|
|
- if(fread((void *)&x, 1, 4, in) != 4) {
|
|
|
+template <typename T>
|
|
|
+static inline T readI(FILE* in, bool swap) {
|
|
|
+ T x;
|
|
|
+ if(fread((void *)&x, 1, sizeof(T), in) != sizeof(T)) {
|
|
|
assert(false);
|
|
|
}
|
|
|
if(swap) {
|
|
|
- return endianSwapI32(x);
|
|
|
+ if(sizeof(T) == 4) {
|
|
|
+ return endianSwapI32(x);
|
|
|
+ } else if(sizeof(T) == 8) {
|
|
|
+ return endianSwapI64(x);
|
|
|
+ } else {
|
|
|
+ assert(false);
|
|
|
+ }
|
|
|
} else {
|
|
|
return x;
|
|
|
}
|
|
|
|
0 comments on commit
201e1da