88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef NOSTD_SOURCE_LOCATION_HPP
 | 
						|
#define NOSTD_SOURCE_LOCATION_HPP
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include <cstdint>
 | 
						|
 | 
						|
namespace zlog {
 | 
						|
    struct source_location {
 | 
						|
    public:
 | 
						|
    #if not defined(__apple_build_version__) and defined(__clang__) and (__clang_major__ >= 9)
 | 
						|
        static constexpr source_location current(const char* fileName = __builtin_FILE(),
 | 
						|
            const char* functionName = __builtin_FUNCTION(),
 | 
						|
            const uint_least32_t lineNumber = __builtin_LINE(),
 | 
						|
            const uint_least32_t columnOffset = __builtin_COLUMN()) noexcept
 | 
						|
    #elif defined(__GNUC__) and (__GNUC__ > 4 or (__GNUC__ == 4 and __GNUC_MINOR__ >= 8))
 | 
						|
        static constexpr source_location current(const char* fileName = __builtin_FILE(),
 | 
						|
            const char* functionName = __builtin_FUNCTION(),
 | 
						|
            const uint_least32_t lineNumber = __builtin_LINE(),
 | 
						|
            const uint_least32_t columnOffset = 0) noexcept
 | 
						|
    #else
 | 
						|
        static constexpr source_location current(const char* fileName = "unsupported",
 | 
						|
            const char* functionName = "unsupported",
 | 
						|
            const uint_least32_t lineNumber = 0,
 | 
						|
            const uint_least32_t columnOffset = 0) noexcept
 | 
						|
    #endif
 | 
						|
        {
 | 
						|
            return source_location(fileName, functionName, lineNumber, columnOffset);
 | 
						|
        }
 | 
						|
 | 
						|
        source_location(const source_location&) = default;
 | 
						|
        source_location(source_location&&) = default;
 | 
						|
 | 
						|
        constexpr const char* file_name() const noexcept
 | 
						|
        {
 | 
						|
            return fileName;
 | 
						|
        }
 | 
						|
 | 
						|
        constexpr const char* function_name() const noexcept
 | 
						|
        {
 | 
						|
            return functionName;
 | 
						|
        }
 | 
						|
 | 
						|
        constexpr uint_least32_t line() const noexcept
 | 
						|
        {
 | 
						|
            return lineNumber;
 | 
						|
        }
 | 
						|
 | 
						|
        constexpr std::uint_least32_t column() const noexcept
 | 
						|
        {
 | 
						|
            return columnOffset;
 | 
						|
        }
 | 
						|
 | 
						|
    private:
 | 
						|
        constexpr source_location(const char* fileName, const char* functionName, const uint_least32_t lineNumber,
 | 
						|
            const uint_least32_t columnOffset) noexcept
 | 
						|
            : fileName(fileName)
 | 
						|
            , functionName(functionName)
 | 
						|
            , lineNumber(lineNumber)
 | 
						|
            , columnOffset(columnOffset)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        const char* fileName;
 | 
						|
        const char* functionName;
 | 
						|
        const std::uint_least32_t lineNumber;
 | 
						|
        const std::uint_least32_t columnOffset;
 | 
						|
    };
 | 
						|
 | 
						|
    [[nodiscard]] constexpr auto get_log_source_location(
 | 
						|
        const source_location& location) {
 | 
						|
        return spdlog::source_loc{location.file_name(),
 | 
						|
            static_cast<std::int32_t>(location.line()),
 | 
						|
            location.function_name()};
 | 
						|
    }
 | 
						|
 | 
						|
    struct format_with_location {
 | 
						|
        std::string_view value;
 | 
						|
        spdlog::source_loc loc;
 | 
						|
 | 
						|
        template <typename String>
 | 
						|
        format_with_location(const String& s, const source_location& location =
 | 
						|
            source_location::current())
 | 
						|
            : value{ s }, loc{ get_log_source_location(location) } {}
 | 
						|
    };
 | 
						|
} // namespace nostd
 | 
						|
 | 
						|
#endif |