Skip to content

Commit 2300e99

Browse files
committed
improve formatter
1 parent 6deff81 commit 2300e99

File tree

3 files changed

+86
-57
lines changed

3 files changed

+86
-57
lines changed

Include/SevenBit/DI/Details/Helpers/Formatter.hpp

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <stdexcept>
44
#include <string>
55
#include <string_view>
6+
#include <utility>
67

78
#include "SevenBit/DI/LibraryConfig.hpp"
89

@@ -56,37 +57,6 @@ namespace sb::di::details
5657
void append(float arg, std::string_view fmt = "");
5758
void append(double arg, std::string_view fmt = "");
5859
void append(long double arg, std::string_view fmt = "");
59-
60-
template <class N> void appendNum(N arg, const std::string_view coreFmt, const char *baseFmt)
61-
{
62-
if (!coreFmt.empty())
63-
{
64-
const auto format = makeArgFmt(coreFmt, baseFmt);
65-
return appendFormatted(arg, format.c_str());
66-
}
67-
return appendFormatted(arg, baseFmt);
68-
}
69-
70-
template <class T> void appendFormatted(T data, const char *fmt)
71-
{
72-
constexpr size_t buffSize = 100;
73-
char buffer[buffSize];
74-
auto size = assertFormatRes(std::snprintf(buffer, buffSize, fmt, data), fmt);
75-
if (size < buffSize)
76-
{
77-
result += std::string_view(buffer, size);
78-
}
79-
else
80-
{
81-
std::vector<char> largeBuff(size + 1);
82-
assertFormatRes(std::snprintf(largeBuff.data(), size + 1, fmt, data), fmt);
83-
result += std::string_view(largeBuff.data(), size);
84-
}
85-
}
86-
87-
static std::string makeArgFmt(std::string_view coreFmt, std::string_view baseFmt);
88-
89-
static int assertFormatRes(int result, const char *fmt);
9060
};
9161
} // namespace sb::di::details
9262

Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,62 @@
11
#pragma once
22

3+
#include <cstdio>
4+
35
#include "SevenBit/DI/LibraryConfig.hpp"
46

57
#include "SevenBit/DI/Details/Helpers/Formatter.hpp"
68

79
namespace 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

SingleHeader/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ add_custom_command(OUTPUT ${_7BIT_DI_SINGLE_OUT}
1111
add_custom_target(GenerateSingleHeader
1212
ALL DEPENDS
1313
${_7BIT_DI_SINGLE_OUT}
14-
${_7BIT_DI_MAIN_HEADER}
1514
)

0 commit comments

Comments
 (0)