Fix usage of ranges and to_hex in the same compile unit

When trying to use spdlog/fmt/bin_to_hex.h in the same compile unit as spdlog/fmt/bundled/ranges.h you got a compile error because there was a multiple definitions for iterable classes. This fix renames the begin() and end() getters in dump_info into getBegin()/getEnd() in order to avoid this collision.

Added an example of ranges in example.cpp to show that it actually works (an to_hex example was already there)
This commit is contained in:
Roocks Patrick (MTN PTT / External) 2021-12-01 15:37:48 +01:00
parent cabbe65be4
commit d93cea97ec
2 changed files with 22 additions and 10 deletions

View File

@ -14,6 +14,7 @@ void rotating_example();
void daily_example(); void daily_example();
void async_example(); void async_example();
void binary_example(); void binary_example();
void vector_example();
void stopwatch_example(); void stopwatch_example();
void trace_example(); void trace_example();
void multi_sink_example(); void multi_sink_example();
@ -73,6 +74,7 @@ int main(int, char *[])
daily_example(); daily_example();
async_example(); async_example();
binary_example(); binary_example();
vector_example();
multi_sink_example(); multi_sink_example();
user_defined_example(); user_defined_example();
err_handler_example(); err_handler_example();
@ -188,6 +190,15 @@ void binary_example()
// logger->info("hexdump style, 20 chars per line {:a}", spdlog::to_hex(buf, 20)); // logger->info("hexdump style, 20 chars per line {:a}", spdlog::to_hex(buf, 20));
} }
// Log a vector of numbers
#include "spdlog/fmt/bundled/ranges.h"
void vector_example()
{
std::vector<int> vec = {1, 2, 3};
spdlog::info("Vector example: {}", vec);
}
// Compile time log levels. // Compile time log levels.
// define SPDLOG_ACTIVE_LEVEL to required level (e.g. SPDLOG_LEVEL_TRACE) // define SPDLOG_ACTIVE_LEVEL to required level (e.g. SPDLOG_LEVEL_TRACE)
void trace_example() void trace_example()

View File

@ -39,11 +39,12 @@ public:
, size_per_line_(size_per_line) , size_per_line_(size_per_line)
{} {}
It begin() const // do not use begin() and end() to avoid collision with fmt/ranges
It getBegin() const
{ {
return begin_; return begin_;
} }
It end() const It getEnd() const
{ {
return end_; return end_;
} }
@ -144,14 +145,14 @@ struct formatter<spdlog::details::dump_info<T>, char>
#endif #endif
int size_per_line = static_cast<int>(the_range.size_per_line()); int size_per_line = static_cast<int>(the_range.size_per_line());
auto start_of_line = the_range.begin(); auto start_of_line = the_range.getBegin();
for (auto i = the_range.begin(); i != the_range.end(); i++) for (auto i = the_range.getBegin(); i != the_range.getEnd(); i++)
{ {
auto ch = static_cast<unsigned char>(*i); auto ch = static_cast<unsigned char>(*i);
if (put_newlines && (i == the_range.begin() || i - start_of_line >= size_per_line)) if (put_newlines && (i == the_range.getBegin() || i - start_of_line >= size_per_line))
{ {
if (show_ascii && i != the_range.begin()) if (show_ascii && i != the_range.getBegin())
{ {
*inserter++ = delimiter; *inserter++ = delimiter;
*inserter++ = delimiter; *inserter++ = delimiter;
@ -162,7 +163,7 @@ struct formatter<spdlog::details::dump_info<T>, char>
} }
} }
put_newline(inserter, static_cast<size_t>(i - the_range.begin())); put_newline(inserter, static_cast<size_t>(i - the_range.getBegin()));
// put first byte without delimiter in front of it // put first byte without delimiter in front of it
*inserter++ = hex_chars[(ch >> 4) & 0x0f]; *inserter++ = hex_chars[(ch >> 4) & 0x0f];
@ -181,9 +182,9 @@ struct formatter<spdlog::details::dump_info<T>, char>
} }
if (show_ascii) // add ascii to last line if (show_ascii) // add ascii to last line
{ {
if (the_range.end() - the_range.begin() > size_per_line) if (the_range.getEnd() - the_range.getBegin() > size_per_line)
{ {
auto blank_num = size_per_line - (the_range.end() - start_of_line); auto blank_num = size_per_line - (the_range.getEnd() - start_of_line);
while (blank_num-- > 0) while (blank_num-- > 0)
{ {
*inserter++ = delimiter; *inserter++ = delimiter;
@ -196,7 +197,7 @@ struct formatter<spdlog::details::dump_info<T>, char>
} }
*inserter++ = delimiter; *inserter++ = delimiter;
*inserter++ = delimiter; *inserter++ = delimiter;
for (auto j = start_of_line; j != the_range.end(); j++) for (auto j = start_of_line; j != the_range.getEnd(); j++)
{ {
auto pc = static_cast<unsigned char>(*j); auto pc = static_cast<unsigned char>(*j);
*inserter++ = std::isprint(pc) ? static_cast<char>(*j) : '.'; *inserter++ = std::isprint(pc) ? static_cast<char>(*j) : '.';