annotate C++/Pack.h @ 268:b5d795389387

Pack: * Remove read / write from path, it makes no sense because you need to read all in one shot. * Implement arrays via readArray / writeArray using iterators. Task: #302
author David Demelier <markand@malikania.fr>
date Wed, 15 Oct 2014 21:29:20 +0200
parents bc9b5e7421a7
children 7433ebe6a8b0
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 {
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
102 auto ret = convert(value, endian);
266
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 * Read nothing, stop recursion.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
109 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
110 static void read(std::istream &, Endian)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
111 {
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 /**
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
115 * Read binary data from the stream.
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
116 *
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
117 * @param in the input stream
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
118 * @param endian the endian mode
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
119 * @param args the arguments
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
120 * @throw std::runtime_exception on error
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
121 */
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
122 template <typename T, typename... Args>
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
123 static void read(std::istream &in, Endian endian, T &value, Args&... args)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
124 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
125 in.read(reinterpret_cast<char *>(&value), TypeInfo<T>::size);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
126 value = convert(value, endian);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
127 read(in, endian, args...);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
128 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
129
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
130 /**
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
131 * Read array and store it to the output iterator. Because the container
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
132 * is not allocated, we use an integer based size to determine the
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
133 * number of bytes to read.
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 *
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
135 * @param in the input stream
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 * @param endian the endian mode
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
137 * @param out the output it
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
138 * @param count the number of bytes to read
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
139 * @throw std::runtime_error on error
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 */
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
141 template <typename OutputIt>
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
142 static void readArray(std::istream &in, Endian endian, OutputIt out, unsigned count)
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 {
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
144 typename OutputIt::container_type::value_type byte;
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
145
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
146 for (unsigned i = 0; i < count; ++i) {
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
147 read(in, endian, byte);
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
148 *out++ = byte;
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
149 }
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
150 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
152 /**
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
153 * Read a container from an input iterator and write it to output stream.
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
154 *
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
155 * @param out the output stream
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
156 * @param endian the endian mode
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
157 * @param in the input iterator
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
158 * @param count the number of bytes to write
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
159 * @throw std::runtime_error on error
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
160 */
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
161 template <typename InputIt>
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
162 static void writeArray(std::ostream &out, Endian endian, InputIt in, unsigned count)
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
163 {
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
164 typename std::iterator_traits<InputIt>::value_type byte;
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
268
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
166 for (unsigned i = 0; i < count; ++i) {
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
167 byte = *in++;
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
168 write(out, endian, byte);
David Demelier <markand@malikania.fr>
parents: 267
diff changeset
169 }
185
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 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 struct Pack::TypeInfo<uint8_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
175 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
176 static constexpr const size_t size = sizeof (uint8_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
177
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
178 static constexpr uint8_t convert(uint8_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
179 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
180 return v;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
181 }
185
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
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 struct Pack::TypeInfo<uint16_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
186 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
187 static constexpr const size_t size = sizeof (uint16_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
188
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
189 static constexpr uint16_t convert(uint16_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
190 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
191 return (((v >> 8) & 0x00FFL) | ((v << 8) & 0xFF00L));
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
192 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 };
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 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 struct Pack::TypeInfo<uint32_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
197 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
198 static constexpr const size_t size = sizeof (uint32_t);
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
199
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
200 static constexpr uint32_t convert(uint32_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
201 {
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
202 return ((((v) >> 24) & 0x000000FFL)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
203 | (((v) >> 8) & 0x0000FF00L)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
204 | (((v) << 8) & 0x00FF0000L)
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
205 | (((v) << 24) & 0xFF000000L));
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
206 }
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 };
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
208
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 template <>
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 struct Pack::TypeInfo<uint64_t> {
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
211 static constexpr const bool supported = true;
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
212 static constexpr const size_t size = sizeof (uint64_t);
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
267
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
214 static constexpr uint64_t convert(uint64_t v)
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
215 {
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 return ((((v) & 0xff00000000000000ull) >> 56)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 | (((v) & 0x00ff000000000000ull) >> 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 | (((v) & 0x0000ff0000000000ull) >> 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 | (((v) & 0x000000ff00000000ull) >> 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 | (((v) & 0x00000000ff000000ull) << 8 )
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 | (((v) & 0x0000000000ff0000ull) << 24)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 | (((v) & 0x000000000000ff00ull) << 40)
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 | (((v) & 0x00000000000000ffull) << 56));
266
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
224 }
David Demelier <markand@malikania.fr>
parents: 223
diff changeset
225 };
185
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
523156bb3af5 Add Pack class
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 #endif // !_PACK_H_