30#include <unordered_map>
31#include <unordered_set>
38#ifndef PURIFY_USE_LEGACY_FIELD_HASHES
39#define PURIFY_USE_LEGACY_FIELD_HASHES 0
50using SecpContextPtr = std::unique_ptr<purify_secp_context, SecpContextDeleter>;
57 if (context ==
nullptr) {
63[[nodiscard]]
inline bool checked_add_size(std::size_t lhs, std::size_t rhs, std::size_t& out)
noexcept {
64 if (rhs > std::numeric_limits<std::size_t>::max() - lhs) {
71[[nodiscard]]
inline bool checked_mul_size(std::size_t lhs, std::size_t rhs, std::size_t& out)
noexcept {
72 if (lhs != 0 && rhs > std::numeric_limits<std::size_t>::max() / lhs) {
80 return value <= static_cast<std::size_t>(std::numeric_limits<std::uint32_t>::max());
84 return value <= static_cast<std::size_t>(std::numeric_limits<std::uint64_t>::max());
91 return static_cast<std::uint64_t
>(value);
95 return value != 0 && (value & (value - 1)) == 0;
99using Bytes = std::vector<unsigned char>;
108 std::size_t reserve_size = 0;
110 out.reserve(reserve_size);
116 std::size_t reserve_size = 0;
118 out.reserve(reserve_size);
128template <std::
size_t MinSize,
typename T>
134 template <std::
size_t Extent>
135 requires(Extent != std::dynamic_extent && Extent >= MinSize)
139 if (
span.size() < MinSize) {
145 [[nodiscard]]
constexpr std::span<T>
span() const noexcept {
149 [[nodiscard]]
constexpr const T*
data() const noexcept {
153 [[nodiscard]]
constexpr std::size_t
size() const noexcept {
157 [[nodiscard]]
constexpr auto begin() const noexcept {
158 return span_.begin();
161 [[nodiscard]]
constexpr auto end() const noexcept {
165 [[nodiscard]]
constexpr operator std::span<T>() const noexcept {
Purify result carrier that either holds a value or an error.
Checked span wrapper that guarantees a minimum runtime length.
constexpr std::size_t size() const noexcept
constexpr auto begin() const noexcept
constexpr SpanAtLeast(std::span< T, Extent > span) noexcept
constexpr const T * data() const noexcept
constexpr auto end() const noexcept
static Result< SpanAtLeast > try_from(std::span< T > span)
constexpr std::span< T > span() const noexcept
static constexpr std::size_t min_size
Library-level error taxonomy used to classify Purify failures.
Status require_secp_context(const purify_secp_context *context, const char *error_context)
constexpr Unexpected< Error > unexpected_error(ErrorCode code, const char *context=nullptr)
Constructs an unexpected Error value from a machine-readable code.
bool size_fits_u64(std::size_t value) noexcept
bool is_power_of_two_size(std::size_t value) noexcept
Result< std::uint64_t > narrow_size_to_u64(std::size_t value, const char *context)
bool checked_mul_size(std::size_t lhs, std::size_t rhs, std::size_t &out) noexcept
std::unique_ptr< purify_secp_context, SecpContextDeleter > SecpContextPtr
SecpContextPtr make_secp_context() noexcept
void best_effort_reserve_mul(std::vector< T > &out, std::size_t lhs, std::size_t rhs)
std::vector< unsigned char > Bytes
Dynamically sized byte string used for messages, serialized witnesses, and proofs.
bool size_fits_u32(std::size_t value) noexcept
void best_effort_reserve_add(std::vector< T > &out, std::size_t lhs, std::size_t rhs)
Reserve capacity when the size arithmetic fits, otherwise skip the hint.
bool checked_add_size(std::size_t lhs, std::size_t rhs, std::size_t &out) noexcept
Narrow C ABI exposing secp256k1 scalar and HMAC helpers to the C++ headers.
void purify_secp_context_destroy(purify_secp_context *context)
Destroys a context returned by purify_secp_context_create.
purify_secp_context * purify_secp_context_create(void)
Creates one reusable secp256k1 context for the Purify bridge and public APIs.
void operator()(purify_secp_context *context) const noexcept