Branch data Line data Source code
1 : : #ifndef BITCOIN_UTIL_TRANSACTION_IDENTIFIER_H
2 : : #define BITCOIN_UTIL_TRANSACTION_IDENTIFIER_H
3 : :
4 : : #include <attributes.h>
5 : : #include <uint256.h>
6 : : #include <util/types.h>
7 : :
8 : : /** transaction_identifier represents the two canonical transaction identifier
9 : : * types (txid, wtxid).*/
10 : : template <bool has_witness>
11 : : class transaction_identifier
12 : : {
13 : : uint256 m_wrapped;
14 : :
15 : : // Note: Use FromUint256 externally instead.
16 [ + - ]: 3915694 : transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {}
17 : :
18 : : // TODO: Comparisons with uint256 should be disallowed once we have
19 : : // converted most of the code to using the new txid types.
20 : 12311 : constexpr int Compare(const uint256& other) const { return m_wrapped.Compare(other); }
21 : 614621166 : constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); }
22 : : template <typename Other>
23 : : constexpr int Compare(const Other& other) const
24 : : {
25 : : static_assert(ALWAYS_FALSE<Other>, "Forbidden comparison type");
26 : : return 0;
27 : : }
28 : :
29 : : public:
30 [ + - + - ]: 1767593 : transaction_identifier() : m_wrapped{} {}
[ + + ]
31 : :
32 : : template <typename Other>
33 [ + + ]: 84559260 : bool operator==(const Other& other) const { return Compare(other) == 0; }
[ + + + + ]
[ + - + +
+ + + - ]
[ + - + -
+ - + - -
- ][ + - +
- + - + -
+ - + - +
- + - + -
+ - + - ]
34 : : template <typename Other>
35 [ + + + - : 71203 : bool operator!=(const Other& other) const { return Compare(other) != 0; }
+ - + - +
+ ][ + - +
+ + + ]
[ + + ][ - +
- + # # #
# # # #
# ][ + - +
- + - + -
+ - + - ]
36 : : template <typename Other>
37 [ + + + + ]: 306921299 : bool operator<(const Other& other) const { return Compare(other) < 0; }
[ + + + +
+ + + + +
+ ][ - + +
- + - + -
- - - - +
+ - - - -
+ + - + +
- - - -
- ][ - - -
- - + - -
- - - - -
- - - - -
- - - - -
+ + - - +
- + + - +
- + - - -
- - + - +
- - - + +
+ + + + +
+ + + + -
- - - - +
+ + + + +
+ - - - -
- ][ + - -
- + + - +
- - - - -
- - - -
- ][ + - -
+ - + # #
# # # # #
# # # #
# ][ - - -
- + + - +
+ - + - +
- - - - -
+ + - - +
+ - - - -
- - - - -
+ - - - -
- + + - -
- - - ][ #
# # # # #
# # # # #
# # # #
# ][ - - +
+ + + + +
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
[ + + ]
38 : :
39 [ + - + - : 1026543 : const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; }
+ - + - +
- + - + -
+ - ][ + -
+ - + - +
- + - + -
+ - + - +
- + - ][ +
- + - +
- ][ + - #
# # # ]
40 [ + + ][ + - : 2573342 : static transaction_identifier FromUint256(const uint256& id) { return {id}; }
+ - + - ]
[ + - + - ]
41 : :
42 : : /** Wrapped `uint256` methods. */
43 [ + + ]: 18064501 : constexpr bool IsNull() const { return m_wrapped.IsNull(); }
44 [ + - ][ + - : 91038 : constexpr void SetNull() { m_wrapped.SetNull(); }
+ - + - +
- ]
45 : 5071 : static std::optional<transaction_identifier> FromHex(std::string_view hex)
46 : : {
47 [ + + ]: 5071 : auto u{uint256::FromHex(hex)};
48 [ + + ]: 5071 : if (!u) return std::nullopt;
49 : 4899 : return FromUint256(*u);
50 : : }
51 [ + - ][ + - : 197966 : std::string GetHex() const { return m_wrapped.GetHex(); }
+ - # # #
# # # ][ +
- + - + -
+ - + - ]
[ + - + -
+ - ][ + -
+ - + - +
- + - +
- ]
52 [ + - ][ + - : 330518 : std::string ToString() const { return m_wrapped.ToString(); }
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - -
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - - - -
- + - + -
+ - + - +
- + - + -
+ - ][ + -
+ - + - +
- + - + -
+ - ][ + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- ][ + - +
- + - + -
+ - + - ]
[ + - + -
+ - + - ]
[ + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
# # ][ + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - #
# ][ + - +
- + - + -
+ - # # #
# ][ + - +
- # # ][ -
- + - -
- ][ + - +
- + - + -
- - - - +
- - - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - ][ + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - ]
53 : : static constexpr auto size() { return decltype(m_wrapped)::size(); }
54 [ + - + - : 6 : constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); }
+ - + - +
- + - ]
55 [ + - ]: 252977 : constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); }
56 : 67 : constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); }
57 : 31336839 : template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); }
58 : 638053 : template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); }
59 : :
60 : : /** Conversion function to `uint256`.
61 : : *
62 : : * Note: new code should use `ToUint256`.
63 : : *
64 : : * TODO: This should be removed once the majority of the code has switched
65 : : * to using the Txid and Wtxid types. Until then it makes for a smoother
66 : : * transition to allow this conversion. */
67 [ + - ]: 256425480 : operator const uint256&() const LIFETIMEBOUND { return m_wrapped; }
[ + - + - ]
[ + - + -
+ + + - +
- + - ][ +
- + - + -
+ - + - +
- + - ][ +
- + - +
- ][ + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
+ + - + -
+ - + - +
- + - +
- ][ + - +
- + - + -
+ - ][ + -
+ - + - +
- # # # #
# # # # #
# # # #
# ][ - - +
- + - + -
+ - + - +
- + - + -
+ - + - ]
[ + - + -
+ - + - +
- + - + -
+ - + - +
- ][ + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- # # #
# ][ + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - +
- ][ + - +
- + - + -
+ - + - +
- + - # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
68 : : };
69 : :
70 : : /** Txid commits to all transaction fields except the witness. */
71 : : using Txid = transaction_identifier<false>;
72 : : /** Wtxid commits to all transaction fields including the witness. */
73 : : using Wtxid = transaction_identifier<true>;
74 : :
75 : : #endif // BITCOIN_UTIL_TRANSACTION_IDENTIFIER_H
|