Branch data Line data Source code
# 1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto # 2 : : // Copyright (c) 2009-2019 The Bitcoin Core developers # 3 : : // Distributed under the MIT software license, see the accompanying # 4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 5 : : # 6 : : #ifndef BITCOIN_UINT256_H # 7 : : #define BITCOIN_UINT256_H # 8 : : # 9 : : #include <assert.h> # 10 : : #include <cstring> # 11 : : #include <stdint.h> # 12 : : #include <string> # 13 : : #include <vector> # 14 : : # 15 : : /** Template base class for fixed-sized opaque blobs. */ # 16 : : template<unsigned int BITS> # 17 : : class base_blob # 18 : : { # 19 : : protected: # 20 : : static constexpr int WIDTH = BITS / 8; # 21 : : uint8_t m_data[WIDTH]; # 22 : : public: # 23 : : /* construct 0 value by default */ # 24 : 614536636 : constexpr base_blob() : m_data() {} # 25 : : # 26 : : /* constructor for constants between 1 and 255 */ # 27 : : constexpr explicit base_blob(uint8_t v) : m_data{v} {} # 28 : : # 29 : : explicit base_blob(const std::vector<unsigned char>& vch); # 30 : : # 31 : : bool IsNull() const # 32 : 22316159 : { # 33 : 94759230 : for (int i = 0; i < WIDTH; i++) # 34 : 92480482 : if (m_data[i] != 0) # 35 : 20037411 : return false; # 36 : 2278748 : return true; # 37 : 22316159 : } # 38 : : # 39 : : void SetNull() # 40 : 2278794 : { # 41 : 2278794 : memset(m_data, 0, sizeof(m_data)); # 42 : 2278794 : } # 43 : : # 44 : 1704189697 : inline int Compare(const base_blob& other) const { return memcmp(m_data, other.m_data, sizeof(m_data)); } # 45 : : # 46 : 145195572 : friend inline bool operator==(const base_blob& a, const base_blob& b) { return a.Compare(b) == 0; } # 47 : 662021 : friend inline bool operator!=(const base_blob& a, const base_blob& b) { return a.Compare(b) != 0; } # 48 : 1200711895 : friend inline bool operator<(const base_blob& a, const base_blob& b) { return a.Compare(b) < 0; } # 49 : : # 50 : : std::string GetHex() const; # 51 : : void SetHex(const char* psz); # 52 : : void SetHex(const std::string& str); # 53 : : std::string ToString() const; # 54 : : # 55 : 1428524 : const unsigned char* data() const { return m_data; } # 56 : 5971160 : unsigned char* data() { return m_data; } # 57 : : # 58 : : unsigned char* begin() # 59 : 33125557 : { # 60 : 33125557 : return &m_data[0]; # 61 : 33125557 : } # 62 : : # 63 : : unsigned char* end() # 64 : 23008 : { # 65 : 23008 : return &m_data[WIDTH]; # 66 : 23008 : } # 67 : : # 68 : : const unsigned char* begin() const # 69 : 101068862 : { # 70 : 101068862 : return &m_data[0]; # 71 : 101068862 : } # 72 : : # 73 : : const unsigned char* end() const # 74 : 1001350 : { # 75 : 1001350 : return &m_data[WIDTH]; # 76 : 1001350 : } # 77 : : # 78 : : unsigned int size() const # 79 : 14340025 : { # 80 : 14340025 : return sizeof(m_data); # 81 : 14340025 : } # 82 : : # 83 : : uint64_t GetUint64(int pos) const # 84 : 739701114 : { # 85 : 739701114 : const uint8_t* ptr = m_data + pos * 8; # 86 : 739701114 : return ((uint64_t)ptr[0]) | \ # 87 : 739701114 : ((uint64_t)ptr[1]) << 8 | \ # 88 : 739701114 : ((uint64_t)ptr[2]) << 16 | \ # 89 : 739701114 : ((uint64_t)ptr[3]) << 24 | \ # 90 : 739701114 : ((uint64_t)ptr[4]) << 32 | \ # 91 : 739701114 : ((uint64_t)ptr[5]) << 40 | \ # 92 : 739701114 : ((uint64_t)ptr[6]) << 48 | \ # 93 : 739701114 : ((uint64_t)ptr[7]) << 56; # 94 : 739701114 : } # 95 : : # 96 : : template<typename Stream> # 97 : : void Serialize(Stream& s) const # 98 : 65924175 : { # 99 : 65924175 : s.write((char*)m_data, sizeof(m_data)); # 100 : 65924175 : } # 101 : : # 102 : : template<typename Stream> # 103 : : void Unserialize(Stream& s) # 104 : 1110525 : { # 105 : 1110525 : s.read((char*)m_data, sizeof(m_data)); # 106 : 1110525 : } # 107 : : }; # 108 : : # 109 : : /** 160-bit opaque blob. # 110 : : * @note This type is called uint160 for historical reasons only. It is an opaque # 111 : : * blob of 160 bits and has no integer operations. # 112 : : */ # 113 : : class uint160 : public base_blob<160> { # 114 : : public: # 115 : 7371618 : constexpr uint160() {} # 116 : 2029180 : explicit uint160(const std::vector<unsigned char>& vch) : base_blob<160>(vch) {} # 117 : : }; # 118 : : # 119 : : /** 256-bit opaque blob. # 120 : : * @note This type is called uint256 for historical reasons only. It is an # 121 : : * opaque blob of 256 bits and has no integer operations. Use arith_uint256 if # 122 : : * those are required. # 123 : : */ # 124 : : class uint256 : public base_blob<256> { # 125 : : public: # 126 : 607164991 : constexpr uint256() {} # 127 : 0 : constexpr explicit uint256(uint8_t v) : base_blob<256>(v) {} # 128 : 2736 : explicit uint256(const std::vector<unsigned char>& vch) : base_blob<256>(vch) {} # 129 : : static const uint256 ZERO; # 130 : : static const uint256 ONE; # 131 : : }; # 132 : : # 133 : : /* uint256 from const char *. # 134 : : * This is a separate function because the constructor uint256(const char*) can result # 135 : : * in dangerously catching uint256(0). # 136 : : */ # 137 : : inline uint256 uint256S(const char *str) # 138 : 79872 : { # 139 : 79872 : uint256 rv; # 140 : 79872 : rv.SetHex(str); # 141 : 79872 : return rv; # 142 : 79872 : } # 143 : : /* uint256 from std::string. # 144 : : * This is a separate function because the constructor uint256(const std::string &str) can result # 145 : : * in dangerously catching uint256(0) via std::string(const char*). # 146 : : */ # 147 : : inline uint256 uint256S(const std::string& str) # 148 : 20880 : { # 149 : 20880 : uint256 rv; # 150 : 20880 : rv.SetHex(str); # 151 : 20880 : return rv; # 152 : 20880 : } # 153 : : # 154 : : #endif // BITCOIN_UINT256_H