aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/bfc/depview.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/bfc/depview.h')
-rw-r--r--Src/Wasabi/bfc/depview.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/Src/Wasabi/bfc/depview.h b/Src/Wasabi/bfc/depview.h
new file mode 100644
index 00000000..d743764c
--- /dev/null
+++ b/Src/Wasabi/bfc/depview.h
@@ -0,0 +1,103 @@
+#ifndef _DEPVIEW_H
+#define _DEPVIEW_H
+
+#include <bfc/depend.h>
+#include <map>
+
+// this handles classes that use the getDependencyPtr() method instead of a
+// public cast
+
+template <class VT>
+class NOVTABLE DependentViewerTPtr : private DependentViewerI
+{
+protected:
+ DependentViewerTPtr(VT *first = NULL)
+ {
+ _addViewItem(first);
+ }
+
+ void viewer_addViewItem(VT *item) { _addViewItem(item); }
+ void viewer_delViewItem(VT *item) { _delViewItem(item); }
+ using DependentViewerI::viewer_delAllItems;
+
+ VT *viewer_enumViewItem(int which)
+ {
+ return lookup(DependentViewerI::viewer_enumViewItem(which));
+ }
+ using DependentViewerI::viewer_getNumItems;
+ int viewer_haveItem(VT *item)
+ {
+ return DependentViewerI::viewer_haveItem(item->getDependencyPtr());
+ }
+
+ // item you were looking at is gone: WARNING: pointer no longer valid!
+ virtual int viewer_onItemDeleted(VT *item) { return 1; }
+ // item you are looking at issuing an event
+ virtual int viewer_onEvent(VT *item, int event, intptr_t param2, void *ptr, size_t ptrlen) { return 1; }
+
+protected:
+ virtual int viewer_onItemDeleted(ifc_dependent *item)
+ {
+ return viewer_onItemDeleted(lookup(item));
+ }
+ virtual int viewer_onEvent(ifc_dependent *item, const GUID *classguid, int event, intptr_t param, void *ptr, size_t ptrlen)
+ {
+ if (*classguid != *VT::depend_getClassGuid()) return 0; // filter namespace
+ return viewer_onEvent(lookup(item), event, param, ptr, ptrlen);
+ }
+
+private:
+ VT *lookup(ifc_dependent *d)
+ {
+ if (d == NULL)
+ return NULL;
+
+ VT *vt = NULL;
+ //int r = ptrmap.getItem(d, &vt);
+ auto it = ptrmap.find(d);
+ if (it != ptrmap.end())
+ {
+ vt = it->second;
+ }
+
+ //ASSERT(r);
+ ASSERT(vt->getDependencyPtr() == d);
+ return vt;
+ }
+ void _addViewItem(VT *item)
+ {
+ if (item == NULL)
+ return ;
+ ifc_dependent *d = item->getDependencyPtr();
+ if (d == NULL)
+ return ;
+
+ ptrmap.insert({ d, item });
+
+ DependentViewerI::viewer_addViewItem(d);
+ }
+ void _delViewItem(VT *item)
+ {
+ if (item == NULL) return ;
+ ifc_dependent *dep = NULL;
+
+ //ptrmap.reverseGetItem(item, &dep);
+ //int r = ptrmap.reverseDelItem(item);
+ for (auto &ptr : ptrmap)
+ {
+ if (ptr.second == item)
+ {
+ dep = ptr.first;
+ ptrmap.erase(dep);
+ break;
+ }
+ }
+
+ //ASSERT(r);
+ DependentViewerI::viewer_delViewItem(dep);
+ }
+
+ std::map<ifc_dependent *, VT *> ptrmap;
+};
+
+#endif