1// Copyright 2019 Peter Dimov
2//
3// Distributed under the Boost Software License, Version 1.0.
4// http://www.boost.org/LICENSE_1_0.txt
5
6#include <boost/endian/conversion.hpp>
7#include <boost/core/lightweight_test.hpp>
8#include <boost/config.hpp>
9#include <boost/cstdint.hpp>
10#include <cstddef>
11#include <ostream>
12#include <iomanip>
13
14class byte_span
15{
16private:
17
18 unsigned char const * p_;
19 std::size_t n_;
20
21public:
22
23 byte_span( unsigned char const * p, std::size_t n ): p_( p ), n_( n )
24 {
25 }
26
27 template<std::size_t N> explicit byte_span( unsigned char const (&a)[ N ] ): p_( a ), n_( N )
28 {
29 }
30
31 bool operator==( byte_span const& r ) const
32 {
33 if( n_ != r.n_ ) return false;
34
35 for( std::size_t i = 0; i < n_; ++i )
36 {
37 if( p_[ i ] != r.p_[ i ] ) return false;
38 }
39
40 return true;
41 }
42
43 friend std::ostream& operator<<( std::ostream& os, byte_span s )
44 {
45 if( s.n_ == 0 ) return os;
46
47 os << std::hex << std::setfill( '0' ) << std::uppercase;
48
49 os << std::setw( 2 ) << +s.p_[ 0 ];
50
51 for( std::size_t i = 1; i < s.n_; ++i )
52 {
53 os << ':' << std::setw( 2 ) << +s.p_[ i ];
54 }
55
56 os << std::dec << std::setfill( ' ' ) << std::nouppercase;;
57
58 return os;
59 }
60};
61
62int main()
63{
64 using namespace boost::endian;
65
66 // 16
67
68 {
69 unsigned char v[] = { 0xAA, 0xAA, 0xAA };
70
71 store_little_s16( p: v, v: -3343 );
72
73 unsigned char w1[] = { 0xF1, 0xF2, 0xAA };
74
75 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
76
77 store_little_u16( p: v, v: 0x0201 );
78
79 unsigned char w2[] = { 0x01, 0x02, 0xAA };
80
81 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
82
83 store_big_s16( p: v, v: -3343 );
84
85 unsigned char w3[] = { 0xF2, 0xF1, 0xAA };
86
87 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
88
89 store_big_u16( p: v, v: 0x0201 );
90
91 unsigned char w4[] = { 0x02, 0x01, 0xAA };
92
93 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
94 }
95
96 // 24
97
98 {
99 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA };
100
101 store_little_s24( p: v, v: -789775 );
102
103 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xAA };
104
105 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
106
107 store_little_u24( p: v, v: 0x030201 );
108
109 unsigned char w2[] = { 0x01, 0x02, 0x03, 0xAA };
110
111 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
112
113 store_big_s24( p: v, v: -789775 );
114
115 unsigned char w3[] = { 0xF3, 0xF2, 0xF1, 0xAA };
116
117 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
118
119 store_big_u24( p: v, v: 0x030201 );
120
121 unsigned char w4[] = { 0x03, 0x02, 0x01, 0xAA };
122
123 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
124 }
125
126 // 32
127
128 {
129 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
130
131 store_little_s32( p: v, v: 0xF4F3F2F1 );
132
133 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xF4, 0xAA };
134
135 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
136
137 store_little_u32( p: v, v: 0x04030201 );
138
139 unsigned char w2[] = { 0x01, 0x02, 0x03, 0x04, 0xAA };
140
141 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
142
143 store_big_s32( p: v, v: 0xF4F3F2F1 );
144
145 unsigned char w3[] = { 0xF4, 0xF3, 0xF2, 0xF1, 0xAA };
146
147 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
148
149 store_big_u32( p: v, v: 0x04030201 );
150
151 unsigned char w4[] = { 0x04, 0x03, 0x02, 0x01, 0xAA };
152
153 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
154 }
155
156 // 40
157
158 {
159 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
160
161 store_little_s40( p: v, v: -43135012111 );
162
163 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xAA };
164
165 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
166
167 store_little_u40( p: v, v: 0x0504030201 );
168
169 unsigned char w2[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0xAA };
170
171 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
172
173 store_big_s40( p: v, v: -43135012111 );
174
175 unsigned char w3[] = { 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xAA };
176
177 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
178
179 store_big_u40( p: v, v: 0x0504030201 );
180
181 unsigned char w4[] = { 0x05, 0x04, 0x03, 0x02, 0x01, 0xAA };
182
183 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
184 }
185
186 // 48
187
188 {
189 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
190
191 store_little_s48( p: v, v: -9938739662095 );
192
193 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xAA };
194
195 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
196
197 store_little_u48( p: v, v: 0x060504030201 );
198
199 unsigned char w2[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xAA };
200
201 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
202
203 store_big_s48( p: v, v: -9938739662095 );
204
205 unsigned char w3[] = { 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xAA };
206
207 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
208
209 store_big_u48( p: v, v: 0x060504030201 );
210
211 unsigned char w4[] = { 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0xAA };
212
213 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
214 }
215
216 // 56
217
218 {
219 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
220
221 store_little_s56( p: v, v: -2261738553347343 );
222
223 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xAA };
224
225 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
226
227 store_little_u56( p: v, v: 0x07060504030201 );
228
229 unsigned char w2[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xAA };
230
231 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
232
233 store_big_s56( p: v, v: -2261738553347343 );
234
235 unsigned char w3[] = { 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xAA };
236
237 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
238
239 store_big_u56( p: v, v: 0x07060504030201 );
240
241 unsigned char w4[] = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0xAA };
242
243 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
244 }
245
246 // 64
247
248 {
249 unsigned char v[] = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
250
251 store_little_s64( p: v, v: 0xF8F7F6F5F4F3F2F1 );
252
253 unsigned char w1[] = { 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xAA };
254
255 BOOST_TEST_EQ( byte_span( v ), byte_span( w1 ) );
256
257 store_little_u64( p: v, v: 0x0807060504030201 );
258
259 unsigned char w2[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xAA };
260
261 BOOST_TEST_EQ( byte_span( v ), byte_span( w2 ) );
262
263 store_big_s64( p: v, v: 0xF8F7F6F5F4F3F2F1 );
264
265 unsigned char w3[] = { 0xF8, 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xAA };
266
267 BOOST_TEST_EQ( byte_span( v ), byte_span( w3 ) );
268
269 store_big_u64( p: v, v: 0x0807060504030201 );
270
271 unsigned char w4[] = { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0xAA };
272
273 BOOST_TEST_EQ( byte_span( v ), byte_span( w4 ) );
274 }
275
276 return boost::report_errors();
277}
278

source code of boost/libs/endian/test/store_convenience_test.cpp