annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Pack.h -- binary data serialization
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013 David Demelier <markand@malikania.fr>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _PACK_H_
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _PACK_H_
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <cstdint>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <fstream>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stdexcept>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <string>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * @class Pack
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 * @brief Serialize binary data to files
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 * This class write and read binary data from files. It currently
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 * support:
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * uint8_t,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * uint16_t,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 * uint32_t,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * uint64_t
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 class Pack {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 public:
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * @enum Endian
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 * @brief Endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 enum Endian {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 Little, //! Little endian
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 Big //! Big endian
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 private:
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
50 static void writeFile(std::ofstream &, Endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 // dummy, stop recursion
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 template <typename T, typename... Args>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static void writeFile(std::ofstream &out, Endian endian, const T &value, Args&... args)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 static_assert(TypeInfo<T>::supported, "unsupported type");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 T ret = convert(value, endian);
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
61 out.write(reinterpret_cast<const char *>(&ret), TypeInfo<T>::size);
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 writeFile(out, endian, args...);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
65 static void readFile(std::ifstream &, Endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 // dummy, stop recursion
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 template <typename T, typename... Args>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 static void readFile(std::ifstream &in, Endian endian, T &value, Args&&... args)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 static_assert(TypeInfo<T>::supported, "unsupported type");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
75 in.read(reinterpret_cast<char *>(&value), TypeInfo<T>::size);
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 value = convert(value, endian);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 readFile(in, endian, args...);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 public:
219
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
81 /**
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
82 * Host system endian mode.
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
83 */
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 static const Endian mode;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * @struct TypeInfo
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * @brief Type information
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * Used for conversions.
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 template <typename T>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 struct TypeInfo {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 static const bool supported = false;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 static const size_t size = 0;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 * Convert data.
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 * @param value the value to convert if needed
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 * @return the converted value
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 template <typename T>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 static T convert(T value, Endian endian);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * Write binary data to the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * @param path the path to the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * @param args the arguments
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * @throw std::runtime_exception on error
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 template <typename... Args>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 static void write(const std::string &path,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 Endian endian,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 Args&&... args)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 std::ofstream out;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
122
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 out.open(path, std::ios_base::binary);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 if (!out.is_open())
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 throw std::runtime_error("Can't open file for writing");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 writeFile(out, endian, std::forward<Args>(args)...);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * Read binary data from the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 * @param path the path to the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 * @param args the arguments
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 * @throw std::runtime_exception on error
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 template <typename... Args>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 static void read(const std::string &path,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 Endian endian,
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 Args&&... args)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 std::ifstream in;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 in.open(path, std::ios_base::binary);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 if (!in.is_open())
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 throw std::runtime_error("Can't open file for reading");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 readFile(in, endian, std::forward<Args>(args)...);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 struct Pack::TypeInfo<uint8_t> {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 static const bool supported = true;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 static const size_t size = 1;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 struct Pack::TypeInfo<uint16_t> {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 static const bool supported = true;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 static const size_t size = 2;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 struct Pack::TypeInfo<uint32_t> {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 static const bool supported = true;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 static const size_t size = 4;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 struct Pack::TypeInfo<uint64_t> {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 static const bool supported = true;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 static const size_t size = 8;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 template <>
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
178 inline uint8_t Pack::convert(uint8_t v, Endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 return v;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 template <>
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
184 inline uint16_t Pack::convert(uint16_t v, Endian endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 if (mode != endian)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 return (((v >> 8) & 0x00FFL) | ((v << 8) & 0xFF00L));
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 return v;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 template <>
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
193 inline uint32_t Pack::convert(uint32_t v, Endian endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 if (mode != endian)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 return ((((v) >> 24) & 0x000000FFL)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 | (((v) >> 8) & 0x0000FF00L)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 | (((v) << 8) & 0x00FF0000L)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 | (((v) << 24) & 0xFF000000L));
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 return v;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 template <>
223
c6513d9c696b Pack: add unit tests
David Demelier <markand@malikania.fr>
parents: 219
diff changeset
205 inline uint64_t Pack::convert(uint64_t v, Endian endian)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 if (mode != endian)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 return ((((v) & 0xff00000000000000ull) >> 56)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 | (((v) & 0x00ff000000000000ull) >> 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 | (((v) & 0x0000ff0000000000ull) >> 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 | (((v) & 0x000000ff00000000ull) >> 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 | (((v) & 0x00000000ff000000ull) << 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 | (((v) & 0x0000000000ff0000ull) << 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 | (((v) & 0x000000000000ff00ull) << 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 | (((v) & 0x00000000000000ffull) << 56));
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 return v;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 #endif // !_PACK_H_