#pragma once #include #include #include // MSVC need this to use std::getline #include #ifdef _WIN32 #include // use SetConsoleTextAttribute struct for_reset { CONSOLE_SCREEN_BUFFER_INFO scr; for_reset(){ GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&scr); } }reset_ter_color; #endif std::ostream& back_white(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0); #else s<<"\033[7m"; #endif return s; } std::ostream& red(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0c); #else s<<"\033[91;1m"; #endif return s; } std::ostream& cyan(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x03); #else s<<"\033[36;1m"; #endif return s; } std::ostream& orange(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0e); #else s<<"\033[93;1m"; #endif return s; } std::ostream& white(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x0f); #else s<<"\033[0m\033[1m"; #endif return s; } std::ostream& reset(std::ostream& s) { #ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),reset_ter_color.scr.wAttributes); #else s<<"\033[0m"; #endif return s; } class flstream { protected: string file; std::vector res; public: flstream():file(""){} void load(const string& f) { if(file==f){ // don't need to load a loaded file return; }else{ file=f; } res.clear(); std::ifstream in(f,std::ios::binary); if(in.fail()){ std::cerr<\n"; std::exit(1); } while(!in.eof()){ string line; std::getline(in,line); res.push_back(line); } } const string& operator[](usize n){return res[n];} const string& name(){return file;} usize size(){return res.size();} }; class error:public flstream { private: u32 cnt; string identation(usize len) { string tmp=""; tmp.resize(len,' '); return tmp; } public: error():cnt(0){} void fatal(const string& stage,const string& info) { std::cerr < "< "< "<