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)