Commit 36116369 authored by Tomáš Jakubec's avatar Tomáš Jakubec
Browse files

change of the printing system

parent fb9deba6
Pipeline #2590 failed with stage
in 4 seconds
#ifndef CSVLOGGER_H
#define CSVLOGGER_H
#include <string>
#include <fstream>
#include "VariableExport.h"
/**
* @brief The HtmlLogger class
* has opened file to write log
* if it opens existing file overwrites it.
* in destructor it closes the file.
*/
class CSVLogger {
std::string logFileName = "";
std::ofstream* logFile;
int groupIndex = 0;
void writeHeadder() {
(*logFile) << "Group Index;Line;File;Expression;Value\n";
}
public:
CSVLogger(){logFile = nullptr;}
/**
* @brief HtmlLogger
* opens specified file for writing
* @param fileName
*
*/
CSVLogger(const char* fileName)
:CSVLogger(){
logFileName = fileName;
}
~CSVLogger(){
destroy();
}
/**
* @brief Create
* opens specified file and writes headder and script in html
* @param fileName
*/
void create(const char* fileName){
if ( logFile ){
logFile->close();
delete logFile;
}
logFile = new std::ofstream( fileName );
writeHeadder();
}
void destroy(){
if( logFile ){
logFile->close();
delete logFile;
}
}
template<typename VAR_NAME, typename VAR, typename ... REST>
void writeVar(VAR_NAME name, VAR value, REST ... rest){
// create file if not logFile is nullptr
if ( !logFile ) create(logFileName.c_str());
(*logFile) << name << ", " << value;
logFile->flush();
writeVar(rest...);
}
template<typename VAR_NAME, typename VAR>
void writeVar(VAR_NAME name, VAR value){
// create file if not logFile is nullptr
if (!logFile) create(logFileName.c_str());
(*logFile) << name << ", " << value;
logFile->flush();
}
template<typename VAR_NAME, typename VAR, typename ... REST>
void writeVar(int line, std::string& cppFile, VAR_NAME name, VAR value, REST ... rest){
// create file if not logFile is nullptr
if (!logFile) create(logFileName.c_str());
(*logFile) << groupIndex << ';' << line << ";\"" << cppFile << "\";\"" << name << "\";";
VariableExport<>::exportVariable( *logFile, value );
(*logFile) << "\n";
writeVar(line, cppFile, rest...);
}
template<typename VAR_NAME, typename VAR>
void writeVar( int line, std::string& cppFile, VAR_NAME name, VAR value){
// create file if not logFile is nullptr
if (!logFile) create(logFileName.c_str());
(*logFile) << groupIndex << ';' << line << ";\"" << cppFile << "\";\"" << name << "\";";
VariableExport<>::exportVariable(*logFile,value);
(*logFile) << "\n";
groupIndex++;
}
template<typename VAR_NAME, typename VAR, typename ... REST>
void writeVar(int line, const char* cppFile, VAR_NAME name, VAR value, REST ... rest){
std::string file;
int i = 0;
while(cppFile[i] != '\0'){
if (cppFile[i] == '\\'){
file += "\\\\";
} else {
file += cppFile[i];
}
i++;
}
writeVar(line, file, name, value, rest...);
}
template<typename VAR_NAME, typename VAR>
void writeVar(int line, const char* cppFile, VAR_NAME name, VAR value){
std::string file;
int i = 0;
while(cppFile[i] != '\0'){
if (cppFile[i] == '\\'){
file += "\\\\";
} else {
file += cppFile[i];
}
i++;
}
writeVar(line, file, name, value);
}
};
#endif // CSVLOGGER_H
......@@ -3,13 +3,16 @@
#include "VariableExport.h"
#ifdef _WIN32
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#endif
/**
* @brief The ConsoleLogger class
*/
template <VARIABLE_EXPORT_METHOD method = VARIABLE_EXPORT_METHOD::VARIABLE_EXPORT_METHOD_OSTREAM>
class ConsoleLogger {
bool mColoredOutput = true; //!< If true then the output the variable names and their values are highlighted.
bool mOnlyFilename = false; //!< If true then the filename is exported without its path.
......@@ -87,7 +90,7 @@ public:
printHeader(line, funcName, sourceFile, prefix);
std::cerr << "==> ";
insertMessageColor();
VariableExport<>::exportVariable(std::cerr, message);
VariableExport::exportVariable(std::cerr, message);
resetColor();
std::cerr << " <==" << std::endl;
......@@ -117,7 +120,7 @@ private:
resetColor();
std::cerr << " ]] ==> " << std::flush;
insertValueColor();
VariableExport<>::exportVariable(std::cerr, value);
VariableExport::exportVariable(std::cerr, value);
resetColor();
std::cerr << "\n";
......@@ -189,80 +192,39 @@ private:
}
return res;
}
};
template <>
class ConsoleLogger<VARIABLE_EXPORT_METHOD::VARIABLE_EXPORT_METHOD_STDIO> {
public:
template<typename MSGTYPE, typename... MSGTYPES>
static void writeMessage(const char* prefix, int line, const char* sourceFile, const MSGTYPE& message, const MSGTYPES&... rest) {
writeMessage(prefix, line, sourceFile, message);
writeMessage(prefix, line, sourceFile, rest...);
static void writeMessageC(const char* prefix, int line, const char* funcName, const char* sourceFile, const MSGTYPE& message, const MSGTYPES&... rest) {
writeMessageC(prefix, funcName, line, sourceFile, message);
writeMessageC(prefix, funcName, line, sourceFile, rest...);
}
template<typename MSGTYPE>
static void writeMessage(const char* prefix, int line, const char* sourceFile, const MSGTYPE& message) {
printf("%s %s << %i >> ==> ",
prefix,
sourceFile,
line);
static void writeMessageC(const char* prefix, int line, const char* funcName, const char* sourceFile, const MSGTYPE& message) {
printf("%s %s: %i <%s> ==> ", prefix, sourceFile, line, funcName);
VariableExport<VARIABLE_EXPORT_METHOD::VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(message);
VariableExport::exportVariable(message);
printf(" <==\n");
}
template<typename VAR_NAME, typename VAR, typename ... REST>
static void writeVar(VAR_NAME name, VAR value, REST ... rest){
writeVar(name, value);
writeVar(rest...);
}
template<typename VAR_NAME, typename VAR>
static void writeVar(VAR_NAME name, VAR value){
std::cerr << "variable " << name << " has value: " << value;
}
template<typename VAR_NAME, typename VAR, typename ... REST>
static void writeVar(int line, const char* cppFile, const VAR_NAME& name,const VAR& value,const REST& ... rest){
writeVar(line, cppFile, name, value);
writeVar(line, cppFile, rest...);
}
template<typename VAR>
static void writeVar(int line, const char* cppFile, const char* name,const VAR& value){
static void writeVarC(int line, const char* funcName, const char* cppFile, const VAR_NAME& name,const VAR& value,const REST& ... rest){
printf("== %s << %i >> [[ %s ]] ==> ",
cppFile,
line,
name);
VariableExport<VARIABLE_EXPORT_METHOD::VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(value);
printf("\n");
writeVarC(line, funcName, cppFile, name, value);
writeVarC(line, funcName, cppFile, rest...);
}
template<typename VAR>
static void writeVar(int line, const char* cppFile, const char* name,const std::initializer_list<VAR>& value){
printf("== %s << %i >> [[ %s ]] ==> ",
cppFile,
line,
name);
static void writeVarC(int line, const char* funcName, const char* cppFile, const char* name,const VAR& value){
printf("== %s: %i <%s> [[ %s ]] ==> ", cppFile, line, funcName, name);
VariableExport<VARIABLE_EXPORT_METHOD::VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(value);
VariableExport::exportVariable(value);
printf("\n");
}
......
......@@ -5,7 +5,6 @@
#include "../Macros/MacroForEach.h"
#include <iostream>
#include "HTMLLogger.h"
#include "CSVLogger.h"
#include "JSONLogger.h"
#include "ConsoleLogger.h"
#include "../Singleton/Singleton.h"
......@@ -18,14 +17,12 @@ namespace dbg {
struct DBGStatics {
HtmlLogger HDBGLog = HtmlLogger("DBG.html");
CSVLogger CSVDBGLog = CSVLogger("DBG.csv");
JSONLogger JSONDBGLog = JSONLogger("DBG.json");
};
ConsoleLogger<>& getDebugConsoleLogger() {
static ConsoleLogger<> consoleLogger = ConsoleLogger<>();
inline ConsoleLogger& getDebugConsoleLogger() {
static ConsoleLogger consoleLogger = ConsoleLogger();
return consoleLogger;
}
}
......@@ -36,7 +33,7 @@ namespace dbg {
#define DBGVAR(...) dbg::getDebugConsoleLogger().writeVariable(__LINE__, __func__, __FILE__, FOR_EACH(STRVAR, __VA_ARGS__))
#define DBGVARCOND(condition, ...) if(condition) DBGVAR(__VA_ARGS__)
#define DBGVAR_STDIO(...) ConsoleLogger<VARIABLE_EXPORT_METHOD_STDIO>::writeVar(__LINE__, __FILE__, FOR_EACH(STRVAR, __VA_ARGS__))
#define DBGVAR_STDIO(...) ConsoleLogger::writeVarC(__LINE__, __FILE__, __func__, FOR_EACH(STRVAR, __VA_ARGS__))
#define DBGVARCOND_STDIO(condition, ...) if(condition) DBGVAR_STDIO(__VA_ARGS__)
#define DBGMSG(...) dbg::getDebugConsoleLogger().writeMessage("++", __LINE__, __func__, __FILE__, __VA_ARGS__)
......@@ -62,7 +59,7 @@ exit(1);}
#define DBGCHECK dbg::getDebugConsoleLogger().writeMessage("--", __LINE__, __func__, __FILE__, "check line")
#define DBGCHECK_STDIO ConsoleLogger::writeMessageC("--", __LINE__, __func__, __FILE__, "check line")
#else
......
......@@ -93,7 +93,7 @@ public:
if (!logFile) create(logFileName.c_str());
(*logFile) << "[" << groupIndex << ", " << line << ", '" << cppFile << "', '" << name << "', ";
VariableExport<>::exportVariable(*logFile,value);
VariableExport::exportVariable(*logFile,value);
(*logFile) << "],\n";
writeVar(line, cppFile, rest...);
}
......@@ -106,7 +106,7 @@ public:
if (!logFile) create(logFileName.c_str());
(*logFile) << "[" << groupIndex << ", " << line << ", '" << cppFile << "', '" << name << "', ";
VariableExport<>::exportVariable(*logFile,value);
VariableExport::exportVariable(*logFile,value);
(*logFile) << "],\n";
groupIndex++;
......
......@@ -17,7 +17,6 @@ class JSONLogger {
std::ofstream* logFile;
int groupIndex = 0;
bool firstWrite = true;
public:
JSONLogger(){logFile = nullptr;}
......@@ -85,9 +84,9 @@ public:
firstWrite = false;
}
(*logFile) << "\t{\n\t\t\"expr\" : \""<< std::quoted( name ) <<
"\",\n\t\t\"data\" : " ;
VariableExport<>::exportVariable(*logFile, value);
(*logFile) << "\t{\n\t\t\"expr\" : "<< std::quoted( name ) <<
",\n\t\t\"data\" : " ;
VariableExport::exportVariable(*logFile, value);
(*logFile) << "\n}";
......@@ -109,9 +108,9 @@ public:
"\n\t\t\"gInd\" : " << groupIndex << "," <<
"\n\t\t\"file\" : \"" << cppFile << "\"," <<
"\n\t\t\"line\" : " << line << "," <<
"\n\t\t\"expr\" : \""<< std::quoted( name ) << "\"," <<
"\n\t\t\"expr\" : " << std::quoted( name ) << "," <<
"\n\t\t\"data\" : ";
VariableExport<>::exportVariable(*logFile, value);
VariableExport::exportVariable(*logFile, value);
(*logFile) << "\n\t}";
writeVar(line, cppFile, rest...);
......@@ -133,9 +132,9 @@ public:
"\n\t\t\"gInd\" : " << groupIndex << "," <<
"\n\t\t\"file\" : \"" << cppFile << "\"," <<
"\n\t\t\"line\" : " << line << "," <<
"\n\t\t\"expr\" : \""<< std::quoted( name ) << "\"," <<
"\n\t\t\"expr\" : " << std::quoted( name ) << "," <<
"\n\t\t\"data\" : ";
VariableExport<>::exportVariable(*logFile, value);
VariableExport::exportVariable(*logFile, value);
(*logFile) << "\n\t}";
......
......@@ -19,7 +19,7 @@ struct PrintIndexable {
static void print(std::ostream& ost, const Indexable& vec) {
ost << "[ ";
for (decltype (size(vec))i = 0; i < size(vec); i++){
VariableExport<>::exportVariable(ost, vec[i]);
VariableExport::exportVariable(ost, vec[i]);
if (i < size(vec) - 1){
ost << ", ";
}
......@@ -32,7 +32,7 @@ struct PrintIndexable {
static void print(std::ostream& ost, const Indexable& vec, const std::tuple<TraitsTypes...>& traitsTuple) {
ost << "[ ";
for (decltype (size(vec))i = 0; i < size(vec); i++){
VariableExport<>::exportVariable(ost, vec[i], traitsTuple);
VariableExport::exportVariable(ost, vec[i], traitsTuple);
if (i < size(vec) - 1){
ost << ", ";
}
......@@ -45,7 +45,7 @@ struct PrintIndexable {
static void print(const Indexable& vec) {
printf("[ ");
for (decltype (size(vec))i = 0; i < size(vec); i++){
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(vec[i]);
VariableExport::exportVariable(vec[i]);
if (i < size(vec) - 1){
printf(", ");
}
......@@ -58,7 +58,7 @@ struct PrintIndexable {
static void print(const Indexable& vec, const std::tuple<TraitsTypes...>& traitsTuple) {
printf("[ ");
for (decltype (size(vec))i = 0; i < size(vec); i++){
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(vec[i], traitsTuple);
VariableExport::exportVariable(vec[i], traitsTuple);
if (i < size(vec) - 1){
printf(", ");
}
......
......@@ -14,7 +14,7 @@ struct PrintIterable {
auto it = list.begin();
ost << "[ ";
while (it != list.end()){
VariableExport<>::exportVariable(ost, *it);
VariableExport::exportVariable(ost, *it);
if (++it != list.end()){
ost << ", ";
}
......@@ -29,7 +29,7 @@ struct PrintIterable {
auto it = list.begin();
ost << "[ ";
while (it != list.end()){
VariableExport<>::exportVariable(ost, *it, traitsTuple);
VariableExport::exportVariable(ost, *it, traitsTuple);
if (++it != list.end()){
ost << ", ";
}
......@@ -44,7 +44,7 @@ struct PrintIterable {
auto it = list.begin();
printf("[ ");
while (it != list.end()){
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(*it);
VariableExport::exportVariable(*it);
if (++it != list.end()){
printf(", ");
}
......@@ -60,7 +60,7 @@ struct PrintIterable {
auto it = list.begin();
printf("[ ");
while (it != list.end()){
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(*it, traitsTuple);
VariableExport::exportVariable(*it, traitsTuple);
if (++it != list.end()){
printf(", ");
}
......
......@@ -39,24 +39,24 @@ struct PrintTraitedClass {
static void print(std::ostream& ost, const T &traitedClass, const TraitsIO& traitsIO){
ost << '"' << traitsIO.template getName<Index>() << "\" : ";
VariableExport<>::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass));
VariableExport::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass));
}
template <typename ... _Traits, typename _T = T>
static void print(std::ostream& ost, const _T &traitedClass, const TraitsIO& traitsIO, std::tuple<const _Traits& ...> t) {
ost << '"' << traitsIO.template getName<Index>() << "\" : ";
VariableExport<>::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass), t);
VariableExport::exportVariable(ost, traitsIO.template getValue<Index>(traitedClass), t);
}
static void print(const T &traitedClass, const TraitsIO& traitsIO){
printf("\"%s\" : ", traitsIO.template getName<Index>());
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(traitsIO.template getValue<Index>(traitedClass));
VariableExport::exportVariable(traitsIO.template getValue<Index>(traitedClass));
}
template <typename ... _Traits, typename _T = T>
static void print(const _T &traitedClass, const TraitsIO& traitsIO, std::tuple<const _Traits& ...> t) {
printf("\"%s\" : ", traitsIO.template getName<Index>());
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(traitsIO.template getValue<Index>(traitedClass), t);
VariableExport::exportVariable(traitsIO.template getValue<Index>(traitedClass), t);
}
};
......@@ -75,7 +75,7 @@ struct PrintTraitedClass {
template< typename Class, typename PrimaryTraits, typename ... SecondaryTraits>
static void print(std::ostream& ost, const TraitsBinder<Class, PrimaryTraits, SecondaryTraits...> &traitedClass, ...)
{
VariableExport<>::exportVariable(ost, traitedClass.object, traitedClass.tupTraits);
VariableExport::exportVariable(ost, traitedClass.object, traitedClass.tupTraits);
}
template< typename Class, typename PrimaryTraits, typename ... SecondaryTraits, IsValid<Class, PrimaryTraits, SecondaryTraits...> = true>
......@@ -100,7 +100,7 @@ struct PrintTraitedClass {
template< typename Class, typename PrimaryTraits, typename ... SecondaryTraits>
static void print(const TraitsBinder<Class, PrimaryTraits, SecondaryTraits...> &traitedClass, ...)
{
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(traitedClass.object, traitedClass.tupTraits);
VariableExport::exportVariable(traitedClass.object, traitedClass.tupTraits);
}
template< typename Class, typename PrimaryTraits, typename ... SecondaryTraits, IsValid<Class, PrimaryTraits, SecondaryTraits...> = true>
......
#ifndef PRINTTUPLE_H
#define PRINTTUPLE_H
#include "../VariableExport.h"
#include <GTMesh/Utils/ConstexprFor.h>
/**
* @brief Provides functions that prints std::pair and std::tuple similarly to the python.
*/
struct PrintTuple {
/**
* @brief Python-like print of dictionary pair of key and value.
*/
template<typename T1, typename T2>
static void print(std::ostream& ost, const std::pair<T1,T2>& b, ...)
static void print(std::ostream& ost, const std::pair<T1,T2>& b)
{
ost << "{ ";
VariableExport::exportVariable(ost, b.first);
ost << ": ";
VariableExport::exportVariable(ost, b.second);
ost << "}";
}
template<typename T1, typename T2, typename ... TraitsTypes>
static void print(std::ostream& ost, const std::pair<T1,T2>& b, const std::tuple<TraitsTypes...>& traitsTuple)
{
ost << "{ ";
VariableExport<VARIABLE_EXPORT_METHOD_OSTREAM>::exportVariable(ost, b.first);
VariableExport::exportVariable(ost, b.first, traitsTuple);
ost << ": ";
VariableExport<VARIABLE_EXPORT_METHOD_OSTREAM>::exportVariable(ost, b.second);
VariableExport::exportVariable(ost, b.second, traitsTuple);
ost << "}";
}
template<typename T1, typename T2>
static void print(const std::pair<T1,T2>& b, ...)
static void print(const std::pair<T1,T2>& b)
{
printf("{ ");
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(b.first);
VariableExport::exportVariable(b.first);
printf(": ");
VariableExport<VARIABLE_EXPORT_METHOD_STDIO>::exportVariable(b.second);
VariableExport::exportVariable(b.second);
printf("}");
}
template < unsigned int Index = 0, bool print = false, typename ... Types, std::enable_if_t<(Index < sizeof... (Types) - 1) && !print, bool > = true >
static void printTuple(std::ostream& ost, const std::tuple<Types...>& varTuple) {
printTuple< Index, true >(ost, varTuple);
printTuple< Index + 1 >(ost, varTuple);
template<typename T1, typename T2, typename ... TraitsTypes>
static void print(const std::pair<T1,T2>& b, const std::tuple<TraitsTypes...>& traitsTuple)
{
printf("{ ");
VariableExport::exportVariable(b.first, traitsTuple);
printf(": ");
VariableExport::exportVariable(b.second, traitsTuple);
printf("}");
}
struct PrintTupleExec {
template < unsigned int Index = 0, typename ... Types>
static void printTuple(std::ostream& ost, const std::tuple<Types...>& varTuple) {
VariableExport::exportVariable(ost, std::get<Index>(varTuple));
if (Index < sizeof... (Types) - 1) {
ost << ", ";
}
}
template < unsigned int Index = 0, bool print = false, typename ... Types, std::enable_if_t<(Index == sizeof... (Types) - 1) || print, bool > = true >
static void printTuple(std::ostream& ost, const std::tuple<Types...>& varTuple) {
VariableExport<VARIABLE_EXPORT_METHOD_OSTREAM>::exportVariable(ost, std::get<Index>(varTuple));
if (Index < sizeof... (Types) - 1) {
ost << ", ";
template < unsigned int Index = 0, typename ... Types, typename ... TraitsTypes>
static void printTuple(std::ostream& ost, const std::tuple<Types...>& varTuple, const std::tuple<TraitsTypes...>& traitsTuple) {
VariableExport::exportVariable(ost, std::get<Index>(varTuple), traitsTuple);
if (Index < sizeof... (Types) - 1) {
ost << ", ";
}
}
}
// printf version
template < unsigned int Index = 0, typename ... Types>
static void exec(const std::tuple<Types...>& varTuple) {