/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Event sources. * * $Id$ * $CurLog$ */ #include "Source.h" #include "Trigger.h" #include "Reaction.h" #include "ivl/Array.h" #include "ivl/HashTable.h" IvlEventSource :: IvlEventSource () { } IvlEventSource :: ~IvlEventSource () { } void IvlEventSource :: Emit (IvlEvent* ev) { /* should enqueue? */ DispatchEvent (ev); } IvlEventSelector :: IvlEventSelector () { } IvlEventSelector :: ~IvlEventSelector () { } IvlEventIntSelector :: IvlEventIntSelector (IvlIntExtractor exid, int max) : IvlEventSelector (), IdExtractor (exid), MaxSize (max), Triggers (0) { } IvlEventIntSelector :: ~IvlEventIntSelector () { if (Triggers) { int id = 0; #ifdef FIXME while (id < MaxSize) { IvlTrigger* t = (*Triggers)[id]; if (t) delete t; } #endif } } IvlTrigger* IvlEventIntSelector :: UseTrigger (int id) { if (!Triggers && MaxSize) { Triggers = new IvlArrayOf (MaxSize, 0); } /* no need to check bounds: IvlArray does it */ IvlTrigger** t = *Triggers + id; if (*t == 0) { *t = new IvlTrigger; } return *t; } void IvlEventIntSelector :: UnuseTrigger (int id, IvlBaseReaction* r) { IvlTrigger** t; if (!Triggers || !(t = *Triggers + id)) return; r->UnsubscribeTo (**t); if ((*t)->IsUnused ()) { delete *t; *t = 0; } } IvlTrigger* IvlEventIntSelector :: FindTrigger (IvlEvent* ev) { IvlTrigger* t = 0; int id = (IdExtractor) (ev); if (Triggers) t = (*Triggers) [id]; return t; } IvlEventPtrSelector :: IvlEventPtrSelector (IvlPtrExtractor exid, int sz) : IvlEventSelector (), PtrExtractor (exid), TblSize (sz), Triggers (0) { } IvlEventPtrSelector :: ~IvlEventPtrSelector () { if (Triggers) { int id = 0; #ifdef FIXME #endif } } IvlTrigger* IvlEventPtrSelector :: UseTrigger (void* id) { if (!Triggers && TblSize) { Triggers = new IvlHashTableOf (TblSize); } int found; IvlHashCellOf* c = Triggers->Add (id, &found); IvlTrigger* t; if (found) t = c->GetInfo (); else c->SetInfo (t = new IvlTrigger); return t; } void IvlEventPtrSelector :: UnuseTrigger (void* id, IvlBaseReaction* r) { IvlHashCellOf* c; if (!Triggers || !(c = Triggers->Get (id))) return; IvlTrigger* t = c->GetInfo (); r->UnsubscribeTo (*t); if (t->IsUnused ()) { delete t; /* not optimal : we already had the cell */ Triggers->Remove (id); } } IvlTrigger* IvlEventPtrSelector :: FindTrigger (IvlEvent* ev) { IvlTrigger* t = 0; IvlHashCellOf* c; void* id = (PtrExtractor) (ev); if (Triggers && (c = Triggers->Get (id))) t = c->GetInfo (); return t; }