// TypeInfo.h
//
// Class for storing type information on classes
//
// Nov 2001 Janet Barnes
//

#ifndef QTYPEINFO_H
#define QTYPEINFO_H

#include <iostream>
#include <string>
#include <vector>
#include "Var.h"

namespace QDOS {

class TypeInfo;

typedef Var<TypeInfo> TypeInfo_var;

class TypeInfo:public VarTarget
{
protected:
  string _name;
  TypeInfo_var _base;
  vector<TypeInfo_var> _subclasses;
  void* (*_new_obj_creator)(void);
public:
  TypeInfo(const string& name=""):_name(name),_base(0),_new_obj_creator(0){;}
  TypeInfo(const string& name,TypeInfo_var base,\
    void* (*new_obj_creator)(void)):_name(name),_base(base),\
    _new_obj_creator(new_obj_creator)
  {
    if(!base.is_nil())
       base->_subclasses.push_back(new TypeInfo(*this));
  }

  string getname()
  { return _name;}

  void* create(const string& name)
  { vector<TypeInfo_var>::iterator itr;
    for(itr=_subclasses.begin();itr!=_subclasses.end();itr++)
    {
      TypeInfo_var t=*itr;
      if(t.is_nil())
         continue;
      if(t->_name==name)
      {
        if(t->_new_obj_creator)
          return t->_new_obj_creator();
        else
          return 0;
      }
    }
    return 0;
  }
};

} // end namespace QDOS

#endif
