summaryrefslogtreecommitdiff
path: root/dnn/Source.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dnn/Source.cc')
-rwxr-xr-xdnn/Source.cc171
1 files changed, 171 insertions, 0 deletions
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<DnnTrigger> (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<DnnTrigger> (TblSize);
+ }
+
+ int found;
+ CcuHashCellOf<DnnTrigger>* 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<DnnTrigger>* 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<DnnTrigger>* c;
+
+ void* id = (PtrExtractor) (ev);
+
+ if (Triggers && (c = Triggers->Get (id)))
+ t = c->GetInfo ();
+ return t;
+}
+