Skip to content

Commit 3c9de86

Browse files
committed
Add dynarray_cut and fix a bug
1 parent 42182e7 commit 3c9de86

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

dynarray.c

+20-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void* dynarray_set(dynarray_t* arr, size_t index, void* value)
5353

5454
void* old_value_ptr = dynarray_get(arr, index);
5555
arr->_arr[index] = value;
56-
arr->len += 1;
56+
arr->len = index > arr->len ? index + 1: arr->len + 1; // when array is sparse
5757
return old_value_ptr;
5858
}
5959

@@ -63,6 +63,25 @@ void* dynarray_get(dynarray_t* arr, size_t index)
6363
return arr->_arr[index];
6464
}
6565

66+
// Cuts the value at index from array1
67+
// Returns a pointer to the deleted item (may be void*)
68+
void* dynarray_cut(dynarray_t* arr, size_t index)
69+
{
70+
void *old_value_ptr = dynarray_get(arr, index);
71+
72+
// index = 1, len = 5
73+
// {1, 2, 3, 4, 5} => // {1, 3, 4, 5}
74+
size_t move_items = arr->len - index; // should be -1 but +1 item is to ensure zeroing
75+
memmove(
76+
arr->_arr + index * sizeof(void*),
77+
arr->_arr + index * sizeof(void*) + 1,
78+
move_items * sizeof(void*)
79+
);
80+
arr->len = arr->len - 1;
81+
82+
return old_value_ptr;
83+
}
84+
6685
void dynarray_append(dynarray_t* arr, void* value)
6786
{
6887
dynarray_set(arr, arr->len, value);

dynarray.h

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ void dynarray_free(dynarray_t** arr);
1414

1515
void* dynarray_set(dynarray_t* arr, size_t index, void* value);
1616
void* dynarray_get(dynarray_t* arr, size_t index);
17+
void* dynarray_cut(dynarray_t* arr, size_t index);
18+
1719
void dynarray_append(dynarray_t* arr, void* value);
1820
void* dynarray_get_top(dynarray_t* arr);
1921
void* dynarray_remove_top(dynarray_t* arr);

dynarray_test.c

+39
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ static void print_stat(dynarray_t* arr)
77
printf("len = %zu, capacity = %zu\n", arr->len, arr->_capacity);
88
}
99

10+
static void print_items_int(dynarray_t* arr)
11+
{
12+
for (size_t i = 0; i < arr->len; i++) {
13+
int* value = dynarray_get(arr, i);
14+
if (value) {
15+
printf("[%d] = %d\n", (int) i, *value);
16+
} else {
17+
printf("[%d] = NULL\n", (int) i);
18+
}
19+
}
20+
}
21+
1022
int main()
1123
{
1224
dynarray_t* array = dynarray_create();
@@ -39,5 +51,32 @@ int main()
3951
}
4052
print_stat(array);
4153

54+
printf("\n\ndynarray 2\n");
55+
dynarray_t* arr2 = dynarray_create();
56+
for (int j = 0; j < 10; j += 2) {
57+
dynarray_set(arr2, j, &j);
58+
}
59+
print_stat(arr2);
60+
print_items_int(arr2);
61+
printf("[9] = %d\n", dynarray_get(arr2, 9));
62+
printf("[10] = %d\n", dynarray_get(arr2, 10));
63+
64+
int* item = dynarray_cut(arr2, 0);
65+
printf("cut item = %d\n", *item);
66+
print_stat(arr2);
67+
print_items_int(arr2);
68+
printf("[8] = %d\n", dynarray_get(arr2, 8));
69+
printf("[9] = %d\n", dynarray_get(arr2, 9));
70+
printf("[10] = %d\n", dynarray_get(arr2, 10));
71+
72+
printf("\n\ndynarray 3\n");
73+
dynarray_t* arr3 = dynarray_create();
74+
for (int j = 0; j < 10; j++) {
75+
dynarray_set(arr3, j, &j);
76+
}
77+
print_stat(arr3);
78+
print_items_int(arr3);
79+
4280
printf("&array[67] = %p\n", dynarray_get(array, 128));
81+
4382
}

0 commit comments

Comments
 (0)