From 4d0577f2c20f42daeddbd9a9df424cf30d0f59e9 Mon Sep 17 00:00:00 2001 From: MoneroOcean Date: Sat, 24 Mar 2018 23:55:27 +0100 Subject: [PATCH] Code moves --- binding.gyp | 1 - src/common/varint.h | 62 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/common/varint.h diff --git a/binding.gyp b/binding.gyp index 4b753e5..8be7e81 100644 --- a/binding.gyp +++ b/binding.gyp @@ -11,7 +11,6 @@ "src/crypto/crypto-ops-data.c", "src/crypto/hash.c", "src/crypto/keccak.c", - "src/common/base58.cpp", ], "include_dirs": [ "src", diff --git a/src/common/varint.h b/src/common/varint.h new file mode 100644 index 0000000..e62470f --- /dev/null +++ b/src/common/varint.h @@ -0,0 +1,62 @@ +// Copyright (c) 2012-2013 The Cryptonote developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#pragma once + +#include +#include +#include +#include +#include + +namespace tools { + + template + typename std::enable_if::value && std::is_unsigned::value, void>::type + write_varint(OutputIt &&dest, T i) { + while (i >= 0x80) { + *dest++ = (static_cast(i) & 0x7f) | 0x80; + i >>= 7; + } + *dest++ = static_cast(i); + } + + template + std::string get_varint_data(const t_type& v) + { + std::stringstream ss; + write_varint(std::ostreambuf_iterator(ss), v); + return ss.str(); + } + + template + typename std::enable_if::value && std::is_unsigned::value && 0 <= bits && bits <= std::numeric_limits::digits, int>::type + read_varint(InputIt &&first, InputIt &&last, T &i) { + int read = 0; + i = 0; + for (int shift = 0;; shift += 7) { + if (first == last) { + return read; // End of input. + } + unsigned char byte = *first++; + ++read; + if (shift + 7 >= bits && byte >= 1 << (bits - shift)) { + return -1; // Overflow. + } + if (byte == 0 && shift != 0) { + return -2; // Non-canonical representation. + } + i |= static_cast(byte & 0x7f) << shift; + if ((byte & 0x80) == 0) { + break; + } + } + return read; + } + + template + int read_varint(InputIt &&first, InputIt &&last, T &i) { + return read_varint::digits, InputIt, T>(std::move(first), std::move(last), i); + } +}