Browse Source

utvector utmm

Troy D. Hanson 10 years ago
parent
commit
d93c90bdbc

+ 1 - 1
opt/bundle/include/libut.h

@@ -3,11 +3,11 @@
 
 /* libut is a container around other sources */
 
+#include "utmm.h"
 #include "utvector.h"
 #include "utstring.h"
 #include "utarray.h"
 #include "uthash.h"
 #include "utlist.h"
 
-extern UT_vector_mm* utvector_utstring;
 #endif /* __LIBUT_H_ */

+ 4 - 0
opt/bundle/include/utmm.h

@@ -48,4 +48,8 @@ void utmm_fini(UT_mm *mm, char *buf, size_t n);
 void utmm_clear(UT_mm *mm, char *buf, size_t n);
 void utmm_copy(UT_mm *mm, char *dst, char *src, size_t n);
 
+/* convenient predefined mm */
+extern UT_mm* utmm_int;
+extern UT_mm* utstring_mm;
+
 #endif /* __UTMM_H_ */

+ 12 - 14
opt/bundle/include/utvector.h

@@ -35,27 +35,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef __UTVECTOR_H_
 #define __UTVECTOR_H_
 
-#include <stddef.h>
+#include "utmm.h"
 
-#define INITIAL_SIZE 16
-
-typedef struct _UT_vector_mm {
-   size_t sz;
-   void (*init)(void *buf, unsigned num);             //-> utstring-init
-   void (*fini)(void *buf, unsigned num);             //-> utstring-done
-   void (*copy)(void *dst, void *src, unsigned num);  //-> ustring_concat
-   void (*clear)(void *buf, unsigned num);            //-> utstring-clear
-} UT_vector_mm;
+/* typical usage e.g. a vector of utstring would have
+ *
+   .sz = sizeof(UT_string)
+   .init = utstring-init
+   .fini = utstring-done
+   .copy = ustring_concat
+   .clear= utstring-clear
+ */
 
 typedef struct _UT_vector {
-  UT_vector_mm mm;
+  UT_mm mm;
   unsigned i,n;/* i: index of next available slot, n: num slots */
   char *d;     /* n slots of size icd->sz*/
 } UT_vector;
 
 
-UT_vector *utvector_new(const UT_vector_mm *mm);
-void utvector_init(UT_vector *v, const UT_vector_mm *mm);
+UT_vector *utvector_new(const UT_mm *mm);
+void utvector_init(UT_vector *v, const UT_mm *mm);
 void utvector_reserve(UT_vector *v, unsigned num);
 void utvector_fini(UT_vector *v);
 UT_vector * utvector_clone(UT_vector *src);
@@ -72,6 +71,5 @@ void utvector_shift(UT_vector *v);
 void *utvector_push(UT_vector *v, void *e);
 unsigned utvector_len(UT_vector *v);
 
-extern UT_vector_mm* utvector_int;
 
 #endif /* __UTVECTOR_H_ */

+ 10 - 28
opt/bundle/src/libut.c

@@ -23,51 +23,33 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "libut.h"
 
-static void utstring_init_wrapper(void *_buf, unsigned num) {
+static void utstring_init_wrapper(void *_buf) {
   UT_string *buf = (UT_string*)_buf;
-  unsigned i;
-  for(i=0; i < num; i++) {
-    utstring_init(buf);
-    buf++;
-  }
+  utstring_init(buf);
 }
 
-static void utstring_done_wrapper(void *_buf, unsigned num) {
+static void utstring_done_wrapper(void *_buf) {
   UT_string *buf = (UT_string*)_buf;
-  unsigned i;
-  for(i=0; i < num; i++) {
-    utstring_done(buf);
-    buf++;
-  }
+  utstring_done(buf);
 }
 
-static void utstring_clear_wrapper(void *_buf, unsigned num) {
+static void utstring_clear_wrapper(void *_buf) {
   UT_string *buf = (UT_string*)_buf;
-  unsigned i;
-  for(i=0; i < num; i++) {
-    utstring_clear(buf);
-    buf++;
-  }
+  utstring_clear(buf);
 }
 
-static void utstring_copy_wrapper(void *_dst, void *_src, unsigned num) {
+static void utstring_copy_wrapper(void *_dst, void *_src) {
   UT_string *dst = (UT_string*)_dst;
   UT_string *src = (UT_string*)_src;
-  unsigned i;
-  for(i=0; i < num; i++) {
-    utstring_concat(dst,src);
-    dst++;
-    src++;
-  }
+  utstring_concat(dst,src);
 }
 
-/* a few basic vector types as described via mm that can be passed to utvector_init/new */
-static UT_vector_mm utvector_utstring_mm = {
+static UT_mm _utstring_mm = {
   .sz = sizeof(UT_string),
   .init = utstring_init_wrapper,
   .fini = utstring_done_wrapper,
   .copy = utstring_copy_wrapper,
   .clear = utstring_clear_wrapper
 };
-UT_vector_mm* utvector_utstring = &utvector_utstring_mm;
+UT_mm* utstring_mm = &_utstring_mm;
 

+ 3 - 0
opt/bundle/src/utmm.c

@@ -77,3 +77,6 @@ void utmm_copy(UT_mm *mm, char *dst, char *src, size_t n) {
   }
 }
 
+/* convenient predefined utmm */
+static UT_mm _utmm_int = {.sz = sizeof(int)};
+UT_mm* utmm_int = &_utmm_int;

+ 12 - 17
opt/bundle/src/utvector.c

@@ -26,6 +26,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <string.h>
 #include "utvector.h"
 
+#define INITIAL_SIZE 16
+
 /* utvector
  *
  * maintain a contiguous buffer of 'n' elements ('i' occupied)
@@ -42,7 +44,7 @@ void oom(void) {
   exit(-1);
 }
 
-UT_vector *utvector_new(const UT_vector_mm *mm) {
+UT_vector *utvector_new(const UT_mm *mm) {
   UT_vector *v = malloc(sizeof(UT_vector)); if (!v) return NULL;
   utvector_init(v,mm);
   return v;
@@ -52,7 +54,7 @@ unsigned utvector_len(UT_vector *v) {
   return v->i;
 }
 
-void utvector_init(UT_vector *v, const UT_vector_mm *mm) {
+void utvector_init(UT_vector *v, const UT_mm *mm) {
   v->mm = *mm;  // struct copy
   v->i = v->n = 0;
   v->d = NULL;
@@ -67,13 +69,12 @@ void utvector_reserve(UT_vector *v, unsigned num) {
   if (!d) oom();
   v->d = d;
   void *b = v->d + (v->n * v->mm.sz); // start of newly allocated area
-  if (v->mm.init) v->mm.init(b, n);
-  else            memset(b, 0, n*v->mm.sz);
+  utmm_init(&v->mm,b,n);
   v->n = n + v->n;
 }
 
 void utvector_fini(UT_vector *v) {
-  if (v->mm.fini) v->mm.fini(v->d, v->n);
+  utmm_fini(&v->mm,v->d,v->n);
   free(v->d);
   v->d = NULL;
   v->i = v->n = 0;
@@ -94,9 +95,8 @@ void utvector_copy(UT_vector *dst, UT_vector *src) { /* dst, src both inited */
   utvector_clear(dst);
   utvector_reserve(dst, src->i);
   dst->i = src->i;
-  if (dst->mm.clear) dst->mm.clear(dst->d, src->i);
-  if (src->mm.copy) src->mm.copy(dst->d, src->d, src->i);
-  else                    memcpy(dst->d, src->d, src->mm.sz * src->i);
+  utmm_clear(&dst->mm,dst->d,src->i);
+  utmm_copy(&dst->mm, dst->d, src->d, src->i);
 }
 
 void utvector_free(UT_vector *v) {
@@ -107,7 +107,7 @@ void utvector_free(UT_vector *v) {
 void *utvector_extend(UT_vector *v) {
   utvector_reserve(v,1);
   void *b = v->d + (v->i * v->mm.sz);
-  if (v->mm.clear) v->mm.clear(b,1);
+  utmm_clear(&v->mm,b,1);
   v->i++;
   return b;
 }
@@ -146,22 +146,17 @@ void *utvector_elt(UT_vector *v, unsigned i) {
  * no caller memory to copy it into anyway. a cpy_shift maybe handy */
 void utvector_shift(UT_vector *v) {
   assert (v->i);
-  if (v->mm.fini) v->mm.fini(v->d, 1);
+  utmm_fini(&v->mm,v->d,1);
   v->i--;
   memmove(v->d, v->d + v->mm.sz, (v->n-1)*v->mm.sz);
   char *b = v->d + ((v->n-1) * v->mm.sz);
-  if (v->mm.init) v->mm.init(b, 1);
-  else            memset(b, 0, v->mm.sz);
+  utmm_init(&v->mm,b,1);
 }
 
 void *utvector_push(UT_vector *v, void *e) {
   void *b  = utvector_extend(v);
-  if (v->mm.copy) v->mm.copy(b, e, 1);
-  else            memcpy(b, e, v->mm.sz);
+  utmm_copy(&v->mm, b, e, 1);
   return v->d + ((v->i - 1) * v->mm.sz);
 }
 
 
-/* a few basic vector types as described via mm that can be passed to utvector_init/new */
-static UT_vector_mm utvector_int_mm = {.sz = sizeof(int)};
-UT_vector_mm* utvector_int = &utvector_int_mm;

+ 1 - 1
opt/bundle/tests/test1.c

@@ -2,7 +2,7 @@
 
 int main() {
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   utvector_fini(&v);
   return 0;
 }

+ 1 - 1
opt/bundle/tests/test10.c

@@ -4,7 +4,7 @@
 int main() {
   int *p;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
 
   printf("extend\n");
   p = (int*)utvector_extend(&v);

+ 1 - 1
opt/bundle/tests/test11.c

@@ -4,7 +4,7 @@
 int main() {
   UT_string *s;
   UT_vector v;
-  utvector_init(&v, utvector_utstring);
+  utvector_init(&v, utstring_mm);
 
   printf("extend\n");
   s = (UT_string*)utvector_extend(&v);

+ 1 - 1
opt/bundle/tests/test12.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<16; i++) utvector_push(&v, &i);
 
   p=NULL; while ( (p=(int*)utvector_next(&v,p))) printf("%d\n",*p);

+ 1 - 1
opt/bundle/tests/test13.c

@@ -10,7 +10,7 @@ void dump(UT_vector *v) {
 int main() {
   int i;
   UT_string *t;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_string s; utstring_init(&s);
 
   for(i=0; i<16; i++) {

+ 1 - 1
opt/bundle/tests/test14.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<16; i++) utvector_push(&v, &i);
 
   p=NULL; while ( (p=(int*)utvector_next(&v,p))) printf("%d\n",*p);

+ 1 - 1
opt/bundle/tests/test15.c

@@ -10,7 +10,7 @@ void dump(UT_vector *v) {
 int main() {
   int i;
   UT_string *t;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_string s; utstring_init(&s);
 
   for(i=0; i<16; i++) {

+ 1 - 1
opt/bundle/tests/test16.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v,*k;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<10; i++) utvector_push(&v, &i);
 
   k = utvector_clone(&v);

+ 1 - 1
opt/bundle/tests/test2.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<10; i++) utvector_push(&v, &i);
   while ( (p=(int*)utvector_next(&v,p))) printf("%d\n",*p);
   utvector_fini(&v);

+ 1 - 1
opt/bundle/tests/test3.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<10; i++) utvector_push(&v, &i);
   printf("len %d\n", utvector_len(&v));
   utvector_pop(&v);

+ 1 - 1
opt/bundle/tests/test4.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v,*k;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<10; i++) utvector_push(&v, &i);
 
   k = utvector_clone(&v);

+ 1 - 1
opt/bundle/tests/test5.c

@@ -3,7 +3,7 @@
 
 int main() {
   int i; UT_string *p;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_string s; utstring_init(&s);
   for(i=0; i<10; i++) {
     utstring_printf(&s, ".");

+ 1 - 1
opt/bundle/tests/test6.c

@@ -9,7 +9,7 @@ void dump(UT_vector *v) {
 
 int main() {
   int i; UT_string *p;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_string s; utstring_init(&s);
   for(i=0; i<10; i++) {
     utstring_printf(&s, ".");

+ 1 - 1
opt/bundle/tests/test7.c

@@ -9,7 +9,7 @@ void dump(UT_vector *v) {
 
 int main() {
   int i;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_vector *k;
 
   UT_string s; utstring_init(&s);

+ 1 - 1
opt/bundle/tests/test8.c

@@ -4,7 +4,7 @@
 int main() {
   int i,*p=NULL;
   UT_vector v;
-  utvector_init(&v, utvector_int);
+  utvector_init(&v, utmm_int);
   for(i=0; i<16; i++) utvector_push(&v, &i);
   p = utvector_extend(&v);
   *p = 1000;

+ 1 - 1
opt/bundle/tests/test9.c

@@ -10,7 +10,7 @@ void dump(UT_vector *v) {
 int main() {
   int i;
   UT_string *t;
-  UT_vector v; utvector_init(&v, utvector_utstring);
+  UT_vector v; utvector_init(&v, utstring_mm);
   UT_string s; utstring_init(&s);
 
   for(i=0; i<16; i++) {