diff --git a/src/consensus/params.h b/src/consensus/params.h index f06f4352de..650133c6d2 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -10,6 +10,7 @@ #include #include +#include namespace Consensus { diff --git a/src/random.h b/src/random.h index 3ddc964165..d5455bcffd 100644 --- a/src/random.h +++ b/src/random.h @@ -13,6 +13,7 @@ #include // For std::chrono::microseconds #include #include +#include /** * Overall design of the RNG and entropy sources. diff --git a/src/uint256.cpp b/src/uint256.cpp index e5d429d645..4043fec8c9 100644 --- a/src/uint256.cpp +++ b/src/uint256.cpp @@ -7,15 +7,6 @@ #include -#include - -template -base_blob::base_blob(const std::vector& vch) -{ - assert(vch.size() == sizeof(m_data)); - memcpy(m_data, vch.data(), sizeof(m_data)); -} - template std::string base_blob::GetHex() const { @@ -29,7 +20,7 @@ std::string base_blob::GetHex() const template void base_blob::SetHex(const char* psz) { - memset(m_data, 0, sizeof(m_data)); + std::fill(m_data.begin(), m_data.end(), 0); // skip leading spaces while (IsSpace(*psz)) @@ -43,7 +34,7 @@ void base_blob::SetHex(const char* psz) size_t digits = 0; while (::HexDigit(psz[digits]) != -1) digits++; - unsigned char* p1 = (unsigned char*)m_data; + unsigned char* p1 = m_data.data(); unsigned char* pend = p1 + WIDTH; while (digits > 0 && p1 < pend) { *p1 = ::HexDigit(psz[--digits]); @@ -67,14 +58,12 @@ std::string base_blob::ToString() const } // Explicit instantiations for base_blob<160> -template base_blob<160>::base_blob(const std::vector&); template std::string base_blob<160>::GetHex() const; template std::string base_blob<160>::ToString() const; template void base_blob<160>::SetHex(const char*); template void base_blob<160>::SetHex(const std::string&); // Explicit instantiations for base_blob<256> -template base_blob<256>::base_blob(const std::vector&); template std::string base_blob<256>::GetHex() const; template std::string base_blob<256>::ToString() const; template void base_blob<256>::SetHex(const char*); diff --git a/src/uint256.h b/src/uint256.h index 826ce581aa..05847da6a6 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -8,12 +8,14 @@ #define BITCOIN_UINT256_H #include +#include -#include +#include +#include +#include #include #include #include -#include /** Template base class for fixed-sized opaque blobs. */ template @@ -21,7 +23,9 @@ class base_blob { protected: static constexpr int WIDTH = BITS / 8; - uint8_t m_data[WIDTH]; + std::array m_data; + static_assert(WIDTH == sizeof(m_data), "Sanity check"); + public: /* construct 0 value by default */ constexpr base_blob() : m_data() {} @@ -29,75 +33,58 @@ public: /* constructor for constants between 1 and 255 */ constexpr explicit base_blob(uint8_t v) : m_data{v} {} - explicit base_blob(const std::vector& vch); - - bool IsNull() const + constexpr explicit base_blob(Span vch) { - for (int i = 0; i < WIDTH; i++) - if (m_data[i] != 0) - return false; - return true; + assert(vch.size() == WIDTH); + std::copy(vch.begin(), vch.end(), m_data.begin()); } - void SetNull() + constexpr bool IsNull() const { - memset(m_data, 0, sizeof(m_data)); + return std::all_of(m_data.begin(), m_data.end(), [](uint8_t val) { + return val == 0; + }); } - inline int Compare(const base_blob& other) const { return memcmp(m_data, other.m_data, sizeof(m_data)); } + constexpr void SetNull() + { + std::fill(m_data.begin(), m_data.end(), 0); + } - friend inline bool operator==(const base_blob& a, const base_blob& b) { return a.Compare(b) == 0; } - friend inline bool operator!=(const base_blob& a, const base_blob& b) { return a.Compare(b) != 0; } - friend inline bool operator<(const base_blob& a, const base_blob& b) { return a.Compare(b) < 0; } + constexpr int Compare(const base_blob& other) const { return std::memcmp(m_data.data(), other.m_data.data(), WIDTH); } + + friend constexpr bool operator==(const base_blob& a, const base_blob& b) { return a.Compare(b) == 0; } + friend constexpr bool operator!=(const base_blob& a, const base_blob& b) { return a.Compare(b) != 0; } + friend constexpr bool operator<(const base_blob& a, const base_blob& b) { return a.Compare(b) < 0; } std::string GetHex() const; void SetHex(const char* psz); void SetHex(const std::string& str); std::string ToString() const; - const unsigned char* data() const { return m_data; } - unsigned char* data() { return m_data; } + constexpr const unsigned char* data() const { return m_data.data(); } + constexpr unsigned char* data() { return m_data.data(); } - unsigned char* begin() - { - return &m_data[0]; - } + constexpr unsigned char* begin() { return m_data.data(); } + constexpr unsigned char* end() { return m_data.data() + WIDTH; } - unsigned char* end() - { - return &m_data[WIDTH]; - } + constexpr const unsigned char* begin() const { return m_data.data(); } + constexpr const unsigned char* end() const { return m_data.data() + WIDTH; } - const unsigned char* begin() const - { - return &m_data[0]; - } + static constexpr unsigned int size() { return WIDTH; } - const unsigned char* end() const - { - return &m_data[WIDTH]; - } - - unsigned int size() const - { - return sizeof(m_data); - } - - uint64_t GetUint64(int pos) const - { - return ReadLE64(m_data + pos * 8); - } + constexpr uint64_t GetUint64(int pos) const { return ReadLE64(m_data.data() + pos * 8); } template void Serialize(Stream& s) const { - s.write((char*)m_data, sizeof(m_data)); + s.write((char*)m_data.data(), sizeof(m_data)); } template void Unserialize(Stream& s) { - s.read((char*)m_data, sizeof(m_data)); + s.read((char*)m_data.data(), sizeof(m_data)); } }; @@ -107,8 +94,8 @@ public: */ class uint160 : public base_blob<160> { public: - constexpr uint160() {} - explicit uint160(const std::vector& vch) : base_blob<160>(vch) {} + constexpr uint160() = default; + constexpr explicit uint160(Span vch) : base_blob<160>(vch) {} }; /** 256-bit opaque blob. @@ -118,9 +105,9 @@ public: */ class uint256 : public base_blob<256> { public: - constexpr uint256() {} + constexpr uint256() = default; constexpr explicit uint256(uint8_t v) : base_blob<256>(v) {} - explicit uint256(const std::vector& vch) : base_blob<256>(vch) {} + constexpr explicit uint256(Span vch) : base_blob<256>(vch) {} static const uint256 ZERO; static const uint256 ONE; static const uint256 TWO; @@ -157,7 +144,7 @@ public: uint256 trim256() const { uint256 result; - memcpy((void*)&result, (void*)m_data, 32); + memcpy((void*)&result, (void*)m_data.data(), 32); return result; } };