[PD-cvs] pd/src desire.c, 1.1.2.217.2.176, 1.1.2.217.2.177 kernel.c, 1.1.2.72, 1.1.2.73 s_main.c, 1.7.4.17.2.22.2.27, 1.7.4.17.2.22.2.28 m_pd.h, 1.4.4.11.2.33.2.63, 1.4.4.11.2.33.2.64

Mathieu Bouchard matju at users.sourceforge.net
Mon Jul 30 21:56:32 CEST 2007


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9582

Modified Files:
      Tag: desiredata
	desire.c kernel.c s_main.c m_pd.h 
Log Message:
t_hash interface is now a C++ class


Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.4.4.11.2.33.2.63
retrieving revision 1.4.4.11.2.33.2.64
diff -C2 -d -r1.4.4.11.2.33.2.63 -r1.4.4.11.2.33.2.64
*** m_pd.h	30 Jul 2007 19:12:45 -0000	1.4.4.11.2.33.2.63
--- m_pd.h	30 Jul 2007 19:56:29 -0000	1.4.4.11.2.33.2.64
***************
*** 182,209 ****
  	hashkey k;
  	hashvalue v;
! 	t_hashentry *next;
  };
  
! struct t_hash : t_pd {
  	long capa;
! 	long size;
  	t_hashentry **tab;
  /* when iterating: */
  	long i;
! 	t_hashentry *next;
  };
! 
! typedef void (*hash_iter)(void *data, hashkey k, hashvalue v);
! t_hash *hash_new(long capa);
! void hash_free(t_hash *self);
! long hash_size(t_hash *self);
! void hash_start(t_hash *self);
! int  hash_next(t_hash *self, hashkey *kp, hashvalue *vp);
! #define hash_foreach(k,v,h) for (hash_start(h); hash_next(h,&k,&v); )
! 
! hashvalue hash_get(t_hash *self, hashkey k);
! void      hash_set(t_hash *self, hashkey k, hashvalue v);
! hashvalue hash_delete(t_hash *self, hashkey k);
! int       hash_exists(t_hash *self, hashkey k); /* check if a key exists */
  
  /* t_appendix is made of the things that logically ought to be in t_gobj but have been put in a
--- 182,210 ----
  	hashkey k;
  	hashvalue v;
! 	struct t_hashentry *next;
  };
  
! #ifdef __cplusplus
! 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);
! 	~t_hash();
! 	size_t size() {return n;}
! 	hashvalue get(hashkey k);
! 	void      set(hashkey k, hashvalue v);
! 	hashvalue del(hashkey k);
! 	int       exists(hashkey k); /* check if a key exists */
! 	void start();
! 	int  next(hashkey *kp, hashvalue *vp);
! 	#define hash_foreach(k,v,h) for (h->start(); h->next(&k,&v); )
! 	long t_hash::hash(hashkey k);
  };
! #endif
  
  /* t_appendix is made of the things that logically ought to be in t_gobj but have been put in a
***************
*** 217,221 ****
--- 218,226 ----
  	struct _gobj **obs; /* I spy with my little I */
  /* miscellaneous */
+ #ifdef __cplusplus
  	t_hash *visual;
+ #else
+ 	void *visual;
+ #endif
  } t_appendix;
  t_appendix *appendix_new (struct _gobj *master);

Index: kernel.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/kernel.c,v
retrieving revision 1.1.2.72
retrieving revision 1.1.2.73
diff -C2 -d -r1.1.2.72 -r1.1.2.73
*** kernel.c	30 Jul 2007 19:12:45 -0000	1.1.2.72
--- kernel.c	30 Jul 2007 19:56:29 -0000	1.1.2.73
***************
*** 108,136 ****
  t_class *hash_class;
  
! t_hash *hash_new(long capa) {
! 	t_hash *self = (t_hash *)malloc(sizeof(t_hash));
! /*	t_hash *self = (t_hash *)pd_new(hash_class);*/
! 	self->capa = capa;
! 	self->size = 0;
! 	self->i = 0;
! 	self->tab = (t_hashentry **)malloc(capa*sizeof(void*));
! 	for (long i=0; i<capa; i++) self->tab[i]=0;
! 	return self;
  }
  
! void hash_free(t_hash *self) {
! 	free(self->tab);
! 	free(self);
  }
  
! long hash_size(t_hash *self) {return self->size;}
! void hash_start(t_hash *self) {self->i=0; self->next=0;}
! int  hash_next(t_hash *self, hashkey *kp, hashvalue *vp) {
! 	while (!self->next && self->i<self->capa) self->next = self->tab[self->i++];
! //	printf("hash_next found in bin %ld\n",self->i-1);
! 	if (self->next) {
! 		*kp = self->next->k;
! 		*vp = self->next->v;
! 		self->next = self->next->next;
  		return 1;
  	}
--- 108,130 ----
  t_class *hash_class;
  
! t_hash::t_hash(long capa_) {
! 	capa = capa_;
! 	n=0;
! 	i=0;
! 	tab = (t_hashentry **)malloc(capa*sizeof(void*));
! 	for (long j=0; j<capa; j++) tab[j]=0;
  }
  
! t_hash::~t_hash() {
! 	free(tab);
  }
  
! void t_hash::start() {i=0; m_next=0;}
! int  t_hash::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;
  	}
***************
*** 138,177 ****
  }
  
! static long hash_hash(t_hash *self, hashkey k) {
  	long h = ((long)k*0x54321) & 0x7FFFFFFF;
! 	return h%self->capa;
  }
  
! int hash_exists(t_hash *self, hashkey k) {
! 	long h = hash_hash(self,k);
! 	for (t_hashentry *e=self->tab[h]; e; e=e->next) {if (e->k==k) return 1;}
  	return 0;
  }
! hashvalue hash_get(t_hash *self, hashkey k) {
! 	long h = hash_hash(self,k);
! 	for (t_hashentry *e=self->tab[h]; e; e=e->next) {if (e->k==k) return e->v;}
  	return 0;
  }
  
! void hash_set(t_hash *self, hashkey k, hashvalue v) {
! 	long h = hash_hash(self,k);
  	t_hashentry *nu;
! //	fprintf(stderr,"hash_set %p %s %p\n",self,((t_symbol*)k)->name,v);
! 	for (t_hashentry *e=self->tab[h]; e; e=e->next) {if (e->k==k) {e->v=v; return;}}
  	nu = (t_hashentry *)malloc(sizeof(t_hashentry));
! 	self->size++;
  	nu->k=k;
  	nu->v=v;
! 	nu->next=self->tab[h];
! 	self->tab[h] = nu;
  }
  
! hashvalue hash_delete(t_hash *self, hashkey k) {
! 	long h = hash_hash(self,k);
! 	for (t_hashentry **ep=&self->tab[h]; *ep; ep=&(*ep)->next) {
  		if ((*ep)->k==k) {
  			hashvalue v=(*ep)->v;
  			t_hashentry *next=(*ep)->next;
! 			free(*ep); self->size--;
  			*ep = next;
  			return v;
--- 132,170 ----
  }
  
! long t_hash::hash(hashkey k) {
  	long h = ((long)k*0x54321) & 0x7FFFFFFF;
! 	return h%capa;
  }
  
! int t_hash::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;
  }
! hashvalue t_hash::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 t_hash::set(hashkey k, hashvalue v) {
! 	long h = hash(k);
  	t_hashentry *nu;
! 	for (t_hashentry *e=tab[h]; e; e=e->next) {if (e->k==k) {e->v=v; return;}}
  	nu = (t_hashentry *)malloc(sizeof(t_hashentry));
! 	n++;
  	nu->k=k;
  	nu->v=v;
! 	nu->next=tab[h];
! 	tab[h] = nu;
  }
  
! hashvalue t_hash::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;
! 			free(*ep); n--;
  			*ep = next;
  			return v;
***************
*** 183,187 ****
  /*extern "C"*/ void hash_setup () {
    hash_class = class_new(gensym("#V"), (t_newmethod)0 /*hash_new*/,
! 	(t_method)hash_free, sizeof(t_object), CLASS_PD, A_GIMME, 0);
  }
  
--- 176,180 ----
  /*extern "C"*/ void hash_setup () {
    hash_class = class_new(gensym("#V"), (t_newmethod)0 /*hash_new*/,
! 	0 /*(t_method)hash_free*/, sizeof(t_object), CLASS_PD, A_GIMME, 0);
  }
  
***************
*** 283,287 ****
      x->_class = c;
      //fprintf(stderr,"object_table = %p\n",object_table);
!     hash_set(object_table,x,(void*)1);
      if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x);
      if (c->patchable) {
--- 276,280 ----
      x->_class = c;
      //fprintf(stderr,"object_table = %p\n",object_table);
!     object_table->set(x,(void*)1);
      if (c->gobj) ((t_gobj *)x)->g_adix = appendix_new((t_gobj *)x);
      if (c->patchable) {
***************
*** 296,300 ****
  	if (c->gobj) appendix_free((t_gobj *)x);
  	if (c->size) free(x);
! 	hash_delete(object_table,x);
  }
  
--- 289,293 ----
  	if (c->gobj) appendix_free((t_gobj *)x);
  	if (c->size) free(x);
! 	object_table->del(x);
  }
  
***************
*** 309,315 ****
      }
      /* schedule for deletion if need to keep the allocation around */
!     if (c->gobj && ((long)hash_get(object_table,x)|2)) {
  	gobj_changed((t_gobj *)x,"");
! 	hash_set(object_table,x,(void *)((long)hash_get(object_table,x)&~1));
      } else pd_free_zombie(x);
  }
--- 302,308 ----
      }
      /* schedule for deletion if need to keep the allocation around */
!     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);
  }
***************
*** 1053,1057 ****
        class_addmethod2(pd_objectmaker._class, (t_method)newmethod, ss, sig);
  #endif
!     hash_set(class_table, c->name, c);
      return c;
  }
--- 1046,1050 ----
        class_addmethod2(pd_objectmaker._class, (t_method)newmethod, ss, sig);
  #endif
!     class_table->set(c->name, c);
      return c;
  }
***************
*** 1067,1071 ****
      class_addmethod2(pd_objectmaker._class, (t_method)newmethod, pd_library_name ? qualified_name(s)->name : ss, sig);
  #endif
!     hash_set(class_table,s,0);
  }
  
--- 1060,1064 ----
      class_addmethod2(pd_objectmaker._class, (t_method)newmethod, pd_library_name ? qualified_name(s)->name : ss, sig);
  #endif
!     class_table->set(s,0);
  }
  
***************
*** 1531,1535 ****
  /* only looks for already loaded classes though. */
  
! t_class *class_find (t_symbol *s) {return (t_class *)hash_get(class_table,s);}
  
  void glob_update_class_info (t_pd *bogus, t_symbol *s, t_symbol *cb_recv, t_symbol *cb_sel) {
--- 1524,1528 ----
  /* only looks for already loaded classes though. */
  
! t_class *class_find (t_symbol *s) {return (t_class *)class_table->get(s);}
  
  void glob_update_class_info (t_pd *bogus, t_symbol *s, t_symbol *cb_recv, t_symbol *cb_sel) {
***************
*** 1990,1994 ****
  		if (!sscanf(s->name,".x%lx",(long*)&target)) target=0;
  		if (target) {
! 			if (!hash_exists(object_table,target) || !hash_get(object_table,target)) {
  				error("%s target is not a currently valid pointer",s->name);
  				return;
--- 1983,1987 ----
  		if (!sscanf(s->name,".x%lx",(long*)&target)) target=0;
  		if (target) {
! 			if (!object_table->exists(target) || !object_table->get(target)) {
  				error("%s target is not a currently valid pointer",s->name);
  				return;
***************
*** 2422,2426 ****
  void garray_init();
  void pd_init() {
!     object_table = hash_new(127);
      //fprintf(stderr,"object_table = %p\n",object_table);
      bindlist_class = class_new(gensym("bindlist"), 0, 0, sizeof(t_bindlist), CLASS_PD, 0);
--- 2415,2419 ----
  void garray_init();
  void pd_init() {
!     object_table = new t_hash(127);
      //fprintf(stderr,"object_table = %p\n",object_table);
      bindlist_class = class_new(gensym("bindlist"), 0, 0, sizeof(t_bindlist), CLASS_PD, 0);

Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.7.4.17.2.22.2.27
retrieving revision 1.7.4.17.2.22.2.28
diff -C2 -d -r1.7.4.17.2.22.2.27 -r1.7.4.17.2.22.2.28
*** s_main.c	20 Jul 2007 05:40:50 -0000	1.7.4.17.2.22.2.27
--- s_main.c	30 Jul 2007 19:56:29 -0000	1.7.4.17.2.22.2.28
***************
*** 119,123 ****
  extern "C" int sys_main(int argc, char **argv) {
      int noprefs = 0, i;
!     class_table = hash_new(127);
      /* jsarlo { */
      sys_externalschedlib = 0;
--- 119,123 ----
  extern "C" int sys_main(int argc, char **argv) {
      int noprefs = 0, i;
!     class_table = new t_hash(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.176
retrieving revision 1.1.2.217.2.177
diff -C2 -d -r1.1.2.217.2.176 -r1.1.2.217.2.177
*** desire.c	30 Jul 2007 16:33:40 -0000	1.1.2.217.2.176
--- desire.c	30 Jul 2007 19:56:26 -0000	1.1.2.217.2.177
***************
*** 84,88 ****
  	self->nobs = 0;
  	self->obs = 0;
! 	self->visual = hash_new(1);
  	return self;
  }
--- 84,88 ----
  	self->nobs = 0;
  	self->obs = 0;
! 	self->visual = new t_hash(1);
  	return self;
  }
***************
*** 91,95 ****
  	t_hash *h = master->dix->visual;
  	//fprintf(stderr,"appendix_save %p size=%ld\n",master,hash_size(h));
! 	if (hash_size(h)) {
  	    hashkey k;
  	    hashvalue v;
--- 91,95 ----
  	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;
***************
*** 100,104 ****
  		binbuf_addv(b,"s",k);
  		binbuf_add(b,al->c,al->v);
! 		if (i+1==hash_size(h)) binbuf_addv(b, ";");
  		else binbuf_addv(b,"t",",");
  		i++;
--- 100,104 ----
  		binbuf_addv(b,"s",k);
  		binbuf_add(b,al->c,al->v);
! 		if (size_t(i+1)==h->size()) binbuf_addv(b, ";");
  		else binbuf_addv(b,"t",",");
  		i++;
***************
*** 113,117 ****
  	if (self->visual) {
  		hash_foreach(k,v,self->visual) {free(v);}
! 		hash_free(self->visual);
  	}
  	free(self);
--- 113,117 ----
  	if (self->visual) {
  		hash_foreach(k,v,self->visual) {free(v);}
! 		delete self->visual;
  	}
  	free(self);
***************
*** 284,290 ****
  			pd_free(o);
  		} else {
! 			if (hash_exists(self->dirty,o)) {
  				pd_upload(o);
! 				hash_delete(self->dirty,o);
  			}
  		}
--- 284,290 ----
  			pd_free(o);
  		} else {
! 			if (self->dirty->exists(o)) {
  				pd_upload(o);
! 				self->dirty->del(o);
  			}
  		}
***************
*** 295,301 ****
  void manager_notice (t_gobj *self_, t_gobj *origin, int argc, t_atom *argv) {
  	t_manager *self = (t_manager *)self_;
! 	if (!hash_exists(self->dirty,origin)) {
  		queue_put(self->q,origin);
! 		hash_set(self->dirty,origin,0);
  	}
  }
--- 295,301 ----
  void manager_notice (t_gobj *self_, t_gobj *origin, int argc, t_atom *argv) {
  	t_manager *self = (t_manager *)self_;
! 	if (!self->dirty->exists(origin)) {
  		queue_put(self->q,origin);
! 		self->dirty->set(origin,0);
  	}
  }
***************
*** 307,311 ****
  	self->b = binbuf_new();
  	clock_delay(self->clock,0);
! 	self->dirty = hash_new(127);
  	return self;
  }
--- 307,311 ----
  	self->b = binbuf_new();
  	clock_delay(self->clock,0);
! 	self->dirty = new t_hash(127);
  	return self;
  }
***************
*** 5662,5666 ****
  	t_text *o;
  	if (sscanf(s->name,"x%lx",(long*)&o)<1) {error("expected object-id"); return 0;}
! 	if (!hash_exists(object_table,o) || !(long)hash_get(object_table,o)&1) {
  		error("%s target is not a currently valid pointer",s->name);
  		return 0;
--- 5662,5666 ----
  	t_text *o;
  	if (sscanf(s->name,"x%lx",(long*)&o)<1) {error("expected object-id"); return 0;}
! 	if (!object_table->exists(o) || !(long)object_table->get(o)&1) {
  		error("%s target is not a currently valid pointer",s->name);
  		return 0;
***************
*** 5981,5985 ****
  
  void pd_upload(t_gobj *self) {
! 	long alive = (long)hash_get(object_table,self) & 1;
  	if (!alive) {
  		sys_mgui(self,"delete","");
--- 5981,5985 ----
  
  void pd_upload(t_gobj *self) {
! 	long alive = (long)object_table->get(self) & 1;
  	if (!alive) {
  		sys_mgui(self,"delete","");
***************
*** 6040,6045 ****
  		}
  	}
! 	if (hash_exists(object_table,self)) {
! 		hash_set(object_table,self,(void *)((long)hash_get(object_table,self)|2)); /* has been uploaded */
  	} else post("object_table is broken");
  }
--- 6040,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");
  }
***************
*** 6942,6950 ****
  		if (!newest) {error("#V: there is no newest object\n"); return;}
  		t_hash *h = ((t_gobj *)newest)->dix->visual;
! 		if (hash_exists(h,s)) {
  			//printf("'%s' exists, deleting\n",s->name);
! 			free(hash_get(h,s));
  		}
! 		hash_set(h,s,al);
  		//fprintf(stderr,"visualloader... %p %d\n",newest,hash_size(h));
  		j++;
--- 6942,6950 ----
  		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);
! 			free(h->get(s));
  		}
! 		h->set(s,al);
  		//fprintf(stderr,"visualloader... %p %d\n",newest,hash_size(h));
  		j++;
***************
*** 7281,7285 ****
  	}
  	post("} (%ld non-omitted objects, plus %ld [inlet], plus %ld [__list], plus %ld zombies)",
! 		hash_size(object_table)-inlets-lists-zombies,inlets,lists,zombies);
  }
  
--- 7281,7285 ----
  	}
  	post("} (%ld non-omitted objects, plus %ld [inlet], plus %ld [__list], plus %ld zombies)",
! 		object_table->size()-inlets-lists-zombies,inlets,lists,zombies);
  }
  





More information about the Pd-cvs mailing list