Mercurial > code
comparison C++/Pack.h @ 223:c6513d9c696b
Pack: add unit tests
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 08 May 2014 23:51:07 +0200 |
parents | 8fc177bbc4a6 |
children | 41bdde9027c0 |
comparison
equal
deleted
inserted
replaced
222:5a99711d52f9 | 223:c6513d9c696b |
---|---|
45 Little, //! Little endian | 45 Little, //! Little endian |
46 Big //! Big endian | 46 Big //! Big endian |
47 }; | 47 }; |
48 | 48 |
49 private: | 49 private: |
50 static void writeFile(std::ofstream &out, Endian endian) | 50 static void writeFile(std::ofstream &, Endian) |
51 { | 51 { |
52 // dummy, stop recursion | 52 // dummy, stop recursion |
53 } | 53 } |
54 | 54 |
55 template <typename T, typename... Args> | 55 template <typename T, typename... Args> |
56 static void writeFile(std::ofstream &out, Endian endian, const T &value, Args&... args) | 56 static void writeFile(std::ofstream &out, Endian endian, const T &value, Args&... args) |
57 { | 57 { |
58 static_assert(TypeInfo<T>::supported, "unsupported type"); | 58 static_assert(TypeInfo<T>::supported, "unsupported type"); |
59 | 59 |
60 T ret = convert(value, endian); | 60 T ret = convert(value, endian); |
61 out.write(reinterpret_cast<unsigned char *>(&ret), TypeInfo<T>::size); | 61 out.write(reinterpret_cast<const char *>(&ret), TypeInfo<T>::size); |
62 writeFile(out, endian, args...); | 62 writeFile(out, endian, args...); |
63 } | 63 } |
64 | 64 |
65 static void readFile(std::ifstream &in, Endian endian) | 65 static void readFile(std::ifstream &, Endian) |
66 { | 66 { |
67 // dummy, stop recursion | 67 // dummy, stop recursion |
68 } | 68 } |
69 | 69 |
70 template <typename T, typename... Args> | 70 template <typename T, typename... Args> |
71 static void readFile(std::ifstream &in, Endian endian, T &value, Args&&... args) | 71 static void readFile(std::ifstream &in, Endian endian, T &value, Args&&... args) |
72 { | 72 { |
73 static_assert(TypeInfo<T>::supported, "unsupported type"); | 73 static_assert(TypeInfo<T>::supported, "unsupported type"); |
74 | 74 |
75 in.read(reinterpret_cast<unsigned char *>(&value), TypeInfo<T>::size); | 75 in.read(reinterpret_cast<char *>(&value), TypeInfo<T>::size); |
76 value = convert(value, endian); | 76 value = convert(value, endian); |
77 readFile(in, endian, args...); | 77 readFile(in, endian, args...); |
78 } | 78 } |
79 | 79 |
80 public: | 80 public: |
173 static const bool supported = true; | 173 static const bool supported = true; |
174 static const size_t size = 8; | 174 static const size_t size = 8; |
175 }; | 175 }; |
176 | 176 |
177 template <> | 177 template <> |
178 uint8_t Pack::convert(uint8_t v, Endian) | 178 inline uint8_t Pack::convert(uint8_t v, Endian) |
179 { | 179 { |
180 return v; | 180 return v; |
181 } | 181 } |
182 | 182 |
183 template <> | 183 template <> |
184 uint16_t Pack::convert(uint16_t v, Endian endian) | 184 inline uint16_t Pack::convert(uint16_t v, Endian endian) |
185 { | 185 { |
186 if (mode != endian) | 186 if (mode != endian) |
187 return (((v >> 8) & 0x00FFL) | ((v << 8) & 0xFF00L)); | 187 return (((v >> 8) & 0x00FFL) | ((v << 8) & 0xFF00L)); |
188 | 188 |
189 return v; | 189 return v; |
190 } | 190 } |
191 | 191 |
192 template <> | 192 template <> |
193 uint32_t Pack::convert(uint32_t v, Endian endian) | 193 inline uint32_t Pack::convert(uint32_t v, Endian endian) |
194 { | 194 { |
195 if (mode != endian) | 195 if (mode != endian) |
196 return ((((v) >> 24) & 0x000000FFL) | 196 return ((((v) >> 24) & 0x000000FFL) |
197 | (((v) >> 8) & 0x0000FF00L) | 197 | (((v) >> 8) & 0x0000FF00L) |
198 | (((v) << 8) & 0x00FF0000L) | 198 | (((v) << 8) & 0x00FF0000L) |
200 | 200 |
201 return v; | 201 return v; |
202 } | 202 } |
203 | 203 |
204 template <> | 204 template <> |
205 uint64_t Pack::convert(uint64_t v, Endian endian) | 205 inline uint64_t Pack::convert(uint64_t v, Endian endian) |
206 { | 206 { |
207 if (mode != endian) | 207 if (mode != endian) |
208 return ((((v) & 0xff00000000000000ull) >> 56) | 208 return ((((v) & 0xff00000000000000ull) >> 56) |
209 | (((v) & 0x00ff000000000000ull) >> 40) | 209 | (((v) & 0x00ff000000000000ull) >> 40) |
210 | (((v) & 0x0000ff0000000000ull) >> 24) | 210 | (((v) & 0x0000ff0000000000ull) >> 24) |