CDT  v4.2.0
инструменты разработчика
varint.hpp
См. документацию.
1
5#pragma once
6
7namespace eosio {
22 struct unsigned_int {
28 constexpr unsigned_int( uint32_t v = 0 ):value(v){}
29
37 template<typename T>
38 constexpr unsigned_int( T v ):value(v){}
39
40 //operator uint32_t()const { return value; }
41 //operator uint64_t()const { return value; }
42
49 template<typename T>
50 constexpr operator T()const { return static_cast<T>(value); }
51
53
60 constexpr unsigned_int& operator=( uint32_t v ) { value = v; return *this; }
61
63
68
70
79 constexpr friend bool operator==( const unsigned_int& i, const uint32_t& v ) { return i.value == v; }
80
89 constexpr friend bool operator==( const uint32_t& i, const unsigned_int& v ) { return i == v.value; }
90
99 constexpr friend bool operator==( const unsigned_int& i, const unsigned_int& v ) { return i.value == v.value; }
100
109 constexpr friend bool operator!=( const unsigned_int& i, const uint32_t& v ) { return i.value != v; }
110
119 constexpr friend bool operator!=( const uint32_t& i, const unsigned_int& v ) { return i != v.value; }
120
129 constexpr friend bool operator!=( const unsigned_int& i, const unsigned_int& v ) { return i.value != v.value; }
130
139 constexpr friend bool operator<( const unsigned_int& i, const uint32_t& v ) { return i.value < v; }
140
149 constexpr friend bool operator<( const uint32_t& i, const unsigned_int& v ) { return i < v.value; }
150
159 constexpr friend bool operator<( const unsigned_int& i, const unsigned_int& v ) { return i.value < v.value; }
160
169 constexpr friend bool operator>=( const unsigned_int& i, const uint32_t& v ) { return i.value >= v; }
170
179 constexpr friend bool operator>=( const uint32_t& i, const unsigned_int& v ) { return i >= v.value; }
180
189 constexpr friend bool operator>=( const unsigned_int& i, const unsigned_int& v ) { return i.value >= v.value; }
190
191
193
195
204 template<typename DataStream>
205 friend DataStream& operator << ( DataStream& ds, const unsigned_int& v ){
206 uint64_t val = v.value;
207 do {
208 uint8_t b = uint8_t(val) & 0x7f;
209 val >>= 7;
210 b |= ((val > 0) << 7);
211 ds.write((char*)&b,1);//.put(b);
212 } while( val );
213 return ds;
214 }
215
224 template<typename DataStream>
225 friend DataStream& operator >> ( DataStream& ds, unsigned_int& vi ){
226 uint64_t v = 0; char b = 0; uint8_t by = 0;
227 do {
228 ds.get(b);
229 v |= uint32_t(uint8_t(b) & 0x7f) << by;
230 by += 7;
231 } while( uint8_t(b) & 0x80 );
232 vi.value = static_cast<uint32_t>(v);
233 return ds;
234 }
235
237 };
238
246 struct signed_int {
252 constexpr signed_int( int32_t v = 0 ):value(v){}
253
255
261 constexpr operator int32_t()const { return value; }
262
263
271 template<typename T>
272 constexpr signed_int& operator=( const T& v ) { value = v; return *this; }
273
279 constexpr signed_int operator++(int) { return value++; }
280
286 constexpr signed_int& operator++(){ ++value; return *this; }
287
289
293 int32_t value;
294
296
305 constexpr friend bool operator==( const signed_int& i, const int32_t& v ) { return i.value == v; }
306
315 constexpr friend bool operator==( const int32_t& i, const signed_int& v ) { return i == v.value; }
316
325 constexpr friend bool operator==( const signed_int& i, const signed_int& v ) { return i.value == v.value; }
326
327
336 constexpr friend bool operator!=( const signed_int& i, const int32_t& v ) { return i.value != v; }
337
346 constexpr friend bool operator!=( const int32_t& i, const signed_int& v ) { return i != v.value; }
347
356 constexpr friend bool operator!=( const signed_int& i, const signed_int& v ) { return i.value != v.value; }
357
366 constexpr friend bool operator<( const signed_int& i, const int32_t& v ) { return i.value < v; }
367
376 constexpr friend bool operator<( const int32_t& i, const signed_int& v ) { return i < v.value; }
377
386 constexpr friend bool operator<( const signed_int& i, const signed_int& v ) { return i.value < v.value; }
387
388
397 constexpr friend bool operator>=( const signed_int& i, const int32_t& v ) { return i.value >= v; }
398
407 constexpr friend bool operator>=( const int32_t& i, const signed_int& v ) { return i >= v.value; }
408
417 constexpr friend bool operator>=( const signed_int& i, const signed_int& v ) { return i.value >= v.value; }
418
420
422
431 template<typename DataStream>
432 friend DataStream& operator << ( DataStream& ds, const signed_int& v ){
433 uint32_t val = uint32_t((v.value<<1) ^ (v.value>>31));
434 do {
435 uint8_t b = uint8_t(val) & 0x7f;
436 val >>= 7;
437 b |= ((val > 0) << 7);
438 ds.write((char*)&b,1);//.put(b);
439 } while( val );
440 return ds;
441 }
442
451 template<typename DataStream>
452 friend DataStream& operator >> ( DataStream& ds, signed_int& vi ){
453 uint32_t v = 0; char b = 0; int by = 0;
454 do {
455 ds.get(b);
456 v |= uint32_t(uint8_t(b) & 0x7f) << by;
457 by += 7;
458 } while( uint8_t(b) & 0x80 );
459 vi.value = (v>>1) ^ (~(v&1)+1ull);
460 return ds;
461 }
462
464 };
465}