/src/botan/build/include/botan/internal/fmt.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * (C) 2023 Jack Lloyd |
3 | | * |
4 | | * Botan is released under the Simplified BSD License (see license.txt) |
5 | | */ |
6 | | |
7 | | #ifndef BOTAN_UTIL_FMT_H_ |
8 | | #define BOTAN_UTIL_FMT_H_ |
9 | | |
10 | | #include <botan/types.h> |
11 | | #include <locale> |
12 | | #include <sstream> |
13 | | #include <string> |
14 | | #include <string_view> |
15 | | |
16 | | namespace Botan { |
17 | | |
18 | | namespace fmt_detail { |
19 | | |
20 | 0 | inline void do_fmt(std::ostringstream& oss, std::string_view format) { oss << format; } |
21 | | |
22 | | template <typename T, typename... Ts> |
23 | 0 | void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) { |
24 | 0 | size_t i = 0; |
25 | |
|
26 | 0 | while(i < format.size()) { |
27 | 0 | if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') { |
28 | 0 | oss << val; |
29 | 0 | return do_fmt(oss, format.substr(i + 2), rest...); |
30 | 0 | } else { |
31 | 0 | oss << format[i]; |
32 | 0 | } |
33 | | |
34 | 0 | i += 1; |
35 | 0 | } |
36 | 0 | } Unexecuted instantiation: void Botan::fmt_detail::do_fmt<char const*, char const*, char const*>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&, char const* const&, char const* const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<char const*, char const*>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&, char const* const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<char const*>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const*>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, char const* const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<char const*, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, unsigned long const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<unsigned long>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, int>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, int const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<int>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, int const&) Unexecuted instantiation: void Botan::fmt_detail::do_fmt<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >>(std::__1::basic_ostringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) |
37 | | |
38 | | } // namespace fmt_detail |
39 | | |
40 | | /** |
41 | | * Simple formatter utility. |
42 | | * |
43 | | * Should be replaced with std::format once that's available on all our |
44 | | * supported compilers. |
45 | | * |
46 | | * '{}' markers in the format string are replaced by the arguments. |
47 | | * Unlike std::format, there is no support for escaping or for any kind |
48 | | * of conversion flags. |
49 | | */ |
50 | | template <typename... T> |
51 | 0 | std::string fmt(std::string_view format, const T&... args) { |
52 | 0 | std::ostringstream oss; |
53 | 0 | oss.imbue(std::locale::classic()); |
54 | 0 | fmt_detail::do_fmt(oss, format, args...); |
55 | 0 | return oss.str(); |
56 | 0 | } Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<char const*, char const*, char const*>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&, char const* const&, char const* const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const*>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, char const* const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<char const*, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, char const* const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, unsigned long const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<unsigned long, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, unsigned long const&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string_view<char, std::__1::char_traits<char> >, int>(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, int const&) Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Botan::fmt<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) |
57 | | |
58 | | } // namespace Botan |
59 | | |
60 | | #endif |