From: Mike D. Lowis Date: Sun, 7 Apr 2013 01:19:54 +0000 (-0400) Subject: Completed vector implementation X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=277ed172e01e5b5e3d547940261bb8f3ae263326;p=projs%2Flibcds.git Completed vector implementation --- diff --git a/source/vector/vec.c b/source/vector/vec.c index f108a54..19f9f23 100644 --- a/source/vector/vec.c +++ b/source/vector/vec.c @@ -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; } diff --git a/tests/test_vec.cpp b/tests/test_vec.cpp index c94052a..4897aaa 100644 --- a/tests/test_vec.cpp +++ b/tests/test_vec.cpp @@ -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 //-------------------------------------------------------------------------