6#ifndef SPDLOG_HEADER_ONLY
80 dest_.resize(
static_cast<size_t>(new_size));
102 template <
typename T>
109 template <
typename ScopedPadder>
126 template <
typename ScopedPadder>
138 ScopedPadder
p(level_name.size(),
padinfo_, dest);
144 template <
typename ScopedPadder>
156 ScopedPadder
p(level_name.size(),
padinfo_, dest);
165 static const char* ampm(
const tm& t)
167 return t.tm_hour >= 12 ?
"PM" :
"AM";
170 static int to12h(
const tm& t)
172 return t.tm_hour > 12 ? t.tm_hour - 12 : t.tm_hour;
176 static std::array<const char*, 7> days{{
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat"}};
178 template <
typename ScopedPadder>
189 string_view_t field_value{days[
static_cast<size_t>(tm_time.tm_wday)]};
190 ScopedPadder
p(field_value.size(),
padinfo_, dest);
196 static std::array<const char*, 7> full_days{{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"}};
198 template <
typename ScopedPadder>
209 string_view_t field_value{full_days[
static_cast<size_t>(tm_time.tm_wday)]};
210 ScopedPadder
p(field_value.size(),
padinfo_, dest);
216 static const std::array<const char*, 12> months{{
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sept",
"Oct",
"Nov",
"Dec"}};
218 template <
typename ScopedPadder>
229 string_view_t field_value{months[
static_cast<size_t>(tm_time.tm_mon)]};
230 ScopedPadder
p(field_value.size(),
padinfo_, dest);
236 static const std::array<const char*, 12> full_months{
237 {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"}};
239 template <
typename ScopedPadder>
250 string_view_t field_value{full_months[
static_cast<size_t>(tm_time.tm_mon)]};
251 ScopedPadder
p(field_value.size(),
padinfo_, dest);
257 template <
typename ScopedPadder>
268 const size_t field_size = 24;
269 ScopedPadder
p(field_size,
padinfo_, dest);
290 template <
typename ScopedPadder>
301 const size_t field_size = 2;
302 ScopedPadder
p(field_size,
padinfo_, dest);
308 template <
typename ScopedPadder>
319 const size_t field_size = 10;
320 ScopedPadder
p(field_size,
padinfo_, dest);
331 template <
typename ScopedPadder>
342 const size_t field_size = 4;
343 ScopedPadder
p(field_size,
padinfo_, dest);
349 template <
typename ScopedPadder>
360 const size_t field_size = 2;
361 ScopedPadder
p(field_size,
padinfo_, dest);
367 template <
typename ScopedPadder>
378 const size_t field_size = 2;
379 ScopedPadder
p(field_size,
padinfo_, dest);
385 template <
typename ScopedPadder>
396 const size_t field_size = 2;
397 ScopedPadder
p(field_size,
padinfo_, dest);
403 template <
typename ScopedPadder>
414 const size_t field_size = 2;
415 ScopedPadder
p(field_size,
padinfo_, dest);
421 template <
typename ScopedPadder>
432 const size_t field_size = 2;
433 ScopedPadder
p(field_size,
padinfo_, dest);
439 template <
typename ScopedPadder>
450 const size_t field_size = 2;
451 ScopedPadder
p(field_size,
padinfo_, dest);
457 template <
typename ScopedPadder>
468 auto millis = fmt_helper::time_fraction<std::chrono::milliseconds>(msg.
time);
469 const size_t field_size = 3;
470 ScopedPadder
p(field_size,
padinfo_, dest);
476 template <
typename ScopedPadder>
487 auto micros = fmt_helper::time_fraction<std::chrono::microseconds>(msg.
time);
489 const size_t field_size = 6;
490 ScopedPadder
p(field_size,
padinfo_, dest);
496 template <
typename ScopedPadder>
507 auto ns = fmt_helper::time_fraction<std::chrono::nanoseconds>(msg.
time);
508 const size_t field_size = 9;
509 ScopedPadder
p(field_size,
padinfo_, dest);
515 template <
typename ScopedPadder>
526 const size_t field_size = 10;
527 ScopedPadder
p(field_size,
padinfo_, dest);
528 auto duration = msg.
time.time_since_epoch();
529 auto seconds = std::chrono::duration_cast<std::chrono::seconds>(duration).count();
535 template <
typename ScopedPadder>
546 const size_t field_size = 2;
547 ScopedPadder
p(field_size,
padinfo_, dest);
553 template <
typename ScopedPadder>
564 const size_t field_size = 11;
565 ScopedPadder
p(field_size,
padinfo_, dest);
578 template <
typename ScopedPadder>
589 const size_t field_size = 5;
590 ScopedPadder
p(field_size,
padinfo_, dest);
599 template <
typename ScopedPadder>
610 const size_t field_size = 8;
611 ScopedPadder
p(field_size,
padinfo_, dest);
622 template <
typename ScopedPadder>
637 const size_t field_size = 6;
638 ScopedPadder
p(field_size,
padinfo_, dest);
644 total_minutes = -total_minutes;
674 template <
typename ScopedPadder>
685 const auto field_size = ScopedPadder::count_digits(msg.
thread_id);
686 ScopedPadder
p(field_size,
padinfo_, dest);
692 template <
typename ScopedPadder>
704 auto field_size = ScopedPadder::count_digits(pid);
705 ScopedPadder
p(field_size,
padinfo_, dest);
710 template <
typename ScopedPadder>
792 template <
typename ScopedPadder>
820 ScopedPadder
p(text_size,
padinfo_, dest);
828 template <
typename ScopedPadder>
845 ScopedPadder
p(text_size,
padinfo_, dest);
850 template <
typename ScopedPadder>
861#pragma warning(disable : 4127)
867 if (
sizeof(os::folder_seps) == 2)
869 const char* rv = std::strrchr(filename, os::folder_seps[0]);
870 return rv !=
nullptr ? rv + 1 : filename;
874 const std::reverse_iterator<const char*> begin(filename + std::strlen(filename));
875 const std::reverse_iterator<const char*> end(filename);
877 const auto it = std::find_first_of(begin, end, std::begin(os::folder_seps), std::end(os::folder_seps) - 1);
878 return it != end ? it.base() : filename;
893 size_t text_size =
padinfo_.
enabled() ? std::char_traits<char>::length(filename) : 0;
894 ScopedPadder
p(text_size,
padinfo_, dest);
899 template <
typename ScopedPadder>
916 auto field_size = ScopedPadder::count_digits(msg.
source.
line);
917 ScopedPadder
p(field_size,
padinfo_, dest);
923 template <
typename ScopedPadder>
940 ScopedPadder
p(text_size,
padinfo_, dest);
946 template <
typename ScopedPadder,
typename Units>
960 auto delta_units = std::chrono::duration_cast<DurationUnits>(delta);
962 auto delta_count =
static_cast<size_t>(delta_units.count());
963 auto n_digits =
static_cast<size_t>(ScopedPadder::count_digits(delta_count));
964 ScopedPadder
p(n_digits,
padinfo_, dest);
984 using std::chrono::duration_cast;
985 using std::chrono::milliseconds;
986 using std::chrono::seconds;
989 auto duration = msg.
time.time_since_epoch();
990 auto secs = duration_cast<seconds>(duration);
1018 auto millis = fmt_helper::time_fraction<milliseconds>(msg.
time);
1020 dest.push_back(
']');
1021 dest.push_back(
' ');
1026 dest.push_back(
'[');
1028 dest.push_back(
']');
1029 dest.push_back(
' ');
1032 dest.push_back(
'[');
1038 dest.push_back(
']');
1039 dest.push_back(
' ');
1044 dest.push_back(
'[');
1047 dest.push_back(
':');
1049 dest.push_back(
']');
1050 dest.push_back(
' ');
1065 : pattern_(
std::move(pattern)), eol_(
std::move(eol)), pattern_time_type_(time_type), need_localtime_(false), last_log_secs_(0), custom_handlers_(
std::move(custom_user_flags))
1073 : pattern_(
"%+"), eol_(
std::move(eol)), pattern_time_type_(time_type), need_localtime_(true), last_log_secs_(0)
1084 cloned_custom_formatters[it.first] = it.second->clone();
1088#if defined(__GNUC__) && __GNUC__ < 5
1089 return std::move(cloned);
1099 const auto secs = std::chrono::duration_cast<std::chrono::seconds>(msg.
time.time_since_epoch());
1136 template <
typename Padder>
1143 auto custom_handler = it->second->clone();
1144 custom_handler->set_padding_info(padding);
1153 formatters_.push_back(details::make_unique<details::full_formatter>(padding));
1296 formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
1300 formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
1324 formatters_.push_back(details::make_unique<details::ch_formatter>(
'%'));
1344 auto unknown_flag = details::make_unique<details::aggregate_formatter>();
1348 unknown_flag->add_ch(
'%');
1349 unknown_flag->add_ch(flag);
1359 unknown_flag->add_ch(flag);
1374 const size_t max_width = 64;
1377 return padding_info{};
1380 padding_info::pad_side side;
1384 side = padding_info::pad_side::right;
1388 side = padding_info::pad_side::center;
1396 if (it == end || !std::isdigit(
static_cast<unsigned char>(*it)))
1398 return padding_info{};
1401 auto width =
static_cast<size_t>(*it) -
'0';
1402 for (++it; it != end && std::isdigit(
static_cast<unsigned char>(*it)); ++it)
1404 auto digit =
static_cast<size_t>(*it) -
'0';
1405 width = width * 10 + digit;
1410 if (it != end && *it ==
'!')
1424 auto end = pattern.end();
1425 std::unique_ptr<details::aggregate_formatter> user_chars;
1427 for (
auto it = pattern.begin(); it != end; ++it)
1440 if (padding.enabled())
1442 handle_flag_<details::scoped_padder>(*it, padding);
1446 handle_flag_<details::null_scoped_padder>(*it, padding);
1458 user_chars = details::make_unique<details::aggregate_formatter>();
1460 user_chars->add_ch(*it);
Definition pattern_formatter-inl.h:40
scoped_padder(size_t wrapped_size, const padding_info &padinfo, memory_buf_t &dest)
Definition pattern_formatter-inl.h:42
static unsigned int count_digits(T n)
Definition pattern_formatter-inl.h:66
string_view_t spaces_
Definition pattern_formatter-inl.h:93
void pad_it(long count)
Definition pattern_formatter-inl.h:85
~scoped_padder()
Definition pattern_formatter-inl.h:71
const padding_info & padinfo_
Definition pattern_formatter-inl.h:90
memory_buf_t & dest_
Definition pattern_formatter-inl.h:91
long remaining_pad_
Definition pattern_formatter-inl.h:92
#define SPDLOG_INLINE
Definition common.h:47
constexpr auto count() -> size_t
Definition core.h:1538
void pad6(T n, memory_buf_t &dest)
Definition fmt_helper.h:141
unsigned int count_digits(T n)
Definition fmt_helper.h:81
void pad3(T n, memory_buf_t &dest)
Definition fmt_helper.h:124
void append_string_view(spdlog::string_view_t view, memory_buf_t &dest)
Definition fmt_helper.h:24
void pad9(T n, memory_buf_t &dest)
Definition fmt_helper.h:147
void pad2(int n, memory_buf_t &dest)
Definition fmt_helper.h:99
void append_int(T n, memory_buf_t &dest)
Definition fmt_helper.h:50
SPDLOG_INLINE int utc_minutes_offset(const std::tm &tm)
Definition os-inl.h:268
SPDLOG_INLINE std::tm localtime() SPDLOG_NOEXCEPT
Definition os-inl.h:102
SPDLOG_INLINE int pid() SPDLOG_NOEXCEPT
Definition os-inl.h:405
SPDLOG_INLINE std::tm gmtime() SPDLOG_NOEXCEPT
Definition os-inl.h:121
std::unique_ptr< T > make_unique(Args &&... args)
Definition common.h:392
SPDLOG_INLINE const string_view_t & to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT
Definition common-inl.h:25
SPDLOG_INLINE const char * to_short_c_str(spdlog::level::level_enum l) SPDLOG_NOEXCEPT
Definition common-inl.h:30
std::chrono::system_clock log_clock
Definition common.h:135
fmt::basic_string_view< char > string_view_t
Definition common.h:172
pattern_time_type
Definition common.h:289
fmt::basic_memory_buffer< char, 250 > memory_buf_t
Definition common.h:173
size_t color_range_end
Definition log_msg.h:29
log_clock::time_point time
Definition log_msg.h:24
string_view_t payload
Definition log_msg.h:32
level::level_enum level
Definition log_msg.h:23
source_loc source
Definition log_msg.h:31
size_t color_range_start
Definition log_msg.h:28
string_view_t logger_name
Definition log_msg.h:22
size_t thread_id
Definition log_msg.h:25
Definition pattern_formatter-inl.h:97
null_scoped_padder(size_t, const padding_info &, memory_buf_t &)
Definition pattern_formatter-inl.h:98
static unsigned int count_digits(T)
Definition pattern_formatter-inl.h:103
Definition pattern_formatter.h:26
bool enabled() const
Definition pattern_formatter.h:40
pad_side side_
Definition pattern_formatter.h:45
bool truncate_
Definition pattern_formatter.h:46
size_t width_
Definition pattern_formatter.h:44
int line
Definition common.h:324
const char * funcname
Definition common.h:325
SPDLOG_CONSTEXPR bool empty() const SPDLOG_NOEXCEPT
Definition common.h:319
const char * filename
Definition common.h:323
annotation details
Definition tag_strings.h:125
p
Definition tag_strings.h:29