aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/source/flbind.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2005-03-15 04:56:36 +0000
committerThomas Grill <xovo@users.sourceforge.net>2005-03-15 04:56:36 +0000
commit31a2d9dcc2b3a519033918e180f81c4e7b9f8e7e (patch)
tree7eae5d3f1e302843147fdc6bc13c99e101906d32 /externals/grill/flext/source/flbind.cpp
parent3e0446e7fda10c3d85a628b8c1effaa5bf7f5529 (diff)
new data type flext::AtomListStatic using pre-allocated space if possible
fixes for OSX replaced memory-intensive STL maps by custom-made vector/map-container fix for gcc strangeness no more static assignment of symbols (problems with Metrowerks) small fix for gcc fixed bugs in SIMD code for non-power-of-2 lengths fixes for attribute editor (to deal with large dialogs) svn path=/trunk/; revision=2628
Diffstat (limited to 'externals/grill/flext/source/flbind.cpp')
-rw-r--r--externals/grill/flext/source/flbind.cpp40
1 files changed, 33 insertions, 7 deletions
diff --git a/externals/grill/flext/source/flbind.cpp b/externals/grill/flext/source/flbind.cpp
index 5b0bfeac..ff84e4ea 100644
--- a/externals/grill/flext/source/flbind.cpp
+++ b/externals/grill/flext/source/flbind.cpp
@@ -144,13 +144,14 @@ bool flext_base::BindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbo
return true;
}
-
bool flext_base::UnbindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbol *s,int argc,t_atom *argv,void *data),void **data)
{
bool ok = false;
if(bindhead && bindhead->Contained(0)) {
ItemSet &set = bindhead->GetInlet();
+
+/*
ItemSet::iterator it1,it2;
if(sym) {
// specific tag
@@ -173,13 +174,37 @@ bool flext_base::UnbindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_sym
}
}
}
+*/
+ BindItem *item = NULL;
+ if(sym) {
+ // symbol is given
+ Item *it = set.find(sym);
+ if(fun) {
+ // check if function matches
+ for(; it && static_cast<BindItem *>(it)->fun != fun; it = it->nxt);
+ }
+ item = static_cast<BindItem *>(it);
+ }
+ else {
+ // take any entry that matches
+ for(ItemSet::iterator si(set); si && !item; ++si) {
+ for(Item *i = si.data(); i; i = i->nxt) {
+ BindItem *bit = (BindItem *)i;
+ if(!fun || bit->fun == fun) {
+ item = bit;
+ if(!sym) sym = si.key();
+ break;
+ }
+ }
+ }
+ }
- if(it) {
- if(data) *data = it->px->data;
- ok = bindhead->Remove(it,sym,0,false);
+ if(item) {
+ if(data) *data = item->px->data;
+ ok = bindhead->Remove(item,sym,0,false);
if(ok) {
- it->Unbind(sym);
- delete it;
+ item->Unbind(sym);
+ delete item;
}
}
}
@@ -207,7 +232,8 @@ bool flext_base::UnbindAll()
{
if(bindhead && bindhead->Contained(0)) {
ItemSet &set = bindhead->GetInlet();
- for(ItemSet::iterator si = set.begin(); si != set.end(); ++si) {
+// for(ItemSet::iterator si = set.begin(); si != set.end(); ++si) {
+ for(ItemSet::iterator si(set); si; ++si) {
Item *lst = si.data();
while(lst) {
Item *nxt = lst->nxt;