Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5363
Modified Files:
Tag: desiredata
m_pd.h desire.h kernel.c desire.c s_main.c
Log Message:
t_hash becomes a class template
Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.4.4.11.2.33.2.66
retrieving revision 1.4.4.11.2.33.2.67
diff -C2 -d -r1.4.4.11.2.33.2.66 -r1.4.4.11.2.33.2.67
*** m_pd.h 31 Jul 2007 00:42:34 -0000 1.4.4.11.2.33.2.66
--- m_pd.h 31 Jul 2007 01:20:29 -0000 1.4.4.11.2.33.2.67
***************
*** 12,15 ****
--- 12,82 ----
#if defined(_LANGUAGE_C_PLUS_PLUS) || defined(__cplusplus)
#include <iostream>
+
+ #ifdef __cplusplus
+ template <class K, class V> class t_hash /* : t_pd */ {
+ struct entry {
+ K k;
+ V v;
+ struct entry *next;
+ };
+ long capa;
+ long n;
+ entry **tab;
+ /* when iterating: */
+ long i;
+ entry *m_next;
+ public:
+ t_hash(long capa_) : capa(capa_), n(0), i(0) {
+ tab = new entry *[capa];
+ for (long j=0; j<capa; j++) tab[j]=0;
+ }
+ ~t_hash() {delete[] tab;}
+ size_t size() {return n;}
+ V get(K k) {
+ long h = hash(k);
+ for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) return e->v;}
+ return 0;
+ }
+ void set(K k, V v) {
+ long h = hash(k);
+ for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) {e->v=v; return;}}
+ entry *nu = new entry; nu->k=k; nu->v=v; nu->next=tab[h];
+ n++;
+ tab[h] = nu;
+ }
+ V del(K k) {
+ long h = hash(k);
+ for (entry **ep=&tab[h]; *ep; ep=&(*ep)->next) {
+ if ((*ep)->k==k) {
+ V v=(*ep)->v;
+ entry *next=(*ep)->next;
+ delete *ep; n--;
+ *ep = next;
+ return v;
+ }
+ }
+ return 0;
+ }
+ int exists(K k) {
+ long h = hash(k);
+ for (entry *e=tab[h]; e; e=e->next) {if (e->k==k) return 1;}
+ return 0;
+ }
+ void start() {i=0; m_next=0;}
+ int next(K *kp, V *vp) {
+ while (!m_next && i<capa) m_next = tab[i++];
+ if (m_next) {
+ *kp = m_next->k;
+ *vp = m_next->v;
+ m_next = m_next->next;
+ return 1;
+ }
+ return 0;
+ }
+ #define hash_foreach(k,v,h) for (h->start(); h->next(&k,&v); )
+ long hash(K k) {return (((long)k*0x54321) & 0x7FFFFFFF)%capa;}
+ };
+ #endif
+
extern "C" {
#endif
***************
*** 176,248 ****
} t_atom;
! typedef void *hashkey;
! typedef void *hashvalue;
!
! #ifdef __cplusplus
! struct t_hashentry {
! hashkey k;
! hashvalue v;
! struct t_hashentry *next;
! };
!
! class t_hash /* : t_pd */ {
! long capa;
! long n;
! t_hashentry **tab;
! /* when iterating: */
! long i;
! t_hashentry *m_next;
! public:
! t_hash(long capa_) : capa(capa_), n(0), i(0) {
! tab = new t_hashentry *[capa];
! for (long j=0; j<capa; j++) tab[j]=0;
! }
! ~t_hash() {delete[] tab;}
! size_t size() {return n;}
! hashvalue get(hashkey k) {
! long h = hash(k);
! for (t_hashentry *e=tab[h]; e; e=e->next) {if (e->k==k) return e->v;}
! return 0;
! }
! void set(hashkey k, hashvalue v) {
! long h = hash(k);
! for (t_hashentry *e=tab[h]; e; e=e->next) {if (e->k==k) {e->v=v; return;}}
! t_hashentry *nu = new t_hashentry; nu->k=k; nu->v=v; nu->next=tab[h];
! n++;
! tab[h] = nu;
! }
! hashvalue del(hashkey k) {
! long h = hash(k);
! for (t_hashentry **ep=&tab[h]; *ep; ep=&(*ep)->next) {
! if ((*ep)->k==k) {
! hashvalue v=(*ep)->v;
! t_hashentry *next=(*ep)->next;
! delete *ep; n--;
! *ep = next;
! return v;
! }
! }
! return 0;
! }
! int exists(hashkey k) {
! long h = hash(k);
! for (t_hashentry *e=tab[h]; e; e=e->next) {if (e->k==k) return 1;}
! return 0;
! }
! void start() {i=0; m_next=0;}
! int next(hashkey *kp, hashvalue *vp) {
! while (!m_next && i<capa) m_next = tab[i++];
! if (m_next) {
! *kp = m_next->k;
! *vp = m_next->v;
! m_next = m_next->next;
! return 1;
! }
! return 0;
! }
! #define hash_foreach(k,v,h) for (h->start(); h->next(&k,&v); )
! long hash(hashkey k) {return (((long)k*0x54321) & 0x7FFFFFFF)%capa;}
! };
! #endif
/* t_appendix is made of the things that logically ought to be in t_gobj but have been put in a
--- 243,247 ----
} t_atom;
! struct t_arglist {long c; t_atom v[0];};
/* t_appendix is made of the things that logically ought to be in t_gobj but have been put in a
***************
*** 257,261 ****
/* miscellaneous */
#ifdef __cplusplus
! t_hash *visual;
#else
void *visual;
--- 256,260 ----
/* miscellaneous */
#ifdef __cplusplus
! t_hash<t_symbol *, t_arglist *> *visual;
#else
void *visual;
Index: desire.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/desire.h,v
retrieving revision 1.1.2.49.2.37
retrieving revision 1.1.2.49.2.38
diff -C2 -d -r1.1.2.49.2.37 -r1.1.2.49.2.38
*** desire.h 30 Jul 2007 16:33:43 -0000 1.1.2.49.2.37
--- desire.h 31 Jul 2007 01:20:29 -0000 1.1.2.49.2.38
***************
*** 305,309 ****
char* inlet_tip(t_inlet* i,int num);
! EXTERN t_hash *object_table;
/* some kernel.c stuff that wasn't in any header, when shifting to C++. */
--- 305,310 ----
char* inlet_tip(t_inlet* i,int num);
! extern t_hash<t_pd *,long> *object_table;
! extern t_hash<t_symbol *,t_class *> *class_table;
/* some kernel.c stuff that wasn't in any header, when shifting to C++. */
Index: kernel.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/kernel.c,v
retrieving revision 1.1.2.75
retrieving revision 1.1.2.76
diff -C2 -d -r1.1.2.75 -r1.1.2.76
*** kernel.c 31 Jul 2007 00:42:34 -0000 1.1.2.75
--- kernel.c 31 Jul 2007 01:20:29 -0000 1.1.2.76
***************
*** 204,208 ****
/* in which the value has bit 0 set if the key object is not a zombie,
and has bit 1 set if the object has been uploaded to the client */
! t_hash *object_table;
t_pd *pd_new(t_class *c) {
--- 204,208 ----
/* in which the value has bit 0 set if the key object is not a zombie,
and has bit 1 set if the object has been uploaded to the client */
! t_hash<t_pd *,long> *object_table;
t_pd *pd_new(t_class *c) {
***************
*** 210,214 ****
t_pd *x = (t_pd *)getbytes(c->size);
x->_class = c;
! object_table->set(x,(void*)1);
if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x);
if (c->patchable) {
--- 210,214 ----
t_pd *x = (t_pd *)getbytes(c->size);
x->_class = c;
! object_table->set(x,1);
if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x);
if (c->patchable) {
***************
*** 238,242 ****
if (c->gobj && ((long)object_table->get(x)|2)) {
gobj_changed((t_gobj *)x,"");
! object_table->set(x,(void *)((long)object_table->get(x)&~1));
} else pd_free_zombie(x);
}
--- 238,242 ----
if (c->gobj && ((long)object_table->get(x)|2)) {
gobj_changed((t_gobj *)x,"");
! object_table->set(x,object_table->get(x)&~1);
} else pd_free_zombie(x);
}
***************
*** 862,866 ****
#endif
! t_hash *class_table=0;
static t_symbol *class_loadsym; /* name under which an extern is invoked */
static void pd_defaultfloat(t_pd *x, t_float f);
--- 862,866 ----
#endif
! t_hash<t_symbol *, t_class *> *class_table=0;
static t_symbol *class_loadsym; /* name under which an extern is invoked */
static void pd_defaultfloat(t_pd *x, t_float f);
***************
*** 2349,2353 ****
void garray_init();
void pd_init() {
! object_table = new t_hash(127);
bindlist_class = class_new(gensym("bindlist"), 0, 0, sizeof(t_bindlist), CLASS_PD, 0);
class_addbang(bindlist_class, (t_method)bindlist_bang);
--- 2349,2353 ----
void garray_init();
void pd_init() {
! object_table = new t_hash<t_pd *,long>(127);
bindlist_class = class_new(gensym("bindlist"), 0, 0, sizeof(t_bindlist), CLASS_PD, 0);
class_addbang(bindlist_class, (t_method)bindlist_bang);
Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.7.4.17.2.22.2.29
retrieving revision 1.7.4.17.2.22.2.30
diff -C2 -d -r1.7.4.17.2.22.2.29 -r1.7.4.17.2.22.2.30
*** s_main.c 30 Jul 2007 20:16:34 -0000 1.7.4.17.2.22.2.29
--- s_main.c 31 Jul 2007 01:20:32 -0000 1.7.4.17.2.22.2.30
***************
*** 114,123 ****
static void sys_afterargparse();
- EXTERN t_hash *class_table;
-
/* this is called from main() in s_entry.c */
extern "C" int sys_main(int argc, char **argv) {
int noprefs = 0, i;
! class_table = new t_hash(127);
/* jsarlo { */
sys_externalschedlib = 0;
--- 114,121 ----
static void sys_afterargparse();
/* this is called from main() in s_entry.c */
extern "C" int sys_main(int argc, char **argv) {
int noprefs = 0, i;
! class_table = new t_hash<t_symbol*,t_class*>(127);
/* jsarlo { */
sys_externalschedlib = 0;
Index: desire.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/desire.c,v
retrieving revision 1.1.2.217.2.177
retrieving revision 1.1.2.217.2.178
diff -C2 -d -r1.1.2.217.2.177 -r1.1.2.217.2.178
*** desire.c 30 Jul 2007 19:56:26 -0000 1.1.2.217.2.177
--- desire.c 31 Jul 2007 01:20:29 -0000 1.1.2.217.2.178
***************
*** 71,79 ****
// externals compiled for PureMSP.
! struct t_arglist {
! long c;
! long dummy;
! t_atom v[0];
! };
t_appendix *appendix_new (t_gobj *master) {
--- 71,75 ----
// externals compiled for PureMSP.
! typedef t_hash<t_symbol *, t_arglist *> t_visual;
t_appendix *appendix_new (t_gobj *master) {
***************
*** 84,97 ****
self->nobs = 0;
self->obs = 0;
! self->visual = new t_hash(1);
return self;
}
void appendix_save (t_gobj *master, t_binbuf *b) {
! t_hash *h = master->dix->visual;
//fprintf(stderr,"appendix_save %p size=%ld\n",master,hash_size(h));
if (h->size()) {
! hashkey k;
! hashvalue v;
int i=0;
binbuf_addv(b,"t","#V");
--- 80,93 ----
self->nobs = 0;
self->obs = 0;
! self->visual = new t_visual(1);
return self;
}
void appendix_save (t_gobj *master, t_binbuf *b) {
! t_visual *h = master->dix->visual;
//fprintf(stderr,"appendix_save %p size=%ld\n",master,hash_size(h));
if (h->size()) {
! t_symbol *k;
! t_arglist *v;
int i=0;
binbuf_addv(b,"t","#V");
***************
*** 109,116 ****
void appendix_free (t_gobj *master) {
t_appendix *self = master->dix;
! hashkey k;
! hashvalue v;
if (self->visual) {
! hash_foreach(k,v,self->visual) {free(v);}
delete self->visual;
}
--- 105,112 ----
void appendix_free (t_gobj *master) {
t_appendix *self = master->dix;
! t_symbol *k;
! t_arglist *v;
if (self->visual) {
! hash_foreach(k,v,self->visual) free(v);
delete self->visual;
}
***************
*** 264,272 ****
// update manager:
struct t_manager : t_text {
t_queue *q;
t_clock *clock;
t_binbuf *b; /* reusable, for processing messages from the gui */
! t_hash *dirty;
};
--- 260,275 ----
// update manager:
+ struct t_dirtyentry {
+ t_symbol *a[4];
+ t_dirtyentry() {a[0]=a[1]=a[2]=a[3]=0;}
+ };
+
+ typedef t_hash <t_gobj *, t_dirtyentry *> t_dirtyset;
+
struct t_manager : t_text {
t_queue *q;
t_clock *clock;
t_binbuf *b; /* reusable, for processing messages from the gui */
! t_dirtyset *dirty;
};
***************
*** 307,311 ****
self->b = binbuf_new();
clock_delay(self->clock,0);
! self->dirty = new t_hash(127);
return self;
}
--- 310,314 ----
self->b = binbuf_new();
clock_delay(self->clock,0);
! self->dirty = new t_dirtyset(127);
return self;
}
***************
*** 377,381 ****
}
! void glob_setfilename(void *dummy, t_symbol *filesym, t_symbol *dirsym) {
canvas_newfilename = filesym;
canvas_newdirectory = dirsym;
--- 380,384 ----
}
! void glob_setfilename(void *self, t_symbol *filesym, t_symbol *dirsym) {
canvas_newfilename = filesym;
canvas_newdirectory = dirsym;
***************
*** 494,498 ****
/* make a new canvas. It will either be a "root" canvas or else it appears as
a "text" object in another window (canvas_getcurrent() tells us which.) */
! static t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv) {
t_canvas *x = canvas_new2();
t_canvas *owner = canvas_getcurrent();
--- 497,501 ----
/* make a new canvas. It will either be a "root" canvas or else it appears as
a "text" object in another window (canvas_getcurrent() tells us which.) */
! static t_canvas *canvas_new(void *self, t_symbol *sel, int argc, t_atom *argv) {
t_canvas *x = canvas_new2();
t_canvas *owner = canvas_getcurrent();
***************
*** 961,965 ****
}
! extern "C" void glob_dsp(void *dummy, t_symbol *s, int argc, t_atom *argv) {
if (argc) {
int newstate = atom_getintarg(0, argc, argv);
--- 964,968 ----
}
! extern "C" void glob_dsp(void *self, t_symbol *s, int argc, t_atom *argv) {
if (argc) {
int newstate = atom_getintarg(0, argc, argv);
***************
*** 6041,6045 ****
}
if (object_table->exists(self)) {
! object_table->set(self,(void *)((long)object_table->get(self)|2)); /* has been uploaded */
} else post("object_table is broken");
}
--- 6044,6048 ----
}
if (object_table->exists(self)) {
! object_table->set(self,object_table->get(self)|2); /* has been uploaded */
} else post("object_table is broken");
}
***************
*** 6941,6945 ****
//printf("#V reading '%s':\n",s->name);
if (!newest) {error("#V: there is no newest object\n"); return;}
! t_hash *h = ((t_gobj *)newest)->dix->visual;
if (h->exists(s)) {
//printf("'%s' exists, deleting\n",s->name);
--- 6944,6948 ----
//printf("#V reading '%s':\n",s->name);
if (!newest) {error("#V: there is no newest object\n"); return;}
! t_visual *h = ((t_gobj *)newest)->dix->visual;
if (h->exists(s)) {
//printf("'%s' exists, deleting\n",s->name);
***************
*** 6977,6983 ****
}
- EXTERN t_hash *class_table;
extern "C" void glob_update_class_list (t_pd *self, t_symbol *cb_recv, t_symbol *cb_sel) {
! hashkey k; hashvalue v;
sys_gui("global class_list; set class_list {");
hash_foreach(k,v,class_table) sys_vgui("%s ", ((t_symbol *)k)->name);
--- 6980,6985 ----
}
extern "C" void glob_update_class_list (t_pd *self, t_symbol *cb_recv, t_symbol *cb_sel) {
! t_symbol *k; t_class *v;
sys_gui("global class_list; set class_list {");
hash_foreach(k,v,class_table) sys_vgui("%s ", ((t_symbol *)k)->name);
***************
*** 7258,7268 ****
/* tb } */
- extern t_hash *object_table;
-
static void glob_object_table() {
t_symbol *s_inlet = gensym("inlet");
t_symbol *s___list = gensym("__list");
size_t inlets=0, lists=0, zombies=0;
! hashkey k; hashvalue v;
post("object_table = {");
hash_foreach(k,v,object_table) {
--- 7260,7268 ----
/* tb } */
static void glob_object_table() {
t_symbol *s_inlet = gensym("inlet");
t_symbol *s___list = gensym("__list");
size_t inlets=0, lists=0, zombies=0;
! t_pd *k; long v;
post("object_table = {");
hash_foreach(k,v,object_table) {