00001 #ifndef _CONTEXT_H_
00002 #define _CONTEXT_H_ //make idempotent
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include <vector>
00028 #include <string>
00029 #include <memory>
00030
00032 namespace context
00033 {
00034 using std::vector;
00035 using std::string;
00036 using std::auto_ptr;
00037
00042 class Context
00043 {
00044 private:
00046 std::string description;
00047
00048
00049 Context();
00050
00051
00052 Context(Context const &);
00053
00054 public:
00055 Context(const string &argd);
00056
00057 ~Context();
00058
00059 const std::string &getDescription() const;
00060
00061 static void print(const vector<string> &list, size_t start=0,
00062 size_t end=0);
00063 };
00064
00068 class ContextStack
00069 {
00070 private:
00072 std::vector<Context *> stack;
00073
00075 static ContextStack *instance;
00076
00077 public:
00082 static ContextStack &getInstanceOf()
00083 {
00084 if (instance==NULL) instance=new ContextStack;
00085 if (instance==NULL) throw "Argh!";
00086 return *instance;
00087 }
00088
00089 void push(Context &cont);
00090
00091 void pop();
00092
00093 void pop(Context &cx);
00094
00095 auto_ptr< vector<string> > makeSVector() const;
00096
00097 static void print();
00098 };
00099
00103 class ContException
00104 {
00105 private:
00107 auto_ptr <vector <string> > thrContext;
00108
00110 string msg;
00111
00112 public:
00113 ContException();
00114
00115 ContException(const string &argmsg);
00116
00117 void print();
00118 };
00119 };
00120 #endif // end idempotent ifdef