6 #ifndef BITCOIN_UINT256_H 7 #define BITCOIN_UINT256_H 21 #include <string_view> 24 template<
unsigned int BITS>
28 static constexpr
int WIDTH = BITS / 8;
29 static_assert(BITS % 8 == 0,
"base_blob currently only supports whole bytes.");
30 std::array<uint8_t, WIDTH>
m_data;
31 static_assert(
WIDTH ==
sizeof(
m_data),
"Sanity check");
40 constexpr
explicit base_blob(std::span<const unsigned char> vch)
43 std::copy(vch.begin(), vch.end(),
m_data.begin());
46 consteval
explicit base_blob(std::string_view hex_str);
50 return std::all_of(
m_data.begin(),
m_data.end(), [](uint8_t val) {
93 std::string
GetHex()
const;
97 constexpr
const unsigned char*
data()
const {
return m_data.data(); }
98 constexpr
unsigned char*
data() {
return m_data.data(); }
103 constexpr
const unsigned char*
begin()
const {
return m_data.data(); }
110 template<
typename Stream>
116 template<
typename Stream>
123 template <
unsigned int BITS>
126 if (hex_str.length() != m_data.size() * 2)
throw "Hex string must fit exactly";
127 auto str_it = hex_str.rbegin();
128 for (
auto& elem : m_data) {
141 template <
class u
intN_t>
142 std::optional<uintN_t>
FromHex(std::string_view str)
144 if (uintN_t::size() * 2 != str.size() || !
IsHex(str))
return std::nullopt;
146 unsigned char* p1 = rv.begin();
147 unsigned char* pend = rv.end();
148 size_t digits = str.size();
149 while (digits > 0 && p1 < pend) {
152 *p1 |= ((
unsigned char)::
HexDigit(str[--digits]) << 4);
165 template <
class u
intN_t>
169 constexpr
auto expected_size{uintN_t::size() * 2};
170 if (input.size() < expected_size) {
171 auto padded = std::string(expected_size,
'0');
172 std::copy(input.begin(), input.end(), padded.begin() + expected_size - input.size());
173 return FromHex<uintN_t>(padded);
175 return FromHex<uintN_t>(input);
185 static std::optional<uint160>
FromHex(std::string_view str) {
return detail::FromHex<uint160>(str); }
197 static std::optional<uint256>
FromHex(std::string_view str) {
return detail::FromHex<uint256>(str); }
198 static std::optional<uint256>
FromUserHex(std::string_view str) {
return detail::FromUserHex<uint256>(str); }
207 #endif // BITCOIN_UINT256_H constexpr uint160(std::span< const unsigned char > vch)
consteval uint256(std::string_view hex_str)
static constexpr unsigned int size()
bool IsHex(std::string_view str)
void Serialize(Stream &s) const
constexpr uint256(uint8_t v)
constexpr unsigned char * data()
friend constexpr bool operator<(const base_blob &a, const base_blob &b)
std::optional< uintN_t > FromUserHex(std::string_view input)
Like FromHex(std::string_view str), but allows an "0x" prefix and pads the input with leading zeroes ...
static std::optional< uint256 > FromUserHex(std::string_view str)
std::string_view RemovePrefixView(std::string_view str, std::string_view prefix)
std::array< uint8_t, WIDTH > m_data
constexpr unsigned char * begin()
friend constexpr bool operator==(const base_blob &a, const base_blob &b)
consteval uint8_t ConstevalHexDigit(const char c)
consteval version of HexDigit() without the lookup table.
signed char HexDigit(char c)
constexpr uint256(std::span< const unsigned char > vch)
void Unserialize(Stream &s)
std::optional< uintN_t > FromHex(std::string_view str)
Writes the hex string (in reverse byte order) into a new uintN_t object and only returns a value iff ...
uint64_t ReadLE64(const B *ptr)
static std::optional< uint256 > FromHex(std::string_view str)
static const uint256 ZERO
constexpr uint160()=default
std::string ToString() const
auto MakeWritableByteSpan(V &&v) noexcept
constexpr bool IsNull() const
constexpr int Compare(const base_blob &other) const
Lexicographic ordering.
Template base class for fixed-sized opaque blobs.
constexpr const unsigned char * data() const
static std::optional< uint160 > FromHex(std::string_view str)
static constexpr int WIDTH
constexpr unsigned char * end()
constexpr uint64_t GetUint64(int pos) const
std::string GetHex() const
constexpr base_blob(std::span< const unsigned char > vch)
constexpr const unsigned char * begin() const
constexpr const unsigned char * end() const
constexpr uint256()=default
constexpr base_blob(uint8_t v)