mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-19 01:42:58 +01:00
tinyformat: Add compile-time checking for literal format strings
Co-authored-by: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz>
This commit is contained in:
parent
184f34f2d0
commit
fe39acf88f
@ -145,6 +145,7 @@ namespace tfm = tinyformat;
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <stdexcept> // Added for Bitcoin Core
|
||||
#include <util/string.h> // Added for Bitcoin Core
|
||||
|
||||
#ifndef TINYFORMAT_ASSERT
|
||||
# include <cassert>
|
||||
@ -178,6 +179,18 @@ namespace tfm = tinyformat;
|
||||
|
||||
namespace tinyformat {
|
||||
|
||||
// Added for Bitcoin Core. Wrapper for checking format strings at compile time.
|
||||
// Unlike ConstevalFormatString this supports std::string for runtime string
|
||||
// formatting without compile time checks.
|
||||
template <unsigned num_params>
|
||||
struct FormatStringCheck {
|
||||
consteval FormatStringCheck(const char* str) : fmt{util::ConstevalFormatString<num_params>{str}.fmt} {}
|
||||
FormatStringCheck(const std::string& str) : fmt{str.c_str()} {}
|
||||
FormatStringCheck(util::ConstevalFormatString<num_params> str) : fmt{str.fmt} {}
|
||||
operator const char*() { return fmt; }
|
||||
const char* fmt;
|
||||
};
|
||||
|
||||
// Added for Bitcoin Core
|
||||
class format_error: public std::runtime_error
|
||||
{
|
||||
@ -1056,7 +1069,7 @@ inline void vformat(std::ostream& out, const char* fmt, FormatListRef list)
|
||||
|
||||
/// Format list of arguments to the stream according to given format string.
|
||||
template<typename... Args>
|
||||
void format(std::ostream& out, const char* fmt, const Args&... args)
|
||||
void format(std::ostream& out, FormatStringCheck<sizeof...(Args)> fmt, const Args&... args)
|
||||
{
|
||||
vformat(out, fmt, makeFormatList(args...));
|
||||
}
|
||||
@ -1064,7 +1077,7 @@ void format(std::ostream& out, const char* fmt, const Args&... args)
|
||||
/// Format list of arguments according to the given format string and return
|
||||
/// the result as a string.
|
||||
template<typename... Args>
|
||||
std::string format(const char* fmt, const Args&... args)
|
||||
std::string format(FormatStringCheck<sizeof...(Args)> fmt, const Args&... args)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
format(oss, fmt, args...);
|
||||
@ -1073,13 +1086,13 @@ std::string format(const char* fmt, const Args&... args)
|
||||
|
||||
/// Format list of arguments to std::cout, according to the given format string
|
||||
template<typename... Args>
|
||||
void printf(const char* fmt, const Args&... args)
|
||||
void printf(FormatStringCheck<sizeof...(Args)> fmt, const Args&... args)
|
||||
{
|
||||
format(std::cout, fmt, args...);
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
void printfln(const char* fmt, const Args&... args)
|
||||
void printfln(FormatStringCheck<sizeof...(Args)> fmt, const Args&... args)
|
||||
{
|
||||
format(std::cout, fmt, args...);
|
||||
std::cout << '\n';
|
||||
@ -1145,15 +1158,6 @@ TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_FUNCS)
|
||||
|
||||
#endif
|
||||
|
||||
// Added for Bitcoin Core
|
||||
template<typename... Args>
|
||||
std::string format(const std::string &fmt, const Args&... args)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
format(oss, fmt.c_str(), args...);
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
} // namespace tinyformat
|
||||
|
||||
// Added for Bitcoin Core:
|
||||
|
@ -6,7 +6,6 @@
|
||||
#define BITCOIN_UTIL_STRING_H
|
||||
|
||||
#include <span.h>
|
||||
#include <tinyformat.h>
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
@ -247,12 +246,4 @@ template <typename T1, size_t PREFIX_LEN>
|
||||
}
|
||||
} // namespace util
|
||||
|
||||
namespace tinyformat {
|
||||
template <typename... Args>
|
||||
std::string format(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args)
|
||||
{
|
||||
return format(fmt.fmt, args...);
|
||||
}
|
||||
} // namespace tinyformat
|
||||
|
||||
#endif // BITCOIN_UTIL_STRING_H
|
||||
|
Loading…
Reference in New Issue
Block a user