// $Source: /usr/local/SimSoft/Sfx3D/src/gsl/vereinzeler.h,v $
// $Revision: 1.2 $
// $Author: baum $
// $Date: 2001/11/29 15:18:09 $
//
// Login name of the user who locked the revision
// $Locker:  $
// Tag name used to checkout the file
// $Name:  $
// State assigned to revision
// $State: Exp $
//
//
// $Log: vereinzeler.h,v $
// Revision 1.2  2001/11/29 15:18:09  baum
// -Realzeitsteuerung eingebaut
// -Handsteuerung eingebaut
// -erweitert für Baustein Vereinzeler um Senke (void e_ausschl ())
// Basti 20.11.2002
//

#ifndef _VEREIN_H
#define _VEREIN_H  1

#include "baustein.h"

#ifdef _VEREIN_CPP
#  undef _impexp
#  define _impexp __declspec(dllexport)
#elif defined BUILD_MAIN_DLL
#  undef _impexp
#  define _impexp 
#else
#  undef _impexp
#  define _impexp __declspec(dllimport)
#endif

#if defined __GNUC__ || defined __hpux
#  undef _impexp
#  define _impexp
#endif

class _impexp typVereinzeler : public typBaustein {
   public:
      typVereinzeler (unsigned n, unsigned b);
      virtual ~typVereinzeler ();
      void e_ausschl ();
      virtual void     typTGSlesen     (InputFile& file);
      virtual void     typTTPlesen     (InputFile& file);
      virtual ostream& typTTPschreiben (ostream& ostrm) const;
      virtual void     typTSTlesen     (InputFile& file);

      virtual void e_aufnehmen   ();
      virtual void a_arbeiten    ();
      virtual void e_arbeiten    ();
      virtual void a_abgeben     ();
      virtual void e_abgeben     ();
      virtual void a_vereinzeln  ();
      virtual void e_vereinzeln  ();
      virtual void eStoeren      ();
      

      virtual typTransportEinheit* gibTransportEinheit (typMeldung* zM);

      virtual bool hasKapazitaet (typTransportEinheit *zTE) const;
      virtual typPlatz* waehlePlatz (typTransportEinheit*);
      virtual Vec3D UebernahmePos (const typBaustein& von)  const;
      virtual Vec3D UebergabePos  (const typBaustein& nach) const;

   private:
      virtual void individuellAktivieren (typBaustein* vonWem);
      typMeldung* findeAusfuehrbareMeldung ();
      typMeldung* (*ObjFindeMeldungFunktion) (typVereinzeler*);
      void erzeugeNeuTemp ();

      bool ObjNeuTempAbgeben, ObjTransportEinheitWartet;
      typTransportEinheit  *ObjNeuTemp;
      typBaustein    *ObjNeuZielBst;
      static typMeldung* findeFifoMeldung (typVereinzeler* who);
      static typMeldung* findeKOZMeldung  (typVereinzeler* who);
};

#endif
