00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00015 class mdp_log {
00016 private:
00017 int level;
00018 int max_level;
00019 vector<string> level_tag;
00020 ostream* os;
00021 public:
00022 bool print;
00023 void abort() {
00024 exit(-1);
00025 }
00026 void set_level(int i) {
00027 max_level=i;
00028 }
00029 mdp_log() {
00030 level=0;
00031 max_level=100000;
00032 print=true;
00033 connect(cout);
00034 }
00035 void connect(ostream &os1) {
00036 os=&os1;
00037 }
00038 void connect(ofstream &os2) {
00039 os=&os2;
00040 }
00041 void error_message(string s, string file, int line) {
00042 if(print) {
00043 begin_function("error");
00044 *os << "In file \"" << file;
00045 *os << "\", before line " << line;
00046 *os << ", this error occurred: " << s << '\n';
00047 for(;level; level--)
00048 if(level<max_level)
00049 *os << "</" << level_tag[level-1] << ">" << '\n';
00050 }
00051 throw s;
00052 }
00053 void begin_function(string s) {
00054 level_tag.resize(++level);
00055 level_tag[level-1]=s;
00056 if(print && level<max_level)
00057 *os << "<" << s << ">" << '\n';
00058 }
00059 void end_function(string s) {
00060 if(level_tag[level-1]==s) {
00061 if(print && level<max_level)
00062 *os << "</" << level_tag[level-1] << ">" << '\n';
00063 level--;
00064 } else error_message("missing end_function()", "unkown", 0);
00065 }
00066 template<class T>
00067 mdp_log &operator<< (const T x) {
00068 if (print && level<max_level) *os << x;
00069 return (*this);
00070 }
00071 };
00072