21
21
// change the byte order of given variable
22
22
template <typename Type>
23
Type change_byte_order(const Type& v)
23
Type change_byte_order(const Type& v){
26
25
const size_t size = sizeof(v);
27
uint8_t* first = (uint8_t*)(&t);
28
uint8_t* last = first+size-1;
26
uint8_t* first = (uint8_t *) (&t);
27
uint8_t* last = first + size - 1;
29
28
while (first < last) {
30
29
std::swap(*first++, *last--);
35
34
template <typename T>
39
38
typedef T TargetType;
40
static TargetType create(const T& from)
39
static TargetType create(const T& from){
46
44
#if WORDS_BIGENDIAN
47
#define DEFINE_OTHER_TYPE(__T__) typedef __T__##_BE TargetType
45
#define DEFINE_OTHER_TYPE(__T__) typedef __T__ ## _BE TargetType
49
#define DEFINE_OTHER_TYPE(__T__) typedef __T__##_LE TargetType
47
#define DEFINE_OTHER_TYPE(__T__) typedef __T__ ## _LE TargetType
53
// we always defined a reversed layout of big-endian and little-endian
51
// we always defined a reversed layout of big-endian and little-endian
54
52
// bit-field struct, so such kind of struct need to be reverted if host
55
53
// arch is different from build arch.
57
55
template <typename T>
58
bool revert_write(const T& t, FILE *fp)
56
bool revert_write(const T& t, FILE *fp){
60
57
T reverted = change_byte_order(t);
61
58
typename OtherEndian<T>::TargetType o =
62
59
OtherEndian<T>::create(reverted);
74
71
Writer(FILE *fp, bool doRevert)
75
: m_fp (fp), m_doRevert(doRevert)
72
: m_fp(fp), m_doRevert(doRevert)
78
75
template <typename T>
79
bool write(const T& t)
76
bool write(const T& t){
82
78
return revert_write(t, m_fp);
84
80
return fwrite(&t, sizeof(t), 1, m_fp) == 1;
88
84
template <typename T>
89
bool write(const T* t, size_t len)
85
bool write(const T* t, size_t len){
91
86
for (unsigned i = 0; i < len; i++) {