diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2004-10-30 03:59:01 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2004-10-30 03:59:01 +0000 |
commit | 3e1c082a5050a890eb05e81a5472f0c346600fb7 (patch) | |
tree | 115f5bb9c50ff2dab3b67bb0fbd70a1ea1c3df2f /externals/grill/pool/source/pool.cpp | |
parent | f0de7e1aa940335ba2130f9f318539e2432c44a1 (diff) |
better symbol handling
added seti, clri
name changes for svn repository
more inlined functions
svn path=/trunk/; revision=2191
Diffstat (limited to 'externals/grill/pool/source/pool.cpp')
-rw-r--r-- | externals/grill/pool/source/pool.cpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/externals/grill/pool/source/pool.cpp b/externals/grill/pool/source/pool.cpp index a4f0805e..815d76a9 100644 --- a/externals/grill/pool/source/pool.cpp +++ b/externals/grill/pool/source/pool.cpp @@ -191,7 +191,7 @@ BL pooldir::DelDir(I argc,const A *argv) V pooldir::SetVal(const A &key,AtomList *data,BL over) { - I c = 1,vix = VIdx(key); + I c = 1,vix = VIdx(key); poolval *prv = NULL,*ix = vals[vix].v; for(; ix; prv = ix,ix = ix->nxt) { c = compare(key,ix->key); @@ -228,6 +228,38 @@ V pooldir::SetVal(const A &key,AtomList *data,BL over) } } +BL pooldir::SetVali(I rix,AtomList *data) +{ + poolval *prv = NULL,*ix = NULL; + for(I vix = 0; vix < vsize; ++vix) + if(rix > vals[vix].cnt) rix -= vals[vix].cnt; + else { + ix = vals[vix].v; + for(; ix && rix; prv = ix,ix = ix->nxt) --rix; + if(ix && !rix) break; + } + + if(ix) { + // data exists... overwrite it + + if(data) + ix->Set(data); + else { + // delete key + + poolval *nv = ix->nxt; + if(prv) prv->nxt = nv; + else vals[vix].v = nv; + vals[vix].cnt--; + ix->nxt = NULL; + delete ix; + } + return true; + } + else + return false; +} + poolval *pooldir::RefVal(const A &key) { I c = 1,vix = VIdx(key); @@ -240,7 +272,6 @@ poolval *pooldir::RefVal(const A &key) return c || !ix?NULL:ix; } - poolval *pooldir::RefVali(I rix) { for(I vix = 0; vix < vsize; ++vix) |