mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-24 16:01:26 +02:00
Merge bitcoin/bitcoin#31540: refactor: std::span compat fixes
fa494a1d53f3f030fafe7b533d72b2200428a0fd refactor: Specify const in std::span constructor, where needed (MarcoFalke)
faaf4800aa752dde63b8987b1eb0de4e54acf717 Allow std::span in stream serialization (MarcoFalke)
faa5391f77037601875cf4ed154bc42840d34b12 refactor: test: Return std::span from StringBytes (MarcoFalke)
fa86223475353cc994cc2563ba5aecc406d00815 refactor: Avoid passing span iterators when data pointers are expected (MarcoFalke)
faae6fa5f614425f6d58af6f224d4f5aae3e1bed refactor: Simplify SpanPopBack (MarcoFalke)
facc4f120b067af6f94f3125cecc9dafff3e5d57 refactor: Replace fwd-decl with proper include (MarcoFalke)
fac3a782eaf3fa5f12cd908ef6dbc874d4b0e2ba refactor: Avoid needless, unsafe c-style cast (MarcoFalke)
Pull request description:
The `std::span` type is already used in some parts of the codebase, and in most contexts can implicitly convert to and from `Span`. However, the two types are not identical in behavior and trying to use one over the other can result in compile failures in some contexts.
Fix all those issues by allowing either `Span` or `std::span` in any part of the codebase.
All of the changes are also required for the scripted-diff to replace `Span` with `std::span` in https://github.com/bitcoin/bitcoin/pull/31519
ACKs for top commit:
sipa:
utACK fa494a1d53f3f030fafe7b533d72b2200428a0fd
fjahr:
Code review ACK fa494a1d53f3f030fafe7b533d72b2200428a0fd
achow101:
ACK fa494a1d53f3f030fafe7b533d72b2200428a0fd
theuni:
utACK fa494a1d53f3f030fafe7b533d72b2200428a0fd.
adamandrews1:
utACK fa494a1d53
Tree-SHA512: 9440941823e884ff5d7ac161f58b9a0704d8e803b4c91c400bdb5f58f898e4637d63ae627cfc7330e98a721fc38285a04641175aa18d991bd35f8b69ed1d74c4
This commit is contained in:
commit
e6f14241f6
@ -139,7 +139,7 @@ std::string EncodeBase58Check(Span<const unsigned char> input)
|
||||
// add 4-byte hash check to the end
|
||||
std::vector<unsigned char> vch(input.begin(), input.end());
|
||||
uint256 hash = Hash(vch);
|
||||
vch.insert(vch.end(), (unsigned char*)&hash, (unsigned char*)&hash + 4);
|
||||
vch.insert(vch.end(), hash.data(), hash.data() + 4);
|
||||
return EncodeBase58(vch);
|
||||
}
|
||||
|
||||
|
@ -1798,7 +1798,7 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
|
||||
// Get threshold
|
||||
int next_comma = FindNextChar(in, ',');
|
||||
if (next_comma < 1) return false;
|
||||
const auto k_to_integral{ToIntegral<int64_t>(std::string_view(in.begin(), next_comma))};
|
||||
const auto k_to_integral{ToIntegral<int64_t>(std::string_view(in.data(), next_comma))};
|
||||
if (!k_to_integral.has_value()) return false;
|
||||
const int64_t k{k_to_integral.value()};
|
||||
in = in.subspan(next_comma + 1);
|
||||
@ -1954,7 +1954,7 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
|
||||
} else if (Const("after(", in)) {
|
||||
int arg_size = FindNextChar(in, ')');
|
||||
if (arg_size < 1) return {};
|
||||
const auto num{ToIntegral<int64_t>(std::string_view(in.begin(), arg_size))};
|
||||
const auto num{ToIntegral<int64_t>(std::string_view(in.data(), arg_size))};
|
||||
if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
|
||||
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::AFTER, *num));
|
||||
in = in.subspan(arg_size + 1);
|
||||
@ -1962,7 +1962,7 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
|
||||
} else if (Const("older(", in)) {
|
||||
int arg_size = FindNextChar(in, ')');
|
||||
if (arg_size < 1) return {};
|
||||
const auto num{ToIntegral<int64_t>(std::string_view(in.begin(), arg_size))};
|
||||
const auto num{ToIntegral<int64_t>(std::string_view(in.data(), arg_size))};
|
||||
if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
|
||||
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::OLDER, *num));
|
||||
in = in.subspan(arg_size + 1);
|
||||
@ -1974,7 +1974,7 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
|
||||
} else if (Const("thresh(", in)) {
|
||||
int next_comma = FindNextChar(in, ',');
|
||||
if (next_comma < 1) return {};
|
||||
const auto k{ToIntegral<int64_t>(std::string_view(in.begin(), next_comma))};
|
||||
const auto k{ToIntegral<int64_t>(std::string_view(in.data(), next_comma))};
|
||||
if (!k.has_value() || *k < 1) return {};
|
||||
in = in.subspan(next_comma + 1);
|
||||
// n = 1 here because we read the first WRAPPED_EXPR before reaching THRESH
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
#include <attributes.h>
|
||||
#include <script/script.h>
|
||||
#include <span.h>
|
||||
|
||||
#include <string>
|
||||
#include <optional>
|
||||
@ -17,7 +18,6 @@
|
||||
#include <vector>
|
||||
|
||||
class CPubKey;
|
||||
template <typename C> class Span;
|
||||
|
||||
enum class TxoutType {
|
||||
NONSTANDARD,
|
||||
|
@ -264,6 +264,7 @@ template<typename Stream> inline void Serialize(Stream& s, int64_t a ) { ser_wri
|
||||
template<typename Stream> inline void Serialize(Stream& s, uint64_t a) { ser_writedata64(s, a); }
|
||||
template <typename Stream, BasicByte B, int N> void Serialize(Stream& s, const B (&a)[N]) { s.write(MakeByteSpan(a)); }
|
||||
template <typename Stream, BasicByte B, std::size_t N> void Serialize(Stream& s, const std::array<B, N>& a) { s.write(MakeByteSpan(a)); }
|
||||
template <typename Stream, BasicByte B, std::size_t N> void Serialize(Stream& s, std::span<B, N> span) { s.write(std::as_bytes(span)); }
|
||||
template <typename Stream, BasicByte B> void Serialize(Stream& s, Span<B> span) { s.write(AsBytes(span)); }
|
||||
|
||||
template <typename Stream, CharNotInt8 V> void Unserialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
|
||||
@ -278,6 +279,7 @@ template<typename Stream> inline void Unserialize(Stream& s, int64_t& a ) { a =
|
||||
template<typename Stream> inline void Unserialize(Stream& s, uint64_t& a) { a = ser_readdata64(s); }
|
||||
template <typename Stream, BasicByte B, int N> void Unserialize(Stream& s, B (&a)[N]) { s.read(MakeWritableByteSpan(a)); }
|
||||
template <typename Stream, BasicByte B, std::size_t N> void Unserialize(Stream& s, std::array<B, N>& a) { s.read(MakeWritableByteSpan(a)); }
|
||||
template <typename Stream, BasicByte B, std::size_t N> void Unserialize(Stream& s, std::span<B, N> span) { s.read(std::as_writable_bytes(span)); }
|
||||
template <typename Stream, BasicByte B> void Unserialize(Stream& s, Span<B> span) { s.read(AsWritableBytes(span)); }
|
||||
|
||||
template <typename Stream> inline void Serialize(Stream& s, bool a) { uint8_t f = a; ser_writedata8(s, f); }
|
||||
|
@ -248,9 +248,8 @@ template <typename T>
|
||||
T& SpanPopBack(Span<T>& span)
|
||||
{
|
||||
size_t size = span.size();
|
||||
ASSERT_IF_DEBUG(size > 0);
|
||||
T& back = span[size - 1];
|
||||
span = Span<T>(span.data(), size - 1);
|
||||
T& back = span.back();
|
||||
span = span.first(size - 1);
|
||||
return back;
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ public:
|
||||
memcpy(vchData.data() + nPos, src.data(), nOverwrite);
|
||||
}
|
||||
if (nOverwrite < src.size()) {
|
||||
vchData.insert(vchData.end(), UCharCast(src.data()) + nOverwrite, UCharCast(src.end()));
|
||||
vchData.insert(vchData.end(), UCharCast(src.data()) + nOverwrite, UCharCast(src.data() + src.size()));
|
||||
}
|
||||
nPos += src.size();
|
||||
}
|
||||
|
@ -1700,9 +1700,8 @@ BOOST_AUTO_TEST_CASE(bip341_keypath_test_vectors)
|
||||
BOOST_CHECK_EQUAL(HexStr(sighash), input["intermediary"]["sigHash"].get_str());
|
||||
|
||||
// To verify the sigmsg, hash the expected sigmsg, and compare it with the (expected) sighash.
|
||||
BOOST_CHECK_EQUAL(HexStr((HashWriter{HASHER_TAPSIGHASH} << Span{ParseHex(input["intermediary"]["sigMsg"].get_str())}).GetSHA256()), input["intermediary"]["sigHash"].get_str());
|
||||
BOOST_CHECK_EQUAL(HexStr((HashWriter{HASHER_TAPSIGHASH} << std::span<const uint8_t>{ParseHex(input["intermediary"]["sigMsg"].get_str())}).GetSHA256()), input["intermediary"]["sigHash"].get_str());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -304,7 +304,7 @@ public:
|
||||
if (s.template GetParams<BaseFormat>().m_base_format == BaseFormat::RAW) {
|
||||
s << m_base_data;
|
||||
} else {
|
||||
s << Span{HexStr(Span{&m_base_data, 1})};
|
||||
s << std::span<const char>{HexStr(Span{&m_base_data, 1})};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <netaddress.h>
|
||||
#include <node/connection_types.h>
|
||||
#include <node/eviction.h>
|
||||
#include <span.h>
|
||||
#include <sync.h>
|
||||
#include <util/sock.h>
|
||||
|
||||
@ -28,9 +29,6 @@
|
||||
|
||||
class FastRandomContext;
|
||||
|
||||
template <typename C>
|
||||
class Span;
|
||||
|
||||
struct ConnmanTestMsg : public CConnman {
|
||||
using CConnman::CConnman;
|
||||
|
||||
|
@ -8,13 +8,12 @@
|
||||
#include <crypto/common.h>
|
||||
#include <crypto/siphash.h>
|
||||
#include <primitives/transaction.h>
|
||||
#include <span.h>
|
||||
#include <uint256.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
|
||||
template <typename C> class Span;
|
||||
|
||||
class SaltedTxidHasher
|
||||
{
|
||||
private:
|
||||
|
@ -34,9 +34,9 @@ inline std::ostream& operator<<(std::ostream& os, const std::pair<const Serializ
|
||||
|
||||
namespace wallet {
|
||||
|
||||
static Span<const std::byte> StringBytes(std::string_view str)
|
||||
inline std::span<const std::byte> StringBytes(std::string_view str)
|
||||
{
|
||||
return AsBytes<const char>({str.data(), str.size()});
|
||||
return std::as_bytes(std::span{str});
|
||||
}
|
||||
|
||||
static SerializeData StringData(std::string_view str)
|
||||
|
Loading…
x
Reference in New Issue
Block a user