11#pragma once
22
3+ #include < cstdio>
4+
35#include " SevenBit/DI/LibraryConfig.hpp"
46
57#include " SevenBit/DI/Details/Helpers/Formatter.hpp"
68
79namespace sb ::di::details
810{
11+ namespace FormatterInternal
12+ {
13+ int assertFormatRes (int result, const char *fmt)
14+ {
15+ if (result < 0 )
16+ {
17+ throw std::runtime_error (std::string{" Format string error: " } + fmt);
18+ }
19+ return result;
20+ }
21+
22+ template <class T > void appendFormatted (std::string &result, T data, const char *fmt)
23+ {
24+ constexpr size_t buffSize = 100 ;
25+ char buffer[buffSize];
26+ auto size = assertFormatRes (std::snprintf (buffer, buffSize, fmt, data), fmt);
27+ if (size < buffSize)
28+ {
29+ result += std::string_view (buffer, size);
30+ }
31+ else
32+ {
33+ std::vector<char > largeBuff (size + 1 );
34+ assertFormatRes (std::snprintf (largeBuff.data (), size + 1 , fmt, data), fmt);
35+ result += std::string_view (largeBuff.data (), size);
36+ }
37+ }
38+
39+ std::string makeArgFmt (std::string_view coreFmt, std::string_view baseFmt)
40+ {
41+ std::string fmt = " %" ;
42+ fmt += coreFmt;
43+ // base fmt contains % at the beginning
44+ fmt += baseFmt.substr (1 );
45+ return fmt;
46+ }
47+
48+ template <class N >
49+ void appendNum (std::string &result, N arg, const std::string_view coreFmt, const char *baseFmt)
50+ {
51+ if (!coreFmt.empty ())
52+ {
53+ const auto format = makeArgFmt (coreFmt, baseFmt);
54+ return appendFormatted (result, arg, format.c_str ());
55+ }
56+ return appendFormatted (result, arg, baseFmt);
57+ }
58+ } // namespace FormatterInternal
59+
960 INLINE Formatter::Formatter (const std::string_view formatString) : formatString(formatString)
1061 {
1162 result.reserve (formatString.size ());
@@ -17,8 +68,8 @@ namespace sb::di::details
1768 {
1869 if (!fmt.empty ())
1970 {
20- const auto format = makeArgFmt (fmt, " %s" );
21- return appendFormatted (arg, format.c_str ());
71+ const auto format = FormatterInternal:: makeArgFmt (fmt, " %s" );
72+ return FormatterInternal:: appendFormatted (result, arg, format.c_str ());
2273 }
2374 result += arg;
2475 }
@@ -41,31 +92,40 @@ namespace sb::di::details
4192 result += arg;
4293 }
4394
44- INLINE void Formatter::append (int arg, std::string_view fmt) { return appendNum (arg, fmt, " %d" ); }
45- INLINE void Formatter::append (long arg, std::string_view fmt) { return appendNum (arg, fmt, " %ld" ); }
46- INLINE void Formatter::append (long long arg, std::string_view fmt) { return appendNum (arg, fmt, " %lld" ); }
47- INLINE void Formatter::append (unsigned arg, std::string_view fmt) { return appendNum (arg, fmt, " %u" ); }
48- INLINE void Formatter::append (unsigned long arg, std::string_view fmt) { return appendNum (arg, fmt, " %lu" ); }
49- INLINE void Formatter::append (unsigned long long arg, std::string_view fmt) { return appendNum (arg, fmt, " %llu" ); }
50- INLINE void Formatter::append (float arg, std::string_view fmt) { return appendNum (arg, fmt, " %f" ); }
51- INLINE void Formatter::append (double arg, std::string_view fmt) { return appendNum (arg, fmt, " %f" ); }
52- INLINE void Formatter::append (long double arg, std::string_view fmt) { return appendNum (arg, fmt, " %Lf" ); }
53-
54- INLINE std::string Formatter::makeArgFmt (std::string_view coreFmt, std::string_view baseFmt)
95+ INLINE void Formatter::append (int arg, std::string_view fmt)
5596 {
56- std::string fmt = " %" ;
57- fmt += coreFmt;
58- // base fmt contains % at the beginning
59- fmt += baseFmt.substr (1 );
60- return fmt;
97+ return FormatterInternal::appendNum (result, arg, fmt, " %d" );
6198 }
62-
63- INLINE int Formatter::assertFormatRes (int result, const char *fmt)
99+ INLINE void Formatter::append (long arg, std::string_view fmt)
64100 {
65- if (result < 0 )
66- {
67- throw std::runtime_error (std::string{" Format string error: " } + fmt);
68- }
69- return result;
101+ return FormatterInternal::appendNum (result, arg, fmt, " %ld" );
102+ }
103+ INLINE void Formatter::append (long long arg, std::string_view fmt)
104+ {
105+ return FormatterInternal::appendNum (result, arg, fmt, " %lld" );
106+ }
107+ INLINE void Formatter::append (unsigned arg, std::string_view fmt)
108+ {
109+ return FormatterInternal::appendNum (result, arg, fmt, " %u" );
110+ }
111+ INLINE void Formatter::append (unsigned long arg, std::string_view fmt)
112+ {
113+ return FormatterInternal::appendNum (result, arg, fmt, " %lu" );
114+ }
115+ INLINE void Formatter::append (unsigned long long arg, std::string_view fmt)
116+ {
117+ return FormatterInternal::appendNum (result, arg, fmt, " %llu" );
118+ }
119+ INLINE void Formatter::append (float arg, std::string_view fmt)
120+ {
121+ return FormatterInternal::appendNum (result, arg, fmt, " %f" );
122+ }
123+ INLINE void Formatter::append (double arg, std::string_view fmt)
124+ {
125+ return FormatterInternal::appendNum (result, arg, fmt, " %f" );
126+ }
127+ INLINE void Formatter::append (long double arg, std::string_view fmt)
128+ {
129+ return FormatterInternal::appendNum (result, arg, fmt, " %Lf" );
70130 }
71131} // namespace sb::di::details
0 commit comments