diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..72f1dbd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,78 @@ + +# ChessPlusPlus +# +# Configuration options: +# -DCMAKE_BUILD_TYPE=Release|Debug +# -DSTATIC_BUILD=1|0 + +cmake_minimum_required (VERSION 2.8) + +project (CHESSPP) + +#Set options +if(WIN32) + set(SFML_ROOT "" CACHE PATH "Path to SFML root directory") + set(BOOST_ROOT "" CACHE PATH "Path to Boost root directory") + set(STATIC_BUILD TRUE CACHE BOOL "Link SFML statically") #option(STATIC_BUILD "Link statically" FALSE) +endif() + +#Add json-parser +if(NOT JSONLIB) + set(JSONLIB ${CHESSPP_SOURCE_DIR}/lib/json-parser) +endif() +include_directories (${JSONLIB}) + +#Get all source files +file(GLOB_RECURSE CHESSPP_SOURCES "src/*.cpp") +file(GLOB_RECURSE CHESSPP_HEADERS "src/*.hpp") +list(APPEND CHESSPP_SOURCES "lib/json-parser/json.c") + +set (CHESSPP_INCLUDE_DIRS "") +foreach (_headerFile ${CHESSPP_HEADERS}) + get_filename_component(_dir ${_headerFile} PATH) + list (APPEND CHESSPP_INCLUDE_DIRS ${_dir}) +endforeach() +list(REMOVE_DUPLICATES CHESSPP_INCLUDE_DIRS) +include_directories(${CHESSPP_INCLUDE_DIRS}) + +# Add C++11 definitions -- list(append...) will not always work. +set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + if(APPLE) + # Building with Clang (on OS x at least) requires -stdlib=libc++ flag + set(CMAKE_CXX_FLAGS "-stdlib=libc++ ${CMAKE_CXX_FLAGS}") + endif() +endif() + +# Detect and add SFML +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH}) +if(STATIC_BUILD) + set(SFML_STATIC_LIBRARIES TRUE) +else() + set(SFML_STATIC_LIBRARIES FALSE) +endif() +find_package(SFML 2 REQUIRED graphics window network system audio) +include_directories (${SFML_INCLUDE_DIR}) +link_directories(${SFML_ROOT}/lib) + +#Detect Boost +find_package(Boost 1.54.0 COMPONENTS filesystem system REQUIRED) +include_directories(${BOOST_ROOT}) +set(Boost_LIBRARYDIR ${BOOST_ROOT}/lib) +link_directories(${Boost_LIBRARY_DIR}) + +#Set static runtime for msvc +if(WIN32) + if(MSVC AND STATIC_BUILD) + foreach(flag + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}") + endif() + endforeach() + endif() +endif() + +add_executable (chesspp ${CHESSPP_SOURCES}) +target_link_libraries(chesspp ${SFML_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/Makefile b/Makefile deleted file mode 100644 index f2a6248..0000000 --- a/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -#usage -# make CFG=release - -CPP = g++ -CC = gcc -CPPFLAGS += -std=c++11 -Wall -Wextra -pedantic-errors -INCLUDE = -isystem lib/json-parser/ -Isrc - -LIB = `pkg-config --libs sfml-all` lib/json-parser/json.c -lboost_system -lboost_filesystem - -ifeq ($(CFG),) -CFG=debug -endif - -ifeq ($(CFG),debug) -CPPFLAGS += -ggdb -DDEBUG -else -CPPFLAGS += -O2 -endif -CPPFLAGS += $(INCLUDE) - - -VPATH=src:src/board/:src/config/:src/graphics/:src/log/:src/util/ -TARGET=chesscpp.bin - -SRC = \ - Queen.cpp \ - Board.cpp \ - Pawn.cpp \ - Position.cpp \ - Bishop.cpp \ - King.cpp \ - Rook.cpp \ - Knight.cpp \ - Piece.cpp \ - Main.cpp \ - Graphics.cpp \ - Application.cpp \ - AppStateGame.cpp - -OBJ = $(patsubst %.cpp, objs.$(CFG)/%.o, ${SRC}) -DEP = $(patsubst %.cpp, deps.$(CFG)/%.d, ${SRC}) - -all: ${TARGET} - -${TARGET}: ${OBJ} - mkdir -p $(dir $@) - $(CPP) $^ $(LIBDIR) $(LIB) -o $@ - -test: - echo $(OBJ) - echo $(DEP) - - -deps.$(CFG)/%.d: %.cpp - mkdir -p $(dir $@) - $(CPP) -MM -MP $(CPPFLAGS) $< | perl -pe 's#^(.*\.o)#deps.$(CFG)/$$1 objs.$(CFG)/$$1#' > $@ - -objs.$(CFG)/%.o: %.cpp - mkdir -p $(dir $@) - $(CPP) -c $(CPPFLAGS) $< -o $@ - -.PHONY: clean deps - -clean: - -rm -r objs.debug deps.debug ${TARGET} - -rm -r objs.release deps.release - - - -# Unless "make clean" is called, include the dependency files -# which are auto-generated. Don't fail if they are missing -# (-include), since they will be missing in the first invocation! --include ${DEP} diff --git a/Makefile.Lowest0ne b/Makefile.Lowest0ne deleted file mode 100644 index f1d988e..0000000 --- a/Makefile.Lowest0ne +++ /dev/null @@ -1,76 +0,0 @@ -# A MinGW Makefile -# As it uses -std=c++, g++ must be at least Version 4.7 ( $ g++ --version ) -# I ended up downloading this: http://nuwen.net/mingw.html - -CC = g++ -FLAGS = -Wall -std=c++11 -DSFML_STATIC -OFLAG = $(FLAGS) -c - -INCLUDE = -I../../include -I./lib/json-parser -I./src -LIBDIR = -L../../lib/sfml -SOURCEDIR = ./src/ - -ODIR = ./obj/ -OBJECTS = $(ODIR)Application.o $(ODIR)AppStateGame.o $(ODIR)Graphics.o\ -$(ODIR)Main.o $(ODIR)Pawn.o $(ODIR)Rook.o $(ODIR)Knight.o $(ODIR)Bishop.o\ -$(ODIR)Queen.o $(ODIR)King.o $(ODIR)Logger.o $(ODIR)Piece.o $(ODIR)Position.o\ -$(ODIR)Board.o $(ODIR)json-parser.o - -EXECUTABLE = ChessPlusPlus.exe - - -#LIBS = -lsfml-graphics -lsfml-window -lsfml-system -LIBS = -lsfml-graphics-s -lsfml-window-s -lsfml-system-s - -$(EXECUTABLE): $(OBJECTS) - $(CC) $(FLAGS) $(OBJECTS) -o $(EXECUTABLE) $(LIBDIR) $(LIBS) - -$(ODIR)Application.o: $(SOURCEDIR)Application.cpp $(SOURCEDIR)Application.hpp\ -$(SOURCEDIR)AppState.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)Application.cpp -o $(ODIR)Application.o - -$(ODIR)AppStateGame.o: $(SOURCEDIR)AppStateGame.cpp $(SOURCEDIR)graphics/Graphics.hpp\ -$(SOURCEDIR)SFML.hpp $(SOURCEDIR)TextureManager.hpp $(SOURCEDIR)board/Board.hpp\ -$(SOURCEDIR)config/Configuration.hpp $(SOURCEDIR)AppStateGame.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)AppStateGame.cpp -o $(ODIR)AppStateGame.o - -$(ODIR)Graphics.o: $(SOURCEDIR)graphics/Graphics.cpp $(SOURCEDIR)graphics/Graphics.hpp\ -$(SOURCEDIR)SFML.hpp $(SOURCEDIR)TextureManager.hpp $(SOURCEDIR)board/Piece.hpp\ -$(SOURCEDIR)config/Configuration.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)graphics/Graphics.cpp -o $(ODIR)Graphics.o - -$(ODIR)Main.o: $(SOURCEDIR)Main.cpp $(SOURCEDIR)Application.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)Main.cpp -o $(ODIR)Main.o - -$(ODIR)Pawn.o: $(SOURCEDIR)board/Pawn.cpp $(SOURCEDIR)board/Pawn.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Pawn.cpp -o $(ODIR)Pawn.o - -$(ODIR)Rook.o: $(SOURCEDIR)board/Rook.cpp $(SOURCEDIR)board/Rook.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Rook.cpp -o $(ODIR)Rook.o - -$(ODIR)Knight.o: $(SOURCEDIR)board/Knight.cpp $(SOURCEDIR)board/Knight.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Knight.cpp -o $(ODIR)Knight.o - -$(ODIR)Bishop.o: $(SOURCEDIR)board/Bishop.cpp $(SOURCEDIR)board/Bishop.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Bishop.cpp -o $(ODIR)Bishop.o - -$(ODIR)Queen.o: $(SOURCEDIR)board/Queen.cpp $(SOURCEDIR)board/Queen.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Queen.cpp -o $(ODIR)Queen.o - -$(ODIR)King.o: $(SOURCEDIR)board/King.cpp $(SOURCEDIR)board/King.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/King.cpp -o $(ODIR)King.o - -$(ODIR)Piece.o: $(SOURCEDIR)board/Piece.cpp $(SOURCEDIR)board/Piece.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Piece.cpp -o $(ODIR)Piece.o - -$(ODIR)Position.o: $(SOURCEDIR)board/Position.cpp $(SOURCEDIR)board/Position.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Position.cpp -o $(ODIR)Position.o - -$(ODIR)Board.o: $(SOURCEDIR)board/Board.cpp $(SOURCEDIR)board/Board.hpp - $(CC) $(OFLAG) $(INCLUDE) $(SOURCEDIR)board/Board.cpp -o $(ODIR)Board.o - -$(ODIR)json-parser.o: ./lib/json-parser/json.c ./lib/json-parser/json.h - $(CC) $(OFLAG) ./lib/json-parser/json.c -o $(ODIR)json-parser.o - -clean: - rm $(OBJECTS) $(EXECUTABLE) \ No newline at end of file diff --git a/build_clang_win.bat b/build_clang_win.bat deleted file mode 100644 index 47e0d0c..0000000 --- a/build_clang_win.bat +++ /dev/null @@ -1,2 +0,0 @@ -clang++ -std=c++11 -o chesspp.exe -isystem lib/boost/boost/ -isystem lib/SFML/include/ -isystem lib/json-parser/ -Llib/SFML/lib/ -I src/ lib/json-parser/json.c src/*.cpp src/board/*.cpp src/graphics/*.cpp -lsfml-graphics -lsfml-window -lsfml-audio -lsfml-network -lsfml-system -pause diff --git a/cmake_modules/FindSFML.cmake b/cmake_modules/FindSFML.cmake new file mode 100644 index 0000000..99cbff2 --- /dev/null +++ b/cmake_modules/FindSFML.cmake @@ -0,0 +1,209 @@ +# This script locates the SFML library +# ------------------------------------ +# +# Usage +# ----- +# +# When you try to locate the SFML libraries, you must specify which modules you want to use (system, window, graphics, network, audio, main). +# If none is given, the SFML_LIBRARIES variable will be empty and you'll end up linking to nothing. +# example: +# find_package(SFML COMPONENTS graphics window system) // find the graphics, window and system modules +# +# You can enforce a specific version, either MAJOR.MINOR or only MAJOR. +# If nothing is specified, the version won't be checked (ie. any version will be accepted). +# example: +# find_package(SFML COMPONENTS ...) // no specific version required +# find_package(SFML 2 COMPONENTS ...) // any 2.x version +# find_package(SFML 2.4 COMPONENTS ...) // version 2.4 or greater +# +# By default, the dynamic libraries of SFML will be found. To find the static ones instead, +# you must set the SFML_STATIC_LIBRARIES variable to TRUE before calling find_package(SFML ...). +# In case of static linking, the SFML_STATIC macro will also be defined by this script. +# example: +# set(SFML_STATIC_LIBRARIES TRUE) +# find_package(SFML 2 COMPONENTS network system) +# +# On Mac OS X if SFML_STATIC_LIBRARIES is not set to TRUE then by default CMake will search for frameworks unless +# CMAKE_FIND_FRAMEWORK is set to "NEVER" for example. Please refer to CMake documentation for more details. +# Moreover, keep in mind that SFML frameworks are only available as release libraries unlike dylibs which +# are available for both release and debug modes. +# +# If SFML is not installed in a standard path, you can use the SFML_ROOT CMake (or environment) variable +# to tell CMake where SFML is. +# +# Output +# ------ +# +# This script defines the following variables: +# - For each specified module XXX (system, window, graphics, network, audio, main): +# - SFML_XXX_LIBRARY_DEBUG: the name of the debug library of the xxx module (set to SFML_XXX_LIBRARY_RELEASE is no debug version is found) +# - SFML_XXX_LIBRARY_RELEASE: the name of the release library of the xxx module (set to SFML_XXX_LIBRARY_DEBUG is no release version is found) +# - SFML_XXX_LIBRARY: the name of the library to link to for the xxx module (includes both debug and optimized names if necessary) +# - SFML_XXX_FOUND: true if either the debug or release library of the xxx module is found +# - SFML_LIBRARIES: the list of all libraries corresponding to the required modules +# - SFML_FOUND: true if all the required modules are found +# - SFML_INCLUDE_DIR: the path where SFML headers are located (the directory containing the SFML/Config.hpp file) +# +# example: +# find_package(SFML 2 COMPONENTS system window graphics audio REQUIRED) +# include_directories(${SFML_INCLUDE_DIR}) +# add_executable(myapp ...) +# target_link_libraries(myapp ${SFML_LIBRARIES}) + +# define the SFML_STATIC macro if static build was chosen +if(SFML_STATIC_LIBRARIES) + add_definitions(-DSFML_STATIC) +endif() + +# deduce the libraries suffix from the options +set(FIND_SFML_LIB_SUFFIX "") +if(SFML_STATIC_LIBRARIES) + set(FIND_SFML_LIB_SUFFIX "${FIND_SFML_LIB_SUFFIX}-s") +endif() + +# find the SFML include directory +find_path(SFML_INCLUDE_DIR SFML/Config.hpp + PATH_SUFFIXES include + PATHS + ${SFML_ROOT} + $ENV{SFML_ROOT} + ~/Library/Frameworks + /Library/Frameworks + /usr/local/ + /usr/ + /sw # Fink + /opt/local/ # DarwinPorts + /opt/csw/ # Blastwave + /opt/) + +# check the version number +set(SFML_VERSION_OK TRUE) +if(SFML_FIND_VERSION AND SFML_INCLUDE_DIR) + # extract the major and minor version numbers from SFML/Config.hpp + # we have to handle framework a little bit differently : + if("${SFML_INCLUDE_DIR}" MATCHES "SFML.framework") + set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/Headers/Config.hpp") + else() + set(SFML_CONFIG_HPP_INPUT "${SFML_INCLUDE_DIR}/SFML/Config.hpp") + endif() + FILE(READ "${SFML_CONFIG_HPP_INPUT}" SFML_CONFIG_HPP_CONTENTS) + STRING(REGEX MATCH ".*#define SFML_VERSION_MAJOR ([0-9]+).*#define SFML_VERSION_MINOR ([0-9]+).*" SFML_CONFIG_HPP_CONTENTS "${SFML_CONFIG_HPP_CONTENTS}") + STRING(REGEX REPLACE ".*#define SFML_VERSION_MAJOR ([0-9]+).*" "\\1" SFML_VERSION_MAJOR "${SFML_CONFIG_HPP_CONTENTS}") + STRING(REGEX REPLACE ".*#define SFML_VERSION_MINOR ([0-9]+).*" "\\1" SFML_VERSION_MINOR "${SFML_CONFIG_HPP_CONTENTS}") + math(EXPR SFML_REQUESTED_VERSION "${SFML_FIND_VERSION_MAJOR} * 10 + ${SFML_FIND_VERSION_MINOR}") + + # if we could extract them, compare with the requested version number + if (SFML_VERSION_MAJOR) + # transform version numbers to an integer + math(EXPR SFML_VERSION "${SFML_VERSION_MAJOR} * 10 + ${SFML_VERSION_MINOR}") + + # compare them + if(SFML_VERSION LESS SFML_REQUESTED_VERSION) + set(SFML_VERSION_OK FALSE) + endif() + else() + # SFML version is < 2.0 + if (SFML_REQUESTED_VERSION GREATER 19) + set(SFML_VERSION_OK FALSE) + set(SFML_VERSION_MAJOR 1) + set(SFML_VERSION_MINOR x) + endif() + endif() +endif() + +# find the requested modules +set(SFML_FOUND TRUE) # will be set to false if one of the required modules is not found +set(FIND_SFML_LIB_PATHS + ${SFML_ROOT} + $ENV{SFML_ROOT} + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt) +foreach(FIND_SFML_COMPONENT ${SFML_FIND_COMPONENTS}) + string(TOLOWER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_LOWER) + string(TOUPPER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_UPPER) + set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER}${FIND_SFML_LIB_SUFFIX}) + + # no suffix for sfml-main, it is always a static library + if(FIND_SFML_COMPONENT_LOWER STREQUAL "main") + set(FIND_SFML_COMPONENT_NAME sfml-${FIND_SFML_COMPONENT_LOWER}) + endif() + + # debug library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG + NAMES ${FIND_SFML_COMPONENT_NAME}-d + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_LIB_PATHS}) + + # release library + find_library(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE + NAMES ${FIND_SFML_COMPONENT_NAME} + PATH_SUFFIXES lib64 lib + PATHS ${FIND_SFML_LIB_PATHS}) + + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG OR SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + # library found + set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND TRUE) + + # if both are found, set SFML_XXX_LIBRARY to contain both + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY debug ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG} + optimized ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + endif() + + # if only one debug/release variant is found, set the other to be equal to the found one + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE) + # debug and not release + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG}) + endif() + if (SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE AND NOT SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG) + # release and not debug + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY ${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE}) + endif() + else() + # library not found + set(SFML_FOUND FALSE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_FOUND FALSE) + set(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY "") + set(FIND_SFML_MISSING "${FIND_SFML_MISSING} SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY") + endif() + + # mark as advanced + MARK_AS_ADVANCED(SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_RELEASE + SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY_DEBUG) + + # add to the global list of libraries + set(SFML_LIBRARIES ${SFML_LIBRARIES} "${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY}") +endforeach() + +# handle errors +if(NOT SFML_VERSION_OK) + # SFML version not ok + set(FIND_SFML_ERROR "SFML found but version too low (requested: ${SFML_FIND_VERSION}, found: ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR})") + set(SFML_FOUND FALSE) +elseif(NOT SFML_FOUND) + # include directory or library not found + set(FIND_SFML_ERROR "Could NOT find SFML (missing: ${FIND_SFML_MISSING})") +endif() +if (NOT SFML_FOUND) + if(SFML_FIND_REQUIRED) + # fatal error + message(FATAL_ERROR ${FIND_SFML_ERROR}) + elseif(NOT SFML_FIND_QUIETLY) + # error but continue + message("${FIND_SFML_ERROR}") + endif() +endif() + +# handle success +if(SFML_FOUND) + message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR} in ${SFML_INCLUDE_DIR}") +endif() diff --git a/src/Debug.hpp b/src/Debug.hpp index 0094fd6..bd65726 100644 --- a/src/Debug.hpp +++ b/src/Debug.hpp @@ -2,6 +2,7 @@ #define __DebuggingLoggerUtility_HeaderPlusPlus__ #include +#include #include #include #include @@ -9,6 +10,16 @@ #include #include +#if !defined(USE_STD_PUT_TIME) + //GCC 4.8.1 doesn't support std::put_time yet + #if !defined(__GNUC__) || (__GNUC__ > 4 || ((__GNUC__ == 4) && __GNUC_MINOR__ > 8)) + #define USE_STD_PUT_TIME 1 //next version of GCC probably does + #else + #define USE_STD_PUT_TIME 0 //use boost alternative + #include + #endif +#endif + class LogUtil //replaces std::clog, std::cerr, std::cout with file streams { class LogUtil_buffer : public std::streambuf @@ -18,8 +29,8 @@ class LogUtil //replaces std::clog, std::cerr, std::cout with file streams std::vector buffer; public: - explicit LogUtil_buffer(std::ostream &sink, std::size_t buff_sz = 256) - : sink(sink) + explicit LogUtil_buffer(std::ostream &sink_, std::size_t buff_sz = 256) + : sink(sink_) , buffer(buff_sz + 1) { sink.clear(); @@ -50,7 +61,8 @@ class LogUtil //replaces std::clog, std::cerr, std::cout with file streams std::ptrdiff_t n = pptr() - pbase(); pbump(-n); - return (sink << out.str()); + sink << out.str(); + return (!sink.fail() && !sink.bad()); } //Overridden streambuf functions @@ -76,12 +88,15 @@ class LogUtil //replaces std::clog, std::cerr, std::cout with file streams static std::string timestamp() { std::time_t curr_time_raw = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - std::tm *local_time = std::localtime(&curr_time_raw); + std::tm *lt = std::localtime(&curr_time_raw); std::stringstream time; - time << "[" << local_time->tm_hour << ":" << local_time->tm_min << ":" << local_time->tm_sec << "] "; - - return time.str(); +#if USE_STD_PUT_TIME + time << "[" << std::put_time(lt, "%T") << "] "; +#else + time << "[" << boost::posix_time::to_simple_string(boost::posix_time::time_duration(lt->tm_hour, lt->tm_min, lt->tm_sec)) << "] "; +#endif + return time.str(); } };