Skip to content

Commit 8b4009d

Browse files
#71 Fixed 0 padding bug and added fast paths for 2 and 3 digit numbers
1 parent 5dbdcba commit 8b4009d

File tree

3 files changed

+58
-33
lines changed

3 files changed

+58
-33
lines changed

lwlog/include/details/os/datetime_utility.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ namespace lwlog::details::os::datetime
3737
}
3838

3939
return -bias / 60;
40-
41-
return -tz_info.Bias / 60;
4240
#else
4341
const std::time_t now{ std::time(nullptr) };
4442

@@ -70,7 +68,9 @@ namespace lwlog::details::os::datetime
7068
struct timestamp_builder
7169
{
7270
public:
71+
template<std::uint8_t Width>
7372
timestamp_builder& append(std::size_t value);
73+
7474
timestamp_builder& append_ampm(std::size_t hour);
7575
timestamp_builder& separate(char separator);
7676

lwlog/include/details/os/datetime_utility_impl.h

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma once
1+
#pragma once
22

33
#include "details/memory_buffer.h"
44
#include "datetime_utility.h"
@@ -19,23 +19,48 @@ namespace lwlog::details::os::datetime
1919
}
2020

2121
template<std::size_t Size>
22+
template<std::uint8_t Width>
2223
timestamp_builder<Size>& timestamp_builder<Size>::append(std::size_t value)
2324
{
24-
if (value <= 9)
25+
std::size_t remaining{ value };
26+
27+
if constexpr (Width == 2)
2528
{
26-
m_buffer[m_pos++] = '0';
29+
m_buffer[m_pos + 1] = char('0' + (remaining % 10)); remaining /= 10;
30+
m_buffer[m_pos + 0] = char('0' + (remaining % 10));
31+
32+
m_pos += 2;
2733
}
34+
else if constexpr (Width == 3)
35+
{
36+
m_buffer[m_pos + 2] = char('0' + (remaining % 10)); remaining /= 10;
37+
m_buffer[m_pos + 1] = char('0' + (remaining % 10)); remaining /= 10;
38+
m_buffer[m_pos + 0] = char('0' + (remaining % 10));
2839

29-
const auto [ptr, ec]{ std::to_chars(m_buffer + m_pos, m_buffer + Size, value) };
30-
m_pos = ptr - m_buffer;
40+
m_pos += 3;
41+
}
42+
else
43+
{
44+
std::size_t write_pos{ m_pos + Width };
45+
46+
for (std::uint8_t n = Width; n--;)
47+
{
48+
m_buffer[--write_pos] = char('0' + (remaining % 10));
49+
remaining /= 10;
50+
}
51+
52+
m_pos += Width;
53+
}
3154

3255
return *this;
3356
}
3457

3558
template<std::size_t Size>
3659
timestamp_builder<Size>& timestamp_builder<Size>::append_ampm(std::size_t hour)
3760
{
38-
std::memcpy(m_buffer + m_pos, hour >= 12 ? "pm" : "am", 2);
61+
m_buffer[m_pos] = (hour >= 12) ? 'p' : 'a';
62+
m_buffer[m_pos + 1] = 'm';
63+
3964
m_pos += 2;
4065

4166
return *this;

lwlog/include/details/pattern/formatters.h

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,11 @@ namespace lwlog::details
156156

157157
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::date,
158158
os::datetime::timestamp_builder<10>()
159-
.append(time_point.year)
159+
.append<2>(time_point.year)
160160
.separate('-')
161-
.append(time_point.month)
161+
.append<2>(time_point.month)
162162
.separate('-')
163-
.append(time_point.day).data()
163+
.append<2>(time_point.day).data()
164164
);
165165
}
166166
};
@@ -175,11 +175,11 @@ namespace lwlog::details
175175

176176
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::date_short,
177177
os::datetime::timestamp_builder<8>()
178-
.append(time_point.month)
178+
.append<2>(time_point.month)
179179
.separate('/')
180-
.append(time_point.day)
180+
.append<2>(time_point.day)
181181
.separate('/')
182-
.append(time_point.year % 100).data()
182+
.append<2>(time_point.year % 100).data()
183183
);
184184
}
185185
};
@@ -194,7 +194,7 @@ namespace lwlog::details
194194

195195
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::year,
196196
os::datetime::timestamp_builder<4>()
197-
.append(time_point.year)
197+
.append<2>(time_point.year)
198198
.data()
199199
);
200200
}
@@ -210,7 +210,7 @@ namespace lwlog::details
210210

211211
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::year_short,
212212
os::datetime::timestamp_builder<2>()
213-
.append(time_point.year % 100)
213+
.append<2>(time_point.year % 100)
214214
.data()
215215
);
216216
}
@@ -226,7 +226,7 @@ namespace lwlog::details
226226

227227
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::month,
228228
os::datetime::timestamp_builder<2>()
229-
.append(time_point.month)
229+
.append<2>(time_point.month)
230230
.data()
231231
);
232232
}
@@ -274,7 +274,7 @@ namespace lwlog::details
274274

275275
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::day,
276276
os::datetime::timestamp_builder<2>()
277-
.append(time_point.day)
277+
.append<2>(time_point.day)
278278
.data()
279279
);
280280
}
@@ -322,11 +322,11 @@ namespace lwlog::details
322322

323323
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::time,
324324
os::datetime::timestamp_builder<10>()
325-
.append(time_point.hour)
325+
.append<2>(time_point.hour)
326326
.separate(':')
327-
.append(time_point.minute)
327+
.append<2>(time_point.minute)
328328
.separate(':')
329-
.append(time_point.second)
329+
.append<2>(time_point.second)
330330
.data()
331331
);
332332
}
@@ -342,9 +342,9 @@ namespace lwlog::details
342342

343343
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::hour_clock_24,
344344
os::datetime::timestamp_builder<5>()
345-
.append(time_point.hour)
345+
.append<2>(time_point.hour)
346346
.separate(':')
347-
.append(time_point.minute)
347+
.append<2>(time_point.minute)
348348
.data()
349349
);
350350
}
@@ -360,11 +360,11 @@ namespace lwlog::details
360360

361361
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::hour_clock_12,
362362
os::datetime::timestamp_builder<10>()
363-
.append(time_point.hour)
363+
.append<2>(time_point.hour)
364364
.separate(':')
365-
.append(time_point.minute)
365+
.append<2>(time_point.minute)
366366
.separate(':')
367-
.append(time_point.second)
367+
.append<2>(time_point.second)
368368
.append_ampm(time_point.hour)
369369
.data()
370370
);
@@ -397,7 +397,7 @@ namespace lwlog::details
397397

398398
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::hour_24,
399399
os::datetime::timestamp_builder<2>()
400-
.append(time_point.hour)
400+
.append<2>(time_point.hour)
401401
.data()
402402
);
403403
}
@@ -413,7 +413,7 @@ namespace lwlog::details
413413

414414
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::hour_12,
415415
os::datetime::timestamp_builder<2>()
416-
.append(os::datetime::to_12h(time_point.hour))
416+
.append<2>(os::datetime::to_12h(time_point.hour))
417417
.data()
418418
);
419419
}
@@ -429,7 +429,7 @@ namespace lwlog::details
429429

430430
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::minute,
431431
os::datetime::timestamp_builder<2>()
432-
.append(time_point.minute)
432+
.append<2>(time_point.minute)
433433
.data()
434434
);
435435
}
@@ -445,7 +445,7 @@ namespace lwlog::details
445445

446446
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::second,
447447
os::datetime::timestamp_builder<2>()
448-
.append(time_point.second)
448+
.append<2>(time_point.second)
449449
.data()
450450
);
451451
}
@@ -461,7 +461,7 @@ namespace lwlog::details
461461

462462
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::millisecond,
463463
os::datetime::timestamp_builder<3>()
464-
.append(time_point.millisecond)
464+
.append<3>(time_point.millisecond)
465465
.data()
466466
);
467467
}
@@ -477,7 +477,7 @@ namespace lwlog::details
477477

478478
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::microsecond,
479479
os::datetime::timestamp_builder<6>()
480-
.append(time_point.microsecond)
480+
.append<6>(time_point.microsecond)
481481
.data()
482482
);
483483
}
@@ -493,7 +493,7 @@ namespace lwlog::details
493493

494494
formatter<BufferLimits>::format_attribute(pattern_buffer, conv_buffer, flag::nanosecond,
495495
os::datetime::timestamp_builder<9>()
496-
.append(time_point.nanosecond)
496+
.append<9>(time_point.nanosecond)
497497
.data()
498498
);
499499
}

0 commit comments

Comments
 (0)