00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #ifndef __loaded__expr_test_cpp__
00021 #define __loaded__expr_test_cpp__
00022 using namespace std;
00023 #line 1 "expr-test.c++"
00024 #include <iostream>
00025 #include <stdlib.h>
00026 #include <qstring.h>
00027 #include <typeinfo>
00028 #include <map>
00029 #include "expr.h"
00030 namespace BorgIv{
00035   class StringKey: public QString, public BorgIv::Key
00036   {
00037   public:
00038     StringKey(const char* k): QString(k)
00039     {
00040     }
00041   };
00042   
00043   class StringData: public BorgIv::ExpData, public QString
00044   {
00045   public:
00046     StringData(QString k): QString(k)
00047     {
00048     }
00049     virtual ExpData* new_copy() const
00050     {
00051       return new StringData(*this);
00052     }
00053     virtual Exp operator[](Key*key) const
00054     {
00055       assert(0);
00056       return Exp();
00057     }
00058   };
00059 
00060   class WriteExp: public Exp
00061   {
00062   public:
00063     WriteExp(Exp& e): Exp(e)
00064     {
00065     }
00066     void operator =(QString s)
00067     {
00068       Exp::operator=(new StringData(s));
00069     }
00070   };
00071 
00072   class TokenData: public ExpData
00073   {
00074     map<QString,Exp> content;
00075   protected:
00076     virtual ExpData* new_copy() const
00077     {
00078       return new TokenData(*this);
00079     }
00080   public:
00081     virtual Exp operator[](Key*key) const
00082     {
00083       StringKey* k = dynamic_cast<StringKey*>(key);
00084       if (content.find(*k)==content.end()) return Exp();
00085       else return content.find(*k)->second;
00086     }
00087     WriteExp operator[](QString k)
00088     {
00089       return content[k];
00090     }
00091 };
00092  
00093 } 
00094 
00095 using namespace BorgIv;
00096 int main(int argc, char* argv[])
00097 {
00098   TokenData token;
00099   token["Test"]="10";
00100   Exp expr(token);
00101   StringKey k("test");
00102   cout << ((StringData*)expr[&k])->toStdString();
00103   
00104 }
00105 
00106 #endif // __loaded__expr_test_cpp__