annotate C++/Pack.h @ 267:bc9b5e7421a7

Pack: * Remove endian from TypeInfo * Don't use rvalue and perfect forwarding
author David Demelier <markand@malikania.fr>
date Tue, 14 Oct 2014 13:14:36 +0200
parents 41bdde9027c0
children b5d795389387
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 public:
219
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
50 /**
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
51 * Host system endian mode.
8fc177bbc4a6 Update some code
David Demelier <markand@malikania.fr>
parents: 185
diff changeset
52 */
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 static const Endian mode;
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 /**
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * @struct TypeInfo
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 * @brief Type information
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 * Used for conversions.
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 template <typename T>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 struct TypeInfo {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 static const bool supported = false;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 /**
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
67 * Convert data only if the requested endian is different.
185
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 * @param value the value to convert if needed
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * @return the converted value
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 template <typename T>
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
74 static inline T convert(T value, Endian endian)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
75 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
76 static_assert(TypeInfo<T>::supported, "unsupported type");
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
77
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
78 if (endian != mode)
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
79 return TypeInfo<T>::convert(value);
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
80
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
81 return value;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
82 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
83
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
84 /**
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
85 * Write nothing, stop recursion.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
86 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
87 static void write(std::ostream &, Endian)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
88 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
89 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /**
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
92 * Write binary data to the stream.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
93 *
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
94 * @param out the output stream
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
95 * @param endian the endian mode
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
96 * @param args the arguments
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
97 * @throw std::runtime_exception on error
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
98 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
99 template <typename T, typename... Args>
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
100 static void write(std::ostream &out, Endian endian, const T &value, const Args&... args)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
101 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
102 T ret = convert(value, endian);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
103 out.write(reinterpret_cast<const char *>(&ret), TypeInfo<T>::size);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
104 write(out, endian, args...);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
105 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
106
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
107 /**
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
108 * Write binary data to the file.
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 *
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 * @param path the path to the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 * @param args the arguments
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * @throw std::runtime_exception on error
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 */
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 template <typename... Args>
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
116 static void write(const std::string &path, Endian endian, const Args&... args)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 std::ofstream out;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 out.open(path, std::ios_base::binary);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 if (!out.is_open())
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 throw std::runtime_error("Can't open file for writing");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
124 write(out, endian, args...);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
125 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
126
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
127 /**
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
128 * Read nothing, stop recursion.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
129 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
130 static void read(std::istream &, Endian)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
131 {
185
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
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 /**
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
135 * Read binary data from the stream.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
136 *
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
137 * @param in the input stream
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
138 * @param endian the endian mode
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
139 * @param args the arguments
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
140 * @throw std::runtime_exception on error
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
141 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
142 template <typename T, typename... Args>
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
143 static void read(std::istream &in, Endian endian, T &value, Args&... args)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
144 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
145 in.read(reinterpret_cast<char *>(&value), TypeInfo<T>::size);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
146 value = convert(value, endian);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
147 read(in, endian, args...);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
148 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
149
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
150 /**
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
151 * Read binary data from the file.
185
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 * @param path the path to the file
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 * @param endian the endian mode
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 * @param args the arguments
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 * @throw std::runtime_exception on error
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 template <typename... Args>
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
159 static void read(const std::string &path, Endian endian, Args&... args)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 {
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 std::ifstream in;
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 in.open(path, std::ios_base::binary);
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 if (!in.is_open())
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 throw std::runtime_error("Can't open file for reading");
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
167 read(in, endian, args...);
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }
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<uint8_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
173 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
174 static constexpr const size_t size = sizeof (uint8_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
175
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
176 static constexpr uint8_t convert(uint8_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
177 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
178 return v;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
179 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 };
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 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 struct Pack::TypeInfo<uint16_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
184 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
185 static constexpr const size_t size = sizeof (uint16_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
186
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
187 static constexpr uint16_t convert(uint16_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
188 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
189 return (((v >> 8) & 0x00FFL) | ((v << 8) & 0xFF00L));
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
190 }
185
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
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 struct Pack::TypeInfo<uint32_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
195 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
196 static constexpr const size_t size = sizeof (uint32_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
197
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
198 static constexpr uint32_t convert(uint32_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
199 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
200 return ((((v) >> 24) & 0x000000FFL)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
201 | (((v) >> 8) & 0x0000FF00L)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
202 | (((v) << 8) & 0x00FF0000L)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
203 | (((v) << 24) & 0xFF000000L));
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
204 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 };
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 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 struct Pack::TypeInfo<uint64_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
209 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
210 static constexpr const size_t size = sizeof (uint64_t);
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
211
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
212 static constexpr uint64_t convert(uint64_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
213 {
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 return ((((v) & 0xff00000000000000ull) >> 56)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 | (((v) & 0x00ff000000000000ull) >> 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 | (((v) & 0x0000ff0000000000ull) >> 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 | (((v) & 0x000000ff00000000ull) >> 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 | (((v) & 0x00000000ff000000ull) << 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 | (((v) & 0x0000000000ff0000ull) << 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 | (((v) & 0x000000000000ff00ull) << 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 | (((v) & 0x00000000000000ffull) << 56));
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
222 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
223 };
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 #endif // !_PACK_H_