mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-09 11:27:28 -03:00
Merge bitcoin/bitcoin#31540: refactor: std::span compat fixes
fa494a1d53
refactor: Specify const in std::span constructor, where needed (MarcoFalke)faaf4800aa
Allow std::span in stream serialization (MarcoFalke)faa5391f77
refactor: test: Return std::span from StringBytes (MarcoFalke)fa86223475
refactor: Avoid passing span iterators when data pointers are expected (MarcoFalke)faae6fa5f6
refactor: Simplify SpanPopBack (MarcoFalke)facc4f120b
refactor: Replace fwd-decl with proper include (MarcoFalke)fac3a782ea
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: utACKfa494a1d53
fjahr: Code review ACKfa494a1d53
achow101: ACKfa494a1d53
theuni: utACKfa494a1d53
. adamandrews1: utACKfa494a1d53
Tree-SHA512: 9440941823e884ff5d7ac161f58b9a0704d8e803b4c91c400bdb5f58f898e4637d63ae627cfc7330e98a721fc38285a04641175aa18d991bd35f8b69ed1d74c4
This commit is contained in:
commit
e6f14241f6
11 changed files with 17 additions and 20 deletions
|
@ -139,7 +139,7 @@ std::string EncodeBase58Check(Span<const unsigned char> input)
|
||||||
// add 4-byte hash check to the end
|
// add 4-byte hash check to the end
|
||||||
std::vector<unsigned char> vch(input.begin(), input.end());
|
std::vector<unsigned char> vch(input.begin(), input.end());
|
||||||
uint256 hash = Hash(vch);
|
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);
|
return EncodeBase58(vch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1798,7 +1798,7 @@ inline NodeRef<Key> Parse(Span<const char> in, const Ctx& ctx)
|
||||||
// Get threshold
|
// Get threshold
|
||||||
int next_comma = FindNextChar(in, ',');
|
int next_comma = FindNextChar(in, ',');
|
||||||
if (next_comma < 1) return false;
|
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;
|
if (!k_to_integral.has_value()) return false;
|
||||||
const int64_t k{k_to_integral.value()};
|
const int64_t k{k_to_integral.value()};
|
||||||
in = in.subspan(next_comma + 1);
|
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)) {
|
} else if (Const("after(", in)) {
|
||||||
int arg_size = FindNextChar(in, ')');
|
int arg_size = FindNextChar(in, ')');
|
||||||
if (arg_size < 1) return {};
|
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 {};
|
if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
|
||||||
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::AFTER, *num));
|
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::AFTER, *num));
|
||||||
in = in.subspan(arg_size + 1);
|
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)) {
|
} else if (Const("older(", in)) {
|
||||||
int arg_size = FindNextChar(in, ')');
|
int arg_size = FindNextChar(in, ')');
|
||||||
if (arg_size < 1) return {};
|
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 {};
|
if (!num.has_value() || *num < 1 || *num >= 0x80000000L) return {};
|
||||||
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::OLDER, *num));
|
constructed.push_back(MakeNodeRef<Key>(internal::NoDupCheck{}, ctx.MsContext(), Fragment::OLDER, *num));
|
||||||
in = in.subspan(arg_size + 1);
|
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)) {
|
} else if (Const("thresh(", in)) {
|
||||||
int next_comma = FindNextChar(in, ',');
|
int next_comma = FindNextChar(in, ',');
|
||||||
if (next_comma < 1) return {};
|
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 {};
|
if (!k.has_value() || *k < 1) return {};
|
||||||
in = in.subspan(next_comma + 1);
|
in = in.subspan(next_comma + 1);
|
||||||
// n = 1 here because we read the first WRAPPED_EXPR before reaching THRESH
|
// n = 1 here because we read the first WRAPPED_EXPR before reaching THRESH
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <attributes.h>
|
#include <attributes.h>
|
||||||
#include <script/script.h>
|
#include <script/script.h>
|
||||||
|
#include <span.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
@ -17,7 +18,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class CPubKey;
|
class CPubKey;
|
||||||
template <typename C> class Span;
|
|
||||||
|
|
||||||
enum class TxoutType {
|
enum class TxoutType {
|
||||||
NONSTANDARD,
|
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> 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, 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, 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, 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
|
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> 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, 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::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, 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); }
|
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)
|
T& SpanPopBack(Span<T>& span)
|
||||||
{
|
{
|
||||||
size_t size = span.size();
|
size_t size = span.size();
|
||||||
ASSERT_IF_DEBUG(size > 0);
|
T& back = span.back();
|
||||||
T& back = span[size - 1];
|
span = span.first(size - 1);
|
||||||
span = Span<T>(span.data(), size - 1);
|
|
||||||
return back;
|
return back;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ public:
|
||||||
memcpy(vchData.data() + nPos, src.data(), nOverwrite);
|
memcpy(vchData.data() + nPos, src.data(), nOverwrite);
|
||||||
}
|
}
|
||||||
if (nOverwrite < src.size()) {
|
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();
|
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());
|
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.
|
// 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) {
|
if (s.template GetParams<BaseFormat>().m_base_format == BaseFormat::RAW) {
|
||||||
s << m_base_data;
|
s << m_base_data;
|
||||||
} else {
|
} 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 <netaddress.h>
|
||||||
#include <node/connection_types.h>
|
#include <node/connection_types.h>
|
||||||
#include <node/eviction.h>
|
#include <node/eviction.h>
|
||||||
|
#include <span.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <util/sock.h>
|
#include <util/sock.h>
|
||||||
|
|
||||||
|
@ -28,9 +29,6 @@
|
||||||
|
|
||||||
class FastRandomContext;
|
class FastRandomContext;
|
||||||
|
|
||||||
template <typename C>
|
|
||||||
class Span;
|
|
||||||
|
|
||||||
struct ConnmanTestMsg : public CConnman {
|
struct ConnmanTestMsg : public CConnman {
|
||||||
using CConnman::CConnman;
|
using CConnman::CConnman;
|
||||||
|
|
||||||
|
|
|
@ -8,13 +8,12 @@
|
||||||
#include <crypto/common.h>
|
#include <crypto/common.h>
|
||||||
#include <crypto/siphash.h>
|
#include <crypto/siphash.h>
|
||||||
#include <primitives/transaction.h>
|
#include <primitives/transaction.h>
|
||||||
|
#include <span.h>
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
template <typename C> class Span;
|
|
||||||
|
|
||||||
class SaltedTxidHasher
|
class SaltedTxidHasher
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -34,9 +34,9 @@ inline std::ostream& operator<<(std::ostream& os, const std::pair<const Serializ
|
||||||
|
|
||||||
namespace wallet {
|
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)
|
static SerializeData StringData(std::string_view str)
|
||||||
|
|
Loading…
Reference in a new issue