]> git.mdlowis.com Git - projs/libcds.git/commitdiff
Completed vector implementation vector
authorMike D. Lowis <mike@mdlowis.com>
Sun, 7 Apr 2013 01:19:54 +0000 (21:19 -0400)
committerMike D. Lowis <mike@mdlowis.com>
Sun, 7 Apr 2013 01:19:54 +0000 (21:19 -0400)
source/vector/vec.c
tests/test_vec.cpp

index f108a549a34dbcb17db7e1cdd1180bbfaa5d349f..19f9f2367e9d843cf107e2219a1f6e49810dc7cf 100644 (file)
@@ -125,6 +125,26 @@ bool vec_set(vec_t* p_vec, size_t index, void* data)
 bool vec_insert(vec_t* p_vec, size_t index, size_t num_elements, ...)
 {
     bool ret = false;
+    va_list elements;
+    size_t new_size;
+    if ((index < p_vec->size) && (num_elements > 0))
+    {
+        /* Resize the vector to fit the new contents */
+        vec_resize( p_vec, p_vec->size + num_elements, NULL );
+        /* Move the displaced items to the end */
+        memcpy( &(p_vec->p_buffer[index + num_elements]),
+                &(p_vec->p_buffer[index]),
+                sizeof(void*) * (p_vec->size - index));
+        /* insert the new items */
+        va_start(elements, num_elements);
+        new_size = index + num_elements;
+        for (index; index < new_size; index++)
+        {
+            p_vec->p_buffer[index] = va_arg(elements,void*);
+        }
+        va_end(elements);
+        ret = true;
+    }
     return ret;
 }
 
index c94052a038bc82d6e9912c3f155dbb53a37ead09..4897aaa60c3d73d0d95d875a30bb4645f392de6f 100644 (file)
@@ -225,6 +225,44 @@ namespace {
     //-------------------------------------------------------------------------
     // Test vec_insert function
     //-------------------------------------------------------------------------
+    TEST(Verify_vec_insert_should_do_nothing_if_index_out_of_range)
+    {
+        vec_t vector = { false, 2, 3, NULL };
+        CHECK(false == vec_insert(&vector,2,0));
+    }
+
+    TEST(Verify_vec_insert_should_do_nothing_if_num_elements_is_0)
+    {
+        vec_t vector = { false, 2, 3, NULL };
+        CHECK(false == vec_insert(&vector,0,0));
+    }
+
+    TEST(Verify_vec_insert_should_insert_items_at_the_given_index)
+    {
+        vec_t* p_vec = vec_new(false,2,0,1);
+        CHECK(true == vec_insert(p_vec,1,2,2,3));
+        CHECK(4 == p_vec->size);
+        CHECK(4 == p_vec->capacity);
+        CHECK((void*)0 == p_vec->p_buffer[0]);
+        CHECK((void*)2 == p_vec->p_buffer[1]);
+        CHECK((void*)3 == p_vec->p_buffer[2]);
+        CHECK((void*)1 == p_vec->p_buffer[3]);
+        vec_free( p_vec );
+    }
+
+    TEST(Verify_vec_insert_should_insert_items_at_the_beginning)
+    {
+        vec_t* p_vec = vec_new(false,2,0,1);
+        CHECK(true == vec_insert(p_vec,0,2,2,3));
+        CHECK(4 == p_vec->size);
+        CHECK(4 == p_vec->capacity);
+        CHECK((void*)2 == p_vec->p_buffer[0]);
+        CHECK((void*)3 == p_vec->p_buffer[1]);
+        CHECK((void*)0 == p_vec->p_buffer[2]);
+        CHECK((void*)1 == p_vec->p_buffer[3]);
+        vec_free( p_vec );
+    }
+
     //-------------------------------------------------------------------------
     // Test vec_erase function
     //-------------------------------------------------------------------------