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:
		@@ -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()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) : '.';
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user