diff --git a/munit/munit.o b/munit/munit.o new file mode 100644 index 0000000..76836ed Binary files /dev/null and b/munit/munit.o differ diff --git a/util.o b/util.o new file mode 100644 index 0000000..cffe131 Binary files /dev/null and b/util.o differ diff --git a/vector.c b/vector.c index bfbea79..9126a00 100644 --- a/vector.c +++ b/vector.c @@ -1,5 +1,4 @@ #include - #include #include #include @@ -25,7 +24,21 @@ void vector_initdata(ivector *v, int *arr, size_t arrsz) { assert(v && arrsz); - // + + // Инициализируем как пустой вектор сначала + v->n = 0; + v->maxsz = VECTOR_START_SIZE; + v->data = xmalloc(ITEMSZ * VECTOR_START_SIZE); + + // Если нужно больше места, перевыделяем + if (arrsz > v->maxsz) { + v->data = xrealloc(v->data, ITEMSZ * arrsz); + v->maxsz = arrsz; + } + + // Копируем данные + memcpy(v->data, arr, ITEMSZ * arrsz); + v->n = arrsz; } void @@ -33,9 +46,11 @@ vector_free(ivector *v) { assert(v); + if (v->data) { + xfree(v->data); + } v->n = 0; v->maxsz = 0; - xfree(v->data); v->data = NULL; } @@ -43,17 +58,14 @@ size_t vector_len(const ivector *v) { assert(v); - - // - return 0; + return v->n; } int * vector_data(const ivector *v) { assert(v); - // - return NULL; + return v->data; } void @@ -61,49 +73,115 @@ vector_resize(ivector *v, int n) { assert(v); - // -} + if (n > v->maxsz) { + // Увеличиваем capacity + size_t new_maxsz = v->maxsz; + while (new_maxsz < n) { + new_maxsz *= VECTOR_GROW_FACTOR; + } + // Сохраняем старый указатель + int *old_data = v->data; + v->data = xmalloc(ITEMSZ * new_maxsz); + + // Копируем старые данные + if (old_data) { + memcpy(v->data, old_data, ITEMSZ * v->n); + xfree(old_data); + } + + // Обнуляем новую память + for (size_t i = v->n; i < new_maxsz; i++) { + v->data[i] = 0; + } + + v->maxsz = new_maxsz; + } else if (n > v->n) { + // Если увеличиваем размер в пределах capacity, обнуляем новые элементы + for (size_t i = v->n; i < n; i++) { + v->data[i] = 0; + } + } + + v->n = n; +} void vector_set(ivector *v, size_t idx, int val) { assert(v && idx < v->n); - // + v->data[idx] = val; } int vector_get(const ivector *v, size_t idx) { assert(v && idx < v->n); - // - return 0; + return v->data[idx]; } void vector_push(ivector *v, int val) { assert(v); - // + + // Проверяем, нужно ли увеличить capacity + if (v->n >= v->maxsz) { + size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; + v->data = xrealloc(v->data, ITEMSZ * new_maxsz); + v->maxsz = new_maxsz; + } + + // Добавляем элемент + v->data[v->n] = val; + v->n++; } void vector_pop(ivector *v) { assert(v); - // + +if (v->n > 0) { + v->n--; + } + // Если вектор пуст, ничего не делаем (без assert) } void vector_insert(ivector *v, size_t idx, int val) { - assert(v && v->n >= idx); - // + assert(v && idx <= v->n); + + // Проверяем, нужно ли увеличить capacity + if (v->n >= v->maxsz) { + size_t new_maxsz = v->maxsz * VECTOR_GROW_FACTOR; + if (new_maxsz == 0) new_maxsz = VECTOR_START_SIZE; + + v->data = xrealloc(v->data, ITEMSZ * new_maxsz); + v->maxsz = new_maxsz; + } + + // Сдвигаем элементы вправо + for (size_t i = v->n; i > idx; i--) { + v->data[i] = v->data[i - 1]; + } + + // Вставляем новый элемент + v->data[idx] = val; + v->n++; } void vector_del(ivector *v, size_t idx) { - // + assert(v && idx < v->n); + + // Сдвигаем элементы влево + for (size_t i = idx; i < v->n - 1; i++) { + v->data[i] = v->data[i + 1]; + } + + v->n--; } void diff --git a/vector.o b/vector.o new file mode 100644 index 0000000..58d5983 Binary files /dev/null and b/vector.o differ diff --git a/vector_test b/vector_test new file mode 100755 index 0000000..7554716 Binary files /dev/null and b/vector_test differ diff --git a/vector_test.c b/vector_test.c index e77cff4..ccd08f7 100644 --- a/vector_test.c +++ b/vector_test.c @@ -77,7 +77,6 @@ test_vector_resize(const MunitParameter params[], void * data) munit_assert_size(v.n, <=, v.maxsz); - // Try to check that new memory is really zeroed i = ARRSZ(arr); p = vector_data(&v); for (; i < 16; i++) { @@ -107,7 +106,6 @@ test_vector_set_get(const MunitParameter params[], void * data) for (i = 0; i < vector_len(&v); i++) { int item = vector_get(&v, i); munit_assert_int(item, ==, i); - //double check with raw pointer munit_assert_int(p[i], ==, i); } @@ -132,7 +130,6 @@ test_vector_push_pop(const MunitParameter params[], void * data) } munit_assert_size(vector_len(&v), ==, ARRSZ(arr)); - // test vector_get for (i = 0; i < ARRSZ(arr); i++) { tmp = vector_get(&v, i); munit_assert_int(tmp, ==, arr[i]); @@ -149,19 +146,82 @@ test_vector_push_pop(const MunitParameter params[], void * data) } munit_assert_size(vector_len(&v), ==, ARRSZ(arr) - 2); - //test vector_pop underflow for (i = 0; i < ARRSZ(arr); i++) { vector_pop(&v); } munit_assert_size(vector_len(&v), ==, 0); - //test vector_pop vector_free(&v); return MUNIT_OK; } +static MunitResult +test_vector_insert(const MunitParameter params[], void * data) +{ + ivector v; + vector_init(&v); + + vector_insert(&v, 0, 100); + munit_assert_size(vector_len(&v), ==, 1); + munit_assert_int(vector_get(&v, 0), ==, 100); + + vector_insert(&v, 0, 200); + munit_assert_size(vector_len(&v), ==, 2); + munit_assert_int(vector_get(&v, 0), ==, 200); + munit_assert_int(vector_get(&v, 1), ==, 100); + + vector_insert(&v, 2, 300); + munit_assert_size(vector_len(&v), ==, 3); + munit_assert_int(vector_get(&v, 2), ==, 300); + + vector_insert(&v, 1, 400); + munit_assert_size(vector_len(&v), ==, 4); + munit_assert_int(vector_get(&v, 0), ==, 200); + munit_assert_int(vector_get(&v, 1), ==, 400); + munit_assert_int(vector_get(&v, 2), ==, 100); + munit_assert_int(vector_get(&v, 3), ==, 300); + + vector_free(&v); + return MUNIT_OK; +} + +static MunitResult +test_vector_del(const MunitParameter params[], void * data) +{ + ivector v; + vector_init(&v); + int i; + + for (i = 0; i < 5; i++) { + vector_push(&v, i * 10); + } + munit_assert_size(vector_len(&v), ==, 5); + + vector_del(&v, 0); + munit_assert_size(vector_len(&v), ==, 4); + munit_assert_int(vector_get(&v, 0), ==, 10); + + vector_del(&v, 3); + munit_assert_size(vector_len(&v), ==, 3); + munit_assert_int(vector_get(&v, 0), ==, 10); + munit_assert_int(vector_get(&v, 1), ==, 20); + munit_assert_int(vector_get(&v, 2), ==, 30); + + vector_del(&v, 1); + munit_assert_size(vector_len(&v), ==, 2); + munit_assert_int(vector_get(&v, 0), ==, 10); + munit_assert_int(vector_get(&v, 1), ==, 30); + + vector_del(&v, 0); + vector_del(&v, 0); + munit_assert_size(vector_len(&v), ==, 0); + + vector_free(&v); + return MUNIT_OK; +} + #define TEST_ITEM(func) {#func, func, NULL, NULL, MUNIT_TEST_OPTION_NONE } static MunitTest test_suite_tests[] = { @@ -173,6 +233,9 @@ static MunitTest test_suite_tests[] = { TEST_ITEM(test_vector_set_get), TEST_ITEM(test_vector_push_pop), + TEST_ITEM(test_vector_insert), + TEST_ITEM(test_vector_del), + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } }; diff --git a/vector_test.o b/vector_test.o new file mode 100644 index 0000000..db483e5 Binary files /dev/null and b/vector_test.o differ