From 97926eb08cf74f277e522ffb8c7f985457822de3 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Tue, 11 Feb 2003 04:37:35 +0000 Subject: "" svn path=/trunk/; revision=388 --- externals/grill/pool/pool.h | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'externals/grill/pool/pool.h') diff --git a/externals/grill/pool/pool.h b/externals/grill/pool/pool.h index 2fdbbd28..59195555 100644 --- a/externals/grill/pool/pool.h +++ b/externals/grill/pool/pool.h @@ -15,14 +15,15 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) -#error You need at least flext version 0.4.1 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 402) +#error You need at least flext version 0.4.2 #endif #include typedef void V; typedef int I; +typedef unsigned long UL; typedef float F; typedef char C; typedef bool BL; @@ -48,10 +49,12 @@ class pooldir: public flext { public: - pooldir(const A &dir,pooldir *parent); + pooldir(const A &dir,pooldir *parent,I vcnt = 0,I dcnt = 0); ~pooldir(); V Clear(BL rec,BL dironly = false); + V Reset(BL realloc = true); + BL Empty() const { return !dirs && !vals; } BL HasDirs() const { return dirs != NULL; } BL HasVals() const { return vals != NULL; } @@ -60,16 +63,17 @@ public: pooldir *GetDir(const AtomList &d,BL cut = false) { return GetDir(d.Count(),d.Atoms(),cut); } BL DelDir(I argc,const A *argv); BL DelDir(const AtomList &d) { return DelDir(d.Count(),d.Atoms()); } - pooldir *AddDir(I argc,const A *argv); - pooldir *AddDir(const AtomList &d) { return AddDir(d.Count(),d.Atoms()); } + pooldir *AddDir(I argc,const A *argv,I vcnt = 0,I dcnt = 0); + pooldir *AddDir(const AtomList &d,I vcnt = 0,I dcnt = 0) { return AddDir(d.Count(),d.Atoms(),vcnt,dcnt); } V SetVal(const A &key,AtomList *data,BL over = true); V ClrVal(const A &key) { SetVal(key,NULL); } AtomList *PeekVal(const A &key); AtomList *GetVal(const A &key,BL cut = false); - I CntAll(); + I CntAll() const; I GetAll(A *&keys,AtomList *&lst,BL cut = false); I GetKeys(AtomList &keys); + I CntSub() const; I GetSub(const A **&dirs); poolval *RefVal(const A &key); @@ -79,27 +83,42 @@ public: BL Copy(pooldir *p,I depth,BL cur); BL LdDir(istream &is,I depth,BL mkdir); + BL LdDirXML(istream &is,I depth,BL mkdir); BL SvDir(ostream &os,I depth,const AtomList &dir = AtomList()); + BL SvDirXML(ostream &os,I depth,const AtomList &dir = AtomList()); + + int VSize() const { return vsize; } + int DSize() const { return dsize; } + +protected: + int VIdx(const A &v) const { return FoldBits(AtomHash(v),vbits); } + int DIdx(const A &d) const { return FoldBits(AtomHash(d),dbits); } A dir; pooldir *nxt; - pooldir *parent,*dirs; - poolval *vals; + pooldir *parent; + const I vbits,dbits,vsize,dsize; + + struct valentry { int cnt; poolval *v; }; + struct direntry { int cnt; pooldir *d; }; + + valentry *vals; + direntry *dirs; }; class pooldata: public flext { public: - pooldata(const S *s = NULL); + pooldata(const S *s = NULL,I vcnt = 0,I dcnt = 0); ~pooldata(); V Push() { ++refs; } BL Pop() { return --refs > 0; } V Reset(); - BL MkDir(const AtomList &d); + BL MkDir(const AtomList &d,I vcnt = 0,I dcnt = 0); BL ChkDir(const AtomList &d); BL RmDir(const AtomList &d); @@ -112,6 +131,7 @@ public: poolval *Refi(const AtomList &d,I ix); I CntAll(const AtomList &d); I GetAll(const AtomList &d,A *&keys,AtomList *&lst); + I CntSub(const AtomList &d); I GetSub(const AtomList &d,const t_atom **&dirs); BL Paste(const AtomList &d,const pooldir *clip,I depth = -1,BL repl = true,BL mkdir = true); @@ -122,6 +142,10 @@ public: BL SvDir(const AtomList &d,const C *flnm,I depth,BL absdir); BL Load(const C *flnm) { return LdDir(AtomList(),flnm,-1); } BL Save(const C *flnm) { return SvDir(AtomList(),flnm,-1,true); } + BL LdDirXML(const AtomList &d,const C *flnm,I depth,BL mkdir = true); + BL SvDirXML(const AtomList &d,const C *flnm,I depth,BL absdir); + BL LoadXML(const C *flnm) { return LdDirXML(AtomList(),flnm,-1); } + BL SaveXML(const C *flnm) { return SvDirXML(AtomList(),flnm,-1,true); } I refs; const S *sym; -- cgit v1.2.1