From bcb19dbd53973ff7efd9b2838de121d1e23430f4 Mon Sep 17 00:00:00 2001 From: chatty Date: Tue, 28 Nov 2000 14:52:15 +0000 Subject: Lots of files were added around '96 --- dnn/Source.cc | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100755 dnn/Source.cc (limited to 'dnn/Source.cc') diff --git a/dnn/Source.cc b/dnn/Source.cc new file mode 100755 index 0000000..516a710 --- /dev/null +++ b/dnn/Source.cc @@ -0,0 +1,171 @@ +/* + * 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 "ccu/Array.h" +#include "ccu/HashTable.h" + +DnnEventSource :: DnnEventSource () +{ +} + +DnnEventSource :: ~DnnEventSource () +{ +} + +void +DnnEventSource :: Emit (DnnEvent* ev) +{ + /* should enqueue? */ + DispatchEvent (ev); +} + +DnnEventSelector :: DnnEventSelector () +{ +} + +DnnEventSelector :: ~DnnEventSelector () +{ +} + +DnnEventIntSelector :: DnnEventIntSelector (DnnIntExtractor exid, int max) +: DnnEventSelector (), + IdExtractor (exid), + MaxSize (max), + Triggers (0) +{ +} + +DnnEventIntSelector :: ~DnnEventIntSelector () +{ + if (Triggers) { + int id = 0; +#ifdef FIXME + while (id < MaxSize) { + DnnTrigger* t = (*Triggers)[id]; + if (t) + delete t; + } +#endif + } +} + +DnnTrigger* +DnnEventIntSelector :: UseTrigger (int id) +{ + if (!Triggers && MaxSize) { + Triggers = new CcuArrayOf (MaxSize, 0); + } + + /* no need to check bounds: CcuArray does it */ + DnnTrigger** t = *Triggers + id; + if (*t == 0) { + *t = new DnnTrigger; + } + + return *t; +} + + +void +DnnEventIntSelector :: UnuseTrigger (int id, DnnBaseReaction* r) +{ + DnnTrigger** t; + if (!Triggers || !(t = *Triggers + id)) + return; + + r->UnsubscribeTo (**t); + if ((*t)->IsUnused ()) { + delete *t; + *t = 0; + } +} + +DnnTrigger* +DnnEventIntSelector :: FindTrigger (DnnEvent* ev) +{ + DnnTrigger* t = 0; + int id = (IdExtractor) (ev); + if (Triggers) + t = (*Triggers) [id]; + return t; +} + + +DnnEventPtrSelector :: DnnEventPtrSelector (DnnPtrExtractor exid, int sz) +: DnnEventSelector (), + PtrExtractor (exid), + TblSize (sz), + Triggers (0) +{ +} + +DnnEventPtrSelector :: ~DnnEventPtrSelector () +{ + if (Triggers) { + int id = 0; +#ifdef FIXME +#endif + } +} + +DnnTrigger* +DnnEventPtrSelector :: UseTrigger (void* id) +{ + if (!Triggers && TblSize) { + Triggers = new CcuHashTableOf (TblSize); + } + + int found; + CcuHashCellOf* c = Triggers->Add (id, &found); + DnnTrigger* t; + if (found) + t = c->GetInfo (); + else + c->SetInfo (t = new DnnTrigger); + return t; +} + + +void +DnnEventPtrSelector :: UnuseTrigger (void* id, DnnBaseReaction* r) +{ + CcuHashCellOf* c; + if (!Triggers || !(c = Triggers->Get (id))) + return; + + DnnTrigger* t = c->GetInfo (); + r->UnsubscribeTo (*t); + if (t->IsUnused ()) { + delete t; + /* not optimal : we already had the cell */ + Triggers->Remove (id); + } +} + +DnnTrigger* +DnnEventPtrSelector :: FindTrigger (DnnEvent* ev) +{ + DnnTrigger* t = 0; + CcuHashCellOf* c; + + void* id = (PtrExtractor) (ev); + + if (Triggers && (c = Triggers->Get (id))) + t = c->GetInfo (); + return t; +} + -- cgit v1.1