Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

mclass.cc

Go to the documentation of this file.
00001 
00025 #include "magic/mclass.h"
00026 #include "magic/mmap.h"
00027 #include "magic/mdatastream.h"
00028 
00029 BEGIN_NAMESPACE (MagiC);
00030 
00031 
00033 //                          ___  |                                           //
00034 //                         /   \ |  ___   ____  ____                         //
00035 //                         |     |  ___| (     (                             //
00036 //                         |     | (   |  \__   \__                          //
00037 //                         \___/ |  \__| ____) ____)                         //
00039 
00040 //decl_dynamic (Class)
00041 
00042 Class*  appclass = NULL;
00043 Class*  taskclass = NULL;
00044 
00045 //Class::Class (const char* nam, const char* bases, Object& (Object::*getinst)()){
00046 Class::Class (const char* nam, const char* bases, GetClassInstance* getInstPtr){
00047     #ifdef MODULEDEBUG
00048     TRACE2 ("Class (%s, %s)", nam, bases);
00049     #endif
00050     name = nam;
00051     name.checksum ();
00052     // parents_unfound = new Array<String>;
00053     // parents = new CRefArray<Class>;
00054     //  getinstance = (Object&(Object::*getinst)()) ();
00055     //getinstance = (Object&(Object::*)()) getinst;
00056     mGetInstance = getInstPtr;
00057 
00058     if (bases) {
00059 
00060         // Remove extra characters {""} from ends of the parent class list
00061         String bases_str = bases;
00062         while (bases_str.length()>0 && (bases_str[0]=='{' || bases_str[0]=='"'))
00063             bases_str = bases_str.mid (1);
00064         while (bases_str.length()>0 && (bases_str[bases_str.length()-1]=='}' || bases_str[bases_str.length()-1]=='"'))
00065             bases_str.dellast (1);
00066 
00067         // Go through the list of parent classes
00068         bases_str.split (parents_unfound, ',');
00069         for (int i=0; i<parents_unfound.size(); i++) {
00070             if ((parents_unfound[i] == "Application" ||
00071                  parents_unfound[i] == "HTMLQuery") &&
00072                 name != "HTMLQuery") {
00073                 appclass = this;
00074                 // TRACE2 ("Class (%s, %s)", nam, bases);
00075             }
00076             if (parents_unfound[i] == "Task")
00077                 taskclass = this;
00078         }
00079     }
00080 
00081     // printclassinfo ();
00082     
00083     ClassLib::insert (*this);
00084 }
00085 
00086 Class::~Class () {
00087     // delete parents_unfound;
00088     // delete parents;
00089 }
00090 
00091 void Class::printclassinfo (FILE* out) const {
00092     fprintf (out, "class %s",
00093             (CONSTR) name);
00094 
00095     // Tulostetaan vanhemmat
00096     if (parents_unfound.size() > 0) {
00097         fprintf (out, ": ");
00098         for (int i=0; i<parents_unfound.size(); i++) {
00099             fprintf (out, "%s", (CONSTR) parents_unfound[i]);
00100             if (i < parents_unfound.size() - 1)
00101                 fprintf (out, ",");
00102         }
00103     }
00104     fprintf (out, " {\n");
00105 
00106     // Tulostetaan attribuutit
00107 
00108     // NOT WORKING TEMPORARILY!
00109     //Object* inst = (const_cast<Class*>(this)->getinstance ());
00110     Object* inst=NULL;
00111 
00112     DataOStream ar (out);
00113     ar << *inst;
00114     for (int i=0; i<ar.getattribs().size(); i++)
00115         fprintf (out, "\t%s;\n", (CONSTR) ar.getattribs()[i]);
00116     delete inst;
00117     fprintf (out, "};\n");
00118 }
00119 
00120 
00121 
00123 //                   ___  |                   |     o                        //
00124 //                  /   \ |  ___   ____  ____ |       |                      //
00125 //                  |     |  ___| (     (     |     | |---                   //
00126 //                  |     | (   |  \__   \__  |     | |   )                  //
00127 //                  \___/ |  \__| ____) ____) |____ | |__/                   //
00129 
00130 // Class* ClassLib::firstclass = NULL;
00131 CMap<String,Class>* ClassLib::classes = NULL;
00132 
00133 void ClassLib::printclassinfo (const String& classname, FILE* out) {
00134     const Class* cls = classes->getp (classname);
00135     if (cls)
00136         cls->printclassinfo (out);
00137 }
00138 
00139 Class* ClassLib::getclass (const String& classname) {
00140     return classes->getvp (classname);
00141 }
00142 
00143 Object& ClassLib::getinstance (const String& classname) {
00144     //TRACE1("%s", (CONSTR) classname);
00145     Class* cls = classes->getvp (classname);
00146     if (cls)
00147         return *cls->getInstance();
00148     TRACE1("%%ERROR: No instance for '%s' found", (CONSTR) classname);
00149     return *(Object*)NULL;
00150 }
00151 
00152 void ClassLib::insert (Class& cls) {
00153     if (!classes)
00154         classes = new CMap<String,Class> (256, MAP_REF);
00155     
00156     classes->set (cls.name, cls);
00157 
00158     // Haetaan luokan vanhemmat
00159     for (int i=0; i<cls.parents_unfound.size(); i++)
00160         ;
00161 }
00162 
00163 END_NAMESPACE;
00164 

Generated on Thu Feb 10 20:06:41 2005 for LibMagiC by doxygen1.2.18