29 template <
typename CharT>
30 std::streamsize ignore_line (std::basic_istream<CharT>& in,
bool always_discard =
false );
44 inline string PromptForString(
string input)
51 getline(cin, user_input);
61 inline int PromptForInt(
string text,
int minval=INT_MIN,
int maxval=INT_MAX)
67 input = PromptForString(text);
70 valid_int = stod(input);
71 if (valid_int < minval || valid_int > maxval)
73 cout <<
"The entered value must be with the range " << minval <<
" to " << maxval << endl;
83 cout <<
"invalid value\n" << endl;
93 inline double PromptForDouble(
string text,
double minval=DBL_MIN,
double maxval=DBL_MAX)
99 input = PromptForString(text);
102 valid_double = std::stod(input);
103 if (valid_double < minval || valid_double > maxval)
105 cout <<
"The entered value must be with the range " << minval <<
" to " << maxval << endl;
116 cout <<
"invalid value\n" << endl;
127 void Prompt (
string prompt, T & val)
135 cin.ignore(numeric_limits<streamsize>::max(),
'\n');
159 inline bool PromptYN(
string input)
163 cout << input <<
" (Y/N)"<< endl;
167 if ( user_input ==
"Y" || user_input ==
"y")
171 if (user_input ==
"N" || user_input ==
"n")
191 inline void WaitHundredth(
int time)
193 struct timespec tim, tim2;
195 tim.tv_nsec = time*10000000;
196 nanosleep(&tim , &tim2);
201 #define ClearScreen() system("clear") 212 inline char * GetTime()
214 time_t rawtime = time(0);
215 struct tm * timeinfo;
217 timeinfo = localtime ( &rawtime );
218 return asctime (timeinfo);
234 inline int StringToInteger(
string input)
239 inline double StringToDouble(
string input )
245 inline bool StringToBool(
string input)
247 if(input==
"true" || input ==
"1")
252 if(input==
"false" || input ==
"0")
270 inline bool VeryClose(
float A,
float B,
float epsilon = 0.0005f)
272 return (fabs(A - B) < epsilon);
282 template <
typename T>
283 string NumberToString ( T Number )
291 inline int CreateRandomNumber(
int min,
int max)
293 std::random_device rd;
294 std::mt19937 gen(rd());
295 std::uniform_int_distribution<> dis(min,max);
306 inline bool IsNumber(
string str)
308 for (
unsigned int i = 0; i < str.length(); i++)
310 if (! isdigit(str[i]))
319 inline bool IsInteger(
string input)
323 int temp = stoi(input);
334 inline bool IsDouble(
string input)
339 double temp = stod(input);
351 inline string PassFail(
bool in)
353 return (in) ?
"Pass":
"Fail";
355 inline string PF(
bool in)
357 return (in) ?
"Pass":
"Fail";
374 inline string RED(
string input)
376 return string(
"\033[1;31m"+input+
"\033[0m");
379 inline string GREEN(
string input)
381 return string(
"\033[1;32m"+input+
"\033[0m");
384 inline string YELLOW(
string input)
386 return string(
"\033[1;33m"+input+
"\033[0m");
389 inline string BLUE(
string input)
391 return string(
"\033[1;34m"+input+
"\033[0m");
394 inline string MAGENTA(
string input)
396 return string(
"\033[1;35m"+input+
"\033[0m");
399 inline string CYAN(
string input)
401 return string(
"\033[1;36m"+input+
"\033[0m");
410 inline string ChangeToRed()
412 return string(
"\033[1;31m");
414 inline string ChangeToGreen()
416 return string(
"\033[1;32m");
418 inline string ChangeToYellow()
420 return string(
"\033[1;33m");
422 inline string ChangeToBlue()
424 return string(
"\033[1;34m");
426 inline string ChangeToMagenta()
428 return string(
"\033[1;35m");
430 inline string ChangeToCyan()
432 return string(
"\033[1;36m");
434 inline string ChangeToWhite()
436 return string(
"\033[0m");
442 inline void PositionCursor(
int row,
int col)
444 printf(
"\033[%i;%iH",row+1,col+1);
474 #if LOGLEVEL < 1 || (! defined(LOGLEVEL)) 477 #define LoggerSetup(...) 478 #define LoggerSetUpLog(...) //do nothing 479 #define LogLow(...) //do nothing 480 #define LogMed(...) //do nothing 481 #define LogHigh(...) //do nothing 482 #define LogPos() // do nothing 483 #define LogStart(...) 485 #define LogEndReturning(...) 487 #endif // LOGLEVEL not defined or 0 501 char INDENT_BUFFER[1000];
505 LOGGER_DATA() {FN[0]=0;}
507 typedef struct LOGGER_DATA LOGGER_DATA;
509 extern LOGGER_DATA LGDATA;
513 #define GET_MACRO(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME 515 #define LogStart(...) GET_MACRO(_0, ##__VA_ARGS__, LogStart10, LogStart9, LogStart8, LogStart7, LogStart6, LogStart5, LogStart4, LogStart3, LogStart2, LogStart1, LogStart0)(__VA_ARGS__) 516 #define LogStart0() LoggerStart(__PRETTY_FUNCTION__,__LINE__); 517 #define LogStart1(a) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a)); 518 #define LogStart2(a,b) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b)); 519 #define LogStart3(a,b,c) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c)); 520 #define LogStart4(a,b,c,d) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d)); 521 #define LogStart5(a,b,c,d,e) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e)); 522 #define LogStart6(a,b,c,d,e,f) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f)); 523 #define LogStart7(a,b,c,d,e,f,g) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g)); 524 #define LogStart8(a,b,c,d,e,f,g,h) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h)); 525 #define LogStart9(a,b,c,d,e,f,g,h,i) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h),AsString(i)); 526 #define LogStart10(a,b,c,d,e,f,g,h,i,j) LoggerStart(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h),AsString(i),AsString(j)); 528 #define LogEnd(...) GET_MACRO(_0, ##__VA_ARGS__, LogEnd10, LogEnd9, LogEnd8, LogEnd7, LogEnd6, LogEnd5, LogEnd4, LogEnd3, LogEnd2, LogEnd1, LogEnd0)(__VA_ARGS__) 529 #define LogEnd0() LoggerEnd(__PRETTY_FUNCTION__,__LINE__); 530 #define LogEnd1(a) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a)); 531 #define LogEnd2(a,b) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b)); 532 #define LogEnd3(a,b,c) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c)); 533 #define LogEnd4(a,b,c,d) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d)); 534 #define LogEnd5(a,b,c,d,e) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e)); 535 #define LogEnd6(a,b,c,d,e,f) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f)); 536 #define LogEnd7(a,b,c,d,e,f,g) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g)); 537 #define LogEnd8(a,b,c,d,e,f,g,h) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h)); 538 #define LogEnd9(a,b,c,d,e,f,g,h,i) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h),AsString(i)); 539 #define LogEnd10(a,b,c,d,e,f,g,h,i,j) LoggerEnd(__PRETTY_FUNCTION__,__LINE__,AsString(a),AsString(b),AsString(c),AsString(d),AsString(e),AsString(f),AsString(g),AsString(h),AsString(i),AsString(j)); 541 #define LogEndReturning(a) LoggerEndReturning(__PRETTY_FUNCTION__,__LINE__,a) 543 #define LogPos() LoggerLow(__PRETTY_FUNCTION__,__LINE__,"") 544 #define LogLow(a, ...) LoggerLow(__PRETTY_FUNCTION__,__LINE__,a,##__VA_ARGS__) 545 #define LogMed(a, ...) LoggerMed(__PRETTY_FUNCTION__,__LINE__,a,##__VA_ARGS__) 546 #define LogHigh(a, ...) LoggerHigh(__PRETTY_FUNCTION__,__LINE__,a,##__VA_ARGS__) 549 inline void LoggerOpen()
555 if (strlen(LGDATA.FN) ==0)
557 cerr <<
"\nYou do not seem to have set up the logging in your main properly, look at the examples\n no i dont have a log file name \n";
561 LGDATA.LF =fopen(LGDATA.FN,
"a+");
562 if (LGDATA.LF == NULL)
564 cerr <<
"Could not open the logfile \""<< LGDATA.FN <<
"\", you may not have write permssions to that file: " << LGDATA.FN << endl;
569 inline void LoggerClose()
575 fclose ( LGDATA.LF );
579 inline void LoggerSetIndent(
int in)
581 LGDATA.INDENT_COUNT+=in;
583 if (LGDATA.INDENT_COUNT <0)
585 LGDATA.INDENT_COUNT=0;
588 if (LGDATA.INDENT_COUNT >999)
590 LGDATA.INDENT_COUNT=999;
593 memset(LGDATA.INDENT_BUFFER,
' ',LGDATA.INDENT_COUNT);
594 LGDATA.INDENT_BUFFER[LGDATA.INDENT_COUNT]=0;
610 inline void LoggerEnd(
const char * fn,
const int line ,
string a=
"",
string b=
"",
string c=
"",
string d=
"",
string e=
"",
string f=
"",
string g=
"",
string h=
"",
string i=
"",
string j=
"")
613 fprintf(LGDATA.LF,
"%sEnd -- frame(%d) %s\n",LGDATA.INDENT_BUFFER,LGDATA.Frame,fn);
617 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,a.c_str());
621 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,b.c_str());
625 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,c.c_str());
629 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,d.c_str());
633 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,e.c_str());
637 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,f.c_str());
641 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,g.c_str());
645 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,h.c_str());
649 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,i.c_str());
653 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,j.c_str());
658 if (0 == LGDATA.INDENT_COUNT)
660 fprintf(LGDATA.LF,
"\n\n");
666 inline void LoggerStart(
const char * fn,
const int line,
string a=
"",
string b=
"",
string c=
"",
string d=
"",
string e=
"",
string f=
"",
string g=
"",
string h=
"",
string i=
"",
string j=
"")
672 fprintf(LGDATA.LF,
"%sStart -- frame(%d) %s\n",LGDATA.INDENT_BUFFER,LGDATA.Frame,fn);
676 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,a.c_str());
680 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,b.c_str());
684 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,c.c_str());
688 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,d.c_str());
692 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,e.c_str());
696 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,f.c_str());
700 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,g.c_str());
704 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,h.c_str());
708 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,i.c_str());
712 fprintf(LGDATA.LF,
"%sparam: %s\n",LGDATA.INDENT_BUFFER,j.c_str());
721 inline void segfault_sigaction(
int signal, siginfo_t *si,
void *arg)
723 psignal(signal,
"\n\nYour program experienced an error\nsignal:\n");
724 psiginfo(si,
"siginfo_t:\n");
728 inline void LoggerSetUpLog(
const char * filename,
bool append=
false)
730 strncpy(LGDATA.FN,filename,100);
732 LGDATA.INDENT_COUNT=0;
737 LGDATA.LF = fopen(LGDATA.FN,
"w+");
738 if (LGDATA.LF == NULL)
740 cerr <<
"Could not open the logfile, you may not have write permssions to the file: " << LGDATA.FN << endl;
751 fprintf(LGDATA.LF,
"log file \"%s\" opened\n",LGDATA.FN );
755 int size =
sizeof(sa);
756 memset(&sa, 0, size);
757 sigemptyset(&sa.sa_mask);
758 sa.sa_sigaction = segfault_sigaction;
759 sa.sa_flags = SA_SIGINFO;
761 sigaction(SIGSEGV, &sa, NULL);
767 void* GetAddress( T & in)
773 void* GetAddress( T * in)
779 template <
typename T>
780 inline string ValueAsString(T & in)
785 tmp = abi::__cxa_demangle(
typeid(T).name(),0,0,&status);
793 out << * ((
int *) &in );
797 if (name==
"unsigned long" )
799 out << * ((
unsigned long *) &in );
805 out << * ((
long *) &in );
809 if (name==
"long long" )
811 out << * ((
long long *) &in );
815 if (name==
"unsigned long long" )
817 out << * ((
unsigned long long *) &in );
823 out << * ((
short *) &in );
827 if (name==
"unsigned short" )
829 out << * ((
unsigned short *) &in );
835 out << * ((
double *) &in );
839 if (name==
"long double" )
841 out << * ((
long double *) &in );
847 out << * ((
char *) &in );
853 out << * ((
char *) &in );
857 if (name==
"char const*" )
859 out << * ((
char const *) &in );
863 if (name==
"unsigned char" )
865 out << * ((
unsigned char *) &in );
871 out << boolalpha << * ((
bool *) &in );
875 if (name==
"std::string" )
877 out << * ((std::string *) &in );
881 if (name==
"std::istream" )
883 out <<
"cant display value of std::istream" ;
887 if (name==
"std::ostream" )
889 out <<
"cant display value of std::ostream" ;
893 if (name==
"std::ifstream" )
895 out <<
"cant display value of std::ifstream" ;
899 if (name==
"std::ofstream" )
901 out <<
"cant display value of std::ofstream" ;
905 return string(
"unknown type <" + name +
">, cant display value try converting it to a string or overoad ostream << \n");
908 string GetClassName(T&input)
912 tmp = abi::__cxa_demangle(
typeid(T).name(),0,0,&status);
920 string GetClassName(T * input)
924 tmp = abi::__cxa_demangle(
typeid(T).name(),0,0,&status);
935 string AsString(T & input)
937 string name = GetClassName(input);
939 out << name<<
" address:" << ((
void*) & input) <<
" value:" << ValueAsString(input);
944 string AsString(T *input)
946 string name = GetClassName(input);
950 out << name <<
"* address:" << ((
void *)input) <<
" points_to_value:nullptr";
955 if (name==
"char" || name ==
"char const")
957 out << name <<
"* address:" << ((
void *)input) <<
" points_to_value:"<< input ;
961 out << name <<
"* address:" << ((
void *)input) <<
" points_to_value:"<< ValueAsString(*input);
968 inline string AsString()
975 inline void WriteFormmatted(
const char* format)
977 fprintf(LGDATA.LF,
"%s",format);
981 template<
class T,
class... Args>
982 static void WriteFormmatted(
const char* format, T value, Args... args)
984 while (format && *format)
986 if (*format==
'%' && *++format!=
'%')
990 fprintf(LGDATA.LF,
"%p",GetAddress(value));
992 else if (*format ==
'S')
994 fprintf(LGDATA.LF,
"%s",AsString(value).c_str());
998 fprintf(LGDATA.LF,
"%s",ValueAsString(value).c_str());
1001 return WriteFormmatted(++format, args...);
1004 fprintf(LGDATA.LF,
"%c",*format++);
1007 fprintf(LGDATA.LF,
"\n\nextra arguments provided to Logger::Log you need a placeholder %%P or %%S or %%s for each additional parameter");
1014 template <
typename... Args>
1015 static void LoggerLow(
const char * fn,
int ln,
const char* format, Args... args)
1019 fprintf(LGDATA.LF,
"%s%s at line %d :",LGDATA.INDENT_BUFFER,fn,ln);
1020 WriteFormmatted(format, args...);
1025 template <
typename... Args>
1026 static void LoggerMed(
const char * fn,
int ln,
const char* format, Args... args)
1030 fprintf(LGDATA.LF,
"%s%s at line %d :",LGDATA.INDENT_BUFFER,fn,ln);
1031 WriteFormmatted(format, args...);
1035 template <
typename... Args>
1036 static void LoggerHigh(
const char * fn,
int ln,
const char* format, Args... args)
1040 fprintf(LGDATA.LF,
"%s%s at line %d :",LGDATA.INDENT_BUFFER,fn,ln);
1041 WriteFormmatted(format, args...);
1047 template <
typename T>
1048 void LoggerEndReturning(
const char * fn,
int ln,
const T & val)
1051 fprintf(LGDATA.LF,
"%sEnd frame(%d)--%s at line %d\nReturn Value:%s",LGDATA.INDENT_BUFFER,LGDATA.Frame,fn,ln,ValueAsString(val).c_str());
1052 fprintf(LGDATA.LF,
"\n\n");
1053 LoggerSetIndent(-2);
1060 #endif // LOGLEVEL > 0 1081 template <
typename CharT>
1082 std::streamsize ignore_line (
1083 std::basic_istream<CharT>& in,
bool always_discard )
1085 std::streamsize nread = 0;
1087 || ( in.rdbuf()->sungetc() != std::char_traits<CharT>::eof()
1088 && in.get() != in.widen (
'\n' ) ) )
1092 in.ignore ( std::numeric_limits<std::streamsize>::max(), in.widen (
'\n' ) );
1093 nread = in.gcount();