revise hashvector_contents to optionally create the target vector
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 10 Jul 2022 14:38:51 +0000 (00:38 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Sun, 10 Jul 2022 14:38:51 +0000 (00:38 +1000)
vector/hashvector.c
vector/hashvector.h

index b39ef5ed2851168e78b0db7c4806b7ec0570c1cb..8b88135f0b660fec87e9994cc73803cb3af09a31 100644 (file)
@@ -158,23 +158,28 @@ int hashvector_delete(hashvector *hv,void *item) {
     return 1;
 }
 
-// Copy items into a vector. Returns 0 on success and -1 on failure.
-int hashvector_contents(hashvector *hv,vector *pv) {
-    if ( vector_resize( pv, hv->fill, 0, 0 ) ) {
-       return -1;
-    }
-    unsigned long from = 0;
-    unsigned long to = 0;
-    for ( ; to < hv->fill; from++ ) {
-       void **slot = vector_next_used( &hv->table, &from );
-       if ( slot == 0 ) {
-           break;
-       }
-       if ( *slot != HV_HOLE ) {
-           vector_set( pv, to++, *slot );
+vector *hashvector_contents(
+    hashvector *hv,enum vector_variant variant,vector *v)
+{
+    if ( v == 0 ) {
+       if ( hv->fill == 0 ) {
+           return 0;
        }
+       v = (vector*) malloc( sizeof( vector ) );
+    } else {
+       vector_resize( v, 0, vector_clear_any, 0 );
     }
-    return 0;
+    (*v) = (vector) { .variant = variant, 0, 0 };
+    if ( hv->fill == 0 ) {
+       return v;
+    }
+    vector_resize( v, hv->fill, 0, 0 );
+    vector_index i;
+    vector_index j = 0;
+    for ( i = 0; i < v->size; i++, j++ ) {
+       vector_set( v, i, hashvector_next( hv, &j, 0 ) );
+    }
+    return v;
 }
 
 // A simple binary hashcode, (before modulo table size)
index 2754fb1fc737ed674821e11cd98b43193770434c..b57aede5a0a5e9241993adb6aab4b324c87e4596 100644 (file)
@@ -134,16 +134,23 @@ extern int hashvector_delete(hashvector *hv,void *item);
  * 
  * \param hv is the \ref hashvector concerned.
  *
- * \param pv is the \ref vector to copy the content into.
+ * \param variant is the desired vector variant.
  *
- * \returns \b -1 if the required resizing of the \ref vector to the
- * \ref hashvector \b fill fails, otherwise \b 0 after having copied
- * the hashvector items in their internal order of appearance into the
- * \ref vector.
+ * \param pv is the optional \ref vector to copy the content into.
+ *
+ * \returns the \ref vector with the \ref hashvector content
+ *
+ * If \pv is null, then a new vector is allocated and handed out for
+ * the caller to reclaim unless the hashvector is empty in which case
+ * this function returns 0.
+ *
+ * If \b pv is not null, it is first cleared, and then populated with
+ * the content from the hashvector. The populated vector is returned.
  *
  * \related hashvector
  */
-extern int hashvector_contents(hashvector *hv,vector *pv);
+extern vector *hashvector_contents(
+    hashvector *hv,enum vector_variant variant,vector *pv);
 
 /**
  * \brief This is a utility function to compute and return a hashcode