// Run Time Type information and Objekt Hierechie loading and saving
// @1997 Jens Thiele
// info39@dulzian.gris.uni-tuebingen.de

// Konzept:
// Basis Objekt hat eine virtuelle Routine const char *getheaderstring();
// Und jedes Objekt hat einen statischen Headerstring
// Das Basis Objekt hat eine Routine objtype *create(iotype *ioptr,int8 mode);
// Die den headerstring aus dem Stream liest und entsprechend diesem string das passende Objekt erstellt
// danach wird dem change des Objektes der komplette Stream uebergeben (incl. Headerstring!!)

#ifndef _typecheck_H
#define _typecheck_H

template <class checktype>
void check_or_save_header(checktype *, iotype *ioptr,int8 mode)
{
  cfgtype *cfgptr=choose_cfgtype(ioptr,mode);
  if (ioptr->getmode()==IOTYPE_READ_MODE)
    {
      string hdr;
      cfgptr->read_string_check(&hdr);
      if (hdr!=checktype::headerstring)
	{
	  cerr << "check_or_save_header: Wrong Headerstring\n"
	    "I got: "<<hdr<<" and i want "<<checktype::headerstring<<endl;
	  fatalfehler("see above");
	}
    }
  else
    {
      cfgptr->write_string(checktype::headerstring);
    }
  delete cfgptr;
}

#endif
