parent
							
								
									c494db695d
								
							
						
					
					
						commit
						ba63d6b1da
					
				
				 13 changed files with 319 additions and 0 deletions
			
			
		@ -0,0 +1,52 @@ | 
				
			||||
project "bakatools" | 
				
			||||
	kind "StaticLib" | 
				
			||||
    language "C++" | 
				
			||||
    cppdialect "C++17" | 
				
			||||
    systemversion "latest" | 
				
			||||
 | 
				
			||||
    targetdir("%{wks.location}/bin/" .. outputdir .. "/%{prj.name}") | 
				
			||||
    objdir("%{wks.location}/bin-int/" .. outputdir .. "/%{prj.name}") | 
				
			||||
 | 
				
			||||
    includedirs  | 
				
			||||
    { | 
				
			||||
        "%{prj.location}/vendor/spdlog/include", | 
				
			||||
        "%{prj.location}/src/" | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    files  | 
				
			||||
    { | 
				
			||||
        "%{prj.location}/src/bakatools/**.h", | 
				
			||||
        "%{prj.location}/src/bakatools/**.cpp", | 
				
			||||
        "%{prj.location}/src/bakatoolspch.h", | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    filter "system:windows" | 
				
			||||
        defines | 
				
			||||
        { | 
				
			||||
            "BK_PLAFORM_WINDOWS" | 
				
			||||
        } | 
				
			||||
     | 
				
			||||
    filter "system:linux" | 
				
			||||
        defines | 
				
			||||
        { | 
				
			||||
            "BK_PLAFORM_LINUX" | 
				
			||||
        } | 
				
			||||
     | 
				
			||||
    filter "configurations:Debug" | 
				
			||||
        defines  | 
				
			||||
        {  | 
				
			||||
            "BK_DEBUG", | 
				
			||||
            "DEBUG" | 
				
			||||
        } | 
				
			||||
        runtime "Debug" | 
				
			||||
        symbols "on" | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    filter "configurations:Release" | 
				
			||||
        defines  | 
				
			||||
        {  | 
				
			||||
            "BK_RELEASE", | 
				
			||||
            "NDEBUG" | 
				
			||||
        } | 
				
			||||
        runtime "Release" | 
				
			||||
        optimize "on" | 
				
			||||
@ -0,0 +1,5 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include <bakatools/string/string_tools.h> | 
				
			||||
#include <bakatools/looging/log.h>  | 
				
			||||
#include <bakatools/logging/assert.h> | 
				
			||||
@ -0,0 +1,48 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
/*! \file assert.h
 | 
				
			||||
This file contains the assert macros. CORE macros musn't be used by the application. | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
#include "log.h" | 
				
			||||
#include <bakara/tools/string_tools.h> | 
				
			||||
 | 
				
			||||
#define BK_STRINGIFY(x) #x | 
				
			||||
 | 
				
			||||
#ifdef BK_DEBUG | 
				
			||||
    #if defined(BK_PLATFORM_WINDOWS) | 
				
			||||
        #define BK_DEBUGBREAK() __debugbreak() | 
				
			||||
    #elif defined(BK_PLATFORM_LINUX) | 
				
			||||
        #include <signal.h> | 
				
			||||
        #define BK_DEBUGBREAK() raise(SIGTRAP) | 
				
			||||
    #else  | 
				
			||||
        #error "Plaform doesn't support debug yet" | 
				
			||||
    #endif | 
				
			||||
    #define BK_ENABLE_ASSERT | 
				
			||||
#else  | 
				
			||||
    #define BK_DEBUGBREAK() | 
				
			||||
#endif | 
				
			||||
 | 
				
			||||
#ifdef BK_ENABLE_ASSERT | 
				
			||||
    /*! \def BK_CORE_VAMSG_ASSERT(check, msg, ...)
 | 
				
			||||
    Assertes a condition, and throw an error with the formatted message as description | 
				
			||||
    @param check : Condionne to assert | 
				
			||||
    @param msg : format string error message | 
				
			||||
    @param ... : variable arguments to put in the string | 
				
			||||
    */ | 
				
			||||
    #define BK_CORE_VAMSG_ASSERT(check, msg, ...) if(!(check)) { BK_CORE_ERROR(Tools::format("Assertion [%s] failed at %s:%d\n\tError : %s", BK_STRINGIFY(check), __FILE__, __LINE__, msg), __VA_ARGS__); BK_DEBUGBREAK(); } | 
				
			||||
    #define BK_CORE_MSG_ASSERT(check, msg) if(!(check)) { BK_CORE_ERROR("Assertion [{0}] failed at {1}:{2}\n\tError : {3}", BK_STRINGIFY(check), __FILE__, __LINE__, msg); BK_DEBUGBREAK(); } | 
				
			||||
    #define BK_CORE_ASSERT(check) if(!(check)) { BK_CORE_ERROR("Assertion [{0}] failed at {1}:{2}", BK_STRINGIFY(check), __FILE__, __LINE__); BK_DEBUGBREAK(); } | 
				
			||||
 | 
				
			||||
    #define BK_VAMSG_ASSERT(check, msg, ...) if(!(check)) { BK_ERROR(Bk::Tools::format("Assertion [%s] failed at %s:%d\n\tError : %s", BK_STRINGIFY(check), __FILE__, __LINE__, msg), __VA_ARGS__); BK_DEBUGBREAK(); } | 
				
			||||
    #define BK_MSG_ASSERT(check, msg) if(!(check)) { BK_ERROR("Assertion [{0}] failed at {1}:{2}\n\tError : {3}", BK_STRINGIFY(check), __FILE__, __LINE__, msg); BK_DEBUGBREAK(); } | 
				
			||||
    #define BK_ASSERT(check) if(!(check)) { BK_ERROR("Assertion [{0}] failed at {1}:{2}", BK_STRINGIFY(check), __FILE__, __LINE__); BK_DEBUGBREAK(); } | 
				
			||||
#else | 
				
			||||
    #define BK_CORE_VAMSG_ASSERT(check, msg, ...)  | 
				
			||||
    #define BK_CORE_MSG_ASSERT(check, msg) | 
				
			||||
    #define BK_CORE_ASSERT(check) | 
				
			||||
 | 
				
			||||
    #define BK_VAMSG_ASSERT(check, msg, ...)  | 
				
			||||
    #define BK_MSG_ASSERT(check, msg)  | 
				
			||||
    #define BK_ASSERT(check) | 
				
			||||
#endif | 
				
			||||
@ -0,0 +1,28 @@ | 
				
			||||
#include "log.h" | 
				
			||||
 | 
				
			||||
namespace Bk { | 
				
			||||
 | 
				
			||||
	std::shared_ptr<spdlog::logger> Log::p_core_logger; | 
				
			||||
	std::shared_ptr<spdlog::logger> Log::p_app_logger; | 
				
			||||
 | 
				
			||||
	void Log::init() | 
				
			||||
	{ | 
				
			||||
		std::vector<spdlog::sink_ptr> log_sinks; | 
				
			||||
		log_sinks.emplace_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>()); | 
				
			||||
		log_sinks.emplace_back(std::make_shared<spdlog::sinks::basic_file_sink_mt>("bakara.log", true)); | 
				
			||||
 | 
				
			||||
		log_sinks[0]->set_pattern("%^[%T] %n: %v%$"); | 
				
			||||
		log_sinks[1]->set_pattern("[%T] [%l] %n: %v"); | 
				
			||||
 | 
				
			||||
		p_core_logger = std::make_shared<spdlog::logger>("BAKARA", begin(log_sinks), end(log_sinks)); | 
				
			||||
		spdlog::register_logger(p_core_logger); | 
				
			||||
		p_core_logger->set_level(spdlog::level::trace); | 
				
			||||
		p_core_logger->flush_on(spdlog::level::trace); | 
				
			||||
 | 
				
			||||
		p_app_logger = std::make_shared<spdlog::logger>("APP", begin(log_sinks), end(log_sinks)); | 
				
			||||
		spdlog::register_logger(p_app_logger); | 
				
			||||
		p_app_logger->set_level(spdlog::level::trace); | 
				
			||||
		p_app_logger->flush_on(spdlog::level::trace); | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,47 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include <bakatoolspch.h> | 
				
			||||
#include <spdlog/spdlog.h> | 
				
			||||
#include <spdlog/fmt/ostr.h> | 
				
			||||
#include <spdlog/sinks/stdout_color_sinks.h> | 
				
			||||
#include <spdlog/sinks/basic_file_sink.h> | 
				
			||||
 | 
				
			||||
namespace Bk { | 
				
			||||
 | 
				
			||||
	class Log | 
				
			||||
	{ | 
				
			||||
        public: | 
				
			||||
            static void init(); | 
				
			||||
 | 
				
			||||
            static std::shared_ptr<spdlog::logger>& get_core_logger() { return p_core_logger; } | 
				
			||||
            static std::shared_ptr<spdlog::logger>& get_app_logger() { return p_app_logger; } | 
				
			||||
        private: | 
				
			||||
            static std::shared_ptr<spdlog::logger> p_core_logger; | 
				
			||||
            static std::shared_ptr<spdlog::logger> p_app_logger; | 
				
			||||
	}; | 
				
			||||
    #ifdef BK_DEBUG | 
				
			||||
        #define BK_CORE_TRACE(...)    ::Bk::Log::get_core_logger()->trace(__VA_ARGS__) | 
				
			||||
        #define BK_CORE_INFO(...)     ::Bk::Log::get_core_logger()->info(__VA_ARGS__) | 
				
			||||
        #define BK_CORE_WARN(...)     ::Bk::Log::get_core_logger()->warn(__VA_ARGS__) | 
				
			||||
        #define BK_CORE_ERROR(...)    ::Bk::Log::get_core_logger()->error(__VA_ARGS__) | 
				
			||||
        #define BK_CORE_CRITICAL(...) ::Bk::Log::get_core_logger()->critical(__VA_ARGS__) | 
				
			||||
 | 
				
			||||
        #define BK_TRACE(...)         ::Bk::Log::get_app_logger()->trace(__VA_ARGS__) | 
				
			||||
        #define BK_INFO(...)          ::Bk::Log::get_app_logger()->info(__VA_ARGS__) | 
				
			||||
        #define BK_WARN(...)          ::Bk::Log::get_app_logger()->warn(__VA_ARGS__) | 
				
			||||
        #define BK_ERROR(...)         ::Bk::Log::get_app_logger()->error(__VA_ARGS__) | 
				
			||||
        #define BK_CRITICAL(...)      ::Bk::Log::get_app_logger()->critical(__VA_ARGS__) | 
				
			||||
    #else | 
				
			||||
        #define BK_CORE_TRACE(...)     | 
				
			||||
        #define BK_CORE_INFO(...)      | 
				
			||||
        #define BK_CORE_WARN(...)      | 
				
			||||
        #define BK_CORE_ERROR(...)     | 
				
			||||
        #define BK_CORE_CRITICAL(...)  | 
				
			||||
 | 
				
			||||
        #define BK_TRACE(...)          | 
				
			||||
        #define BK_INFO(...)           | 
				
			||||
        #define BK_WARN(...)           | 
				
			||||
        #define BK_ERROR(...)          | 
				
			||||
        #define BK_CRITICAL(...)        | 
				
			||||
    #endif | 
				
			||||
} | 
				
			||||
@ -0,0 +1,63 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
/*! \file format.h
 | 
				
			||||
This file provides functions to do string formatting. | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
#include <bakatoolspch.h> | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    inline void format_impl(std::stringstream& ss, const char* format) { 
 | 
				
			||||
        while (*format) { | 
				
			||||
            if (*format == '%' && *++format != '%') // %% == % (not a format directive)
 | 
				
			||||
                throw std::invalid_argument("not enough arguments !\n"); | 
				
			||||
            ss << *format++; | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    template <typename Arg, typename... Args> | 
				
			||||
    void format_impl(std::stringstream& ss, const char* format, Arg arg, Args... args) { | 
				
			||||
        while (*format) { | 
				
			||||
            if (*format == '%' && *++format != '%') { | 
				
			||||
                auto current_format_qualifier = *format; | 
				
			||||
                switch(current_format_qualifier) { | 
				
			||||
                    case 'd' : 
 | 
				
			||||
                        if (!std::is_integral<Arg>()) throw std::invalid_argument("%d introduces integral argument"); | 
				
			||||
                        break; | 
				
			||||
                    case 'f' : 
 | 
				
			||||
                        if (!std::is_floating_point<Arg>()) throw std::invalid_argument("%f introduces floating point argument"); | 
				
			||||
                        break; | 
				
			||||
                    case 'b' : | 
				
			||||
                        if(arg) ss << "true"; | 
				
			||||
                        else ss << "false"; | 
				
			||||
                        return format_impl(ss, ++format, args...); | 
				
			||||
                    case 's' : | 
				
			||||
                        break; | 
				
			||||
                    // etc.
 | 
				
			||||
                    default: 
 | 
				
			||||
                        throw std::invalid_argument("Not a standard format"); | 
				
			||||
                        break; | 
				
			||||
                } | 
				
			||||
                // it's true you'd have to handle many more format qualifiers, but on a safer basis
 | 
				
			||||
                ss << arg; // arg type is deduced
 | 
				
			||||
                return format_impl(ss, ++format, args...); // one arg less
 | 
				
			||||
            } | 
				
			||||
            ss << *format++; | 
				
			||||
            } // the format string is exhausted and we still have args : throw
 | 
				
			||||
        throw std::invalid_argument("Too many arguments\n"); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /*! \fn std::string Bk::Tools::format(const char* fmt, Args... args)
 | 
				
			||||
    Formats a string, printf like. Accepts integers, floating point numbers, strings, booléen. | 
				
			||||
    @param fmt : string to format | 
				
			||||
    @param args : variable arguments to put in the string | 
				
			||||
    @return String formatted | 
				
			||||
    */ | 
				
			||||
    template <typename... Args> | 
				
			||||
    inline std::string string_format(const char* fmt, Args... args) { | 
				
			||||
        std::stringstream ss; | 
				
			||||
        format_impl(ss, fmt, args...); | 
				
			||||
        return ss.str(); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
@ -0,0 +1,17 @@ | 
				
			||||
#include "string_tools.h" | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    std::unique_ptr<std::vector<std::string>> string_split(std::string& str, std::string delimiter, int cpt) | 
				
			||||
    { | 
				
			||||
        std::string s(str); | 
				
			||||
        std::unique_ptr<std::vector<std::string>> splits(new std::vector<std::string>(0)); | 
				
			||||
        size_t pos = 0; | 
				
			||||
        while (((pos = s.find(delimiter)) != std::string::npos) && cpt-- != 0) 
 | 
				
			||||
        { | 
				
			||||
            splits->push_back(s.substr(0, pos)); | 
				
			||||
            s.erase(0, pos + delimiter.length()); | 
				
			||||
        } | 
				
			||||
        if (s.length()) splits->push_back(s); | 
				
			||||
        return splits; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,10 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "format.h" | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    std::string string_to_lower(std::string& str); | 
				
			||||
    std::string string_to_upper(std::string& str); | 
				
			||||
    std::unique_ptr<std::vector<std::string>> string_split(std::string& str, std::string delimiter, int cpt = -1); | 
				
			||||
    void string_trim(std::string& str, const std::string& whitespace = " \b\0"); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,12 @@ | 
				
			||||
#include "string_tools.h" | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    std::string string_to_lower(std::string& str) | 
				
			||||
    { | 
				
			||||
        for (int i = 0; i < str.length(); i++) | 
				
			||||
        { | 
				
			||||
            str[i] = std::tolower(str[i]); | 
				
			||||
        } | 
				
			||||
        return str; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,12 @@ | 
				
			||||
#include "string_tools.h" | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    std::string string_to_upper(std::string& str) | 
				
			||||
    { | 
				
			||||
        for (int i = 0; i < str.length(); i++) | 
				
			||||
        { | 
				
			||||
            str[i] = std::toupper(str[i]); | 
				
			||||
        } | 
				
			||||
        return str; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,13 @@ | 
				
			||||
#include "string_tools.h" | 
				
			||||
 | 
				
			||||
namespace Bk::Tools { | 
				
			||||
    void string_trim(std::string& str, const std::string& whitespace) | 
				
			||||
    { | 
				
			||||
        const auto strBegin = str.find_first_not_of(whitespace); | 
				
			||||
        const auto strEnd = str.find_last_not_of(whitespace); | 
				
			||||
        if (strBegin != std::string::npos) | 
				
			||||
        { | 
				
			||||
            str.erase(0, strBegin); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,12 @@ | 
				
			||||
#pragme once | 
				
			||||
 | 
				
			||||
#include <cstring> | 
				
			||||
#include <vector> | 
				
			||||
#include <string> | 
				
			||||
#include <cstdint> | 
				
			||||
#include <cctype> | 
				
			||||
#include <exception> | 
				
			||||
#include <sstream> | 
				
			||||
#include <ostream> | 
				
			||||
#include <utility> | 
				
			||||
#include <type_traits> | 
				
			||||
					Loading…
					
					
				
		Reference in New Issue