1 // Copyright (c) 2020-2021 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_UTIL_HASH_TYPE_H
6 #define BITCOIN_UTIL_HASH_TYPE_H
7 
8 template <typename HashType>
9 class BaseHash
10 {
11 protected:
12     HashType m_hash;
13 
14 public:
BaseHash()15     BaseHash() : m_hash() {}
BaseHash(const HashType & in)16     explicit BaseHash(const HashType& in) : m_hash(in) {}
17 
begin()18     unsigned char* begin()
19     {
20         return m_hash.begin();
21     }
22 
begin()23     const unsigned char* begin() const
24     {
25         return m_hash.begin();
26     }
27 
end()28     unsigned char* end()
29     {
30         return m_hash.end();
31     }
32 
end()33     const unsigned char* end() const
34     {
35         return m_hash.end();
36     }
37 
38     operator std::vector<unsigned char>() const
39     {
40         return std::vector<unsigned char>{m_hash.begin(), m_hash.end()};
41     }
42 
ToString()43     std::string ToString() const
44     {
45         return m_hash.ToString();
46     }
47 
48     bool operator==(const BaseHash<HashType>& other) const noexcept
49     {
50         return m_hash == other.m_hash;
51     }
52 
53     bool operator!=(const BaseHash<HashType>& other) const noexcept
54     {
55         return !(m_hash == other.m_hash);
56     }
57 
58     bool operator<(const BaseHash<HashType>& other) const noexcept
59     {
60         return m_hash < other.m_hash;
61     }
62 
size()63     size_t size() const
64     {
65         return m_hash.size();
66     }
67 
data()68     unsigned char* data() { return m_hash.data(); }
data()69     const unsigned char* data() const { return m_hash.data(); }
70 };
71 
72 #endif // BITCOIN_UTIL_HASH_TYPE_H
73