Skip to content

Commit af95daf

Browse files
authored
Merge pull request #2 from Pulsar7/feature/add-func/append_dyn_arrays_inplace
Add function to append dynamic-arrays inplace
2 parents 33dd6d8 + 0a80f90 commit af95daf

4 files changed

Lines changed: 170 additions & 38 deletions

File tree

docs/README.md

Lines changed: 70 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
- [Description](#description)
66
- [Usage](#usage)
7-
- [Create new Dynamic-Array](#create-new-dynamic-array)
8-
- [Clear Dynamic-Array](#clear-dynamic-array)
7+
- [Initialize \& Clear Dynamic-Array](#initialize--clear-dynamic-array)
98
- [Append elements to Dynamic-Array](#append-elements-to-dynamic-array)
109
- [Get length of Dynamic-Array](#get-length-of-dynamic-array)
1110
- [Append elements of static-array to Dynamic-Array](#append-elements-of-static-array-to-dynamic-array)
1211
- [Get element of Dynamic-array by index](#get-element-of-dynamic-array-by-index)
12+
- [Append two Dynamica-Arrays inplace](#append-two-dynamica-arrays-inplace)
1313
- [ToDo](#todo)
1414

1515
## Description
@@ -19,24 +19,17 @@
1919
2020
## Usage
2121

22-
### Create new Dynamic-Array
22+
### Initialize & Clear Dynamic-Array
2323

2424
```C
25+
//
26+
// Initialize dynamic-array
2527
DynArray dynamic_array;
2628
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
2729
return 1;
2830
}
29-
return 0;
30-
```
31-
32-
### Clear Dynamic-Array
33-
34-
```C
35-
DynArray dynamic_array;
36-
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
37-
return 1;
38-
}
39-
31+
//
32+
// Clear dynamic-array
4033
if (clear_dyn_array(&dynamic_array) != NO_ERROR) {
4134
return 1;
4235
}
@@ -47,23 +40,28 @@ return 0;
4740
### Append elements to Dynamic-Array
4841

4942
```C
43+
//
44+
// Initialize dynamic-array
5045
DynArray dynamic_array;
5146
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
5247
return 1;
5348
}
54-
49+
//
50+
// Append one element to dynamic-array
5551
int value_A = 1337;
5652
if (append_element_to_dyn_array(&dynamic_array, (void*)&value_A, sizeof(int)) != NO_ERROR) {
5753
printf("Couldn't append new element to dynamic-array\n");
5854
}
59-
55+
//
56+
// Append 50 elements to dynamic-array
6057
for (int value = 0; value < 50; value++) {
6158
if (append_element_to_dyn_array(&dynamic_array, (void*)&value, sizeof(int)) != NO_ERROR) {
6259
printf("Couldn't append new element to dynamic-array\n");
6360
break;
6461
}
6562
}
66-
63+
//
64+
// Clear dynamic-array
6765
if (clear_dyn_array(&dynamic_array) != NO_ERROR) {
6866
return 1;
6967
}
@@ -74,25 +72,30 @@ return 0;
7472
### Get length of Dynamic-Array
7573

7674
```C
75+
//
76+
// Initialize dynamic-array
7777
DynArray dynamic_array;
7878
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
7979
return 1;
8080
}
81-
81+
//
82+
// Append 50 elements to dynamic-array
8283
for (int value = 0; value < 50; value++) {
8384
if (append_element_to_dyn_array(&dynamic_array, (void*)&value, sizeof(int)) != NO_ERROR) {
8485
printf("Couldn't append new element to dynamic-array\n");
8586
break;
8687
}
8788
}
88-
89+
//
90+
// Get amount of elments in dynamic-array
8991
size_t array_len;
9092
if (get_len(&dynamic_array, &array_len) == true) {
9193
printf("length of dynamic-array=%d\n", array_len);
9294
} else {
9395
printf("Couldn't get length of dynamic-array\n");
9496
}
95-
97+
//
98+
// Clear dynamic-array
9699
if (clear_dyn_array(&dynamic_array) != NO_ERROR) {
97100
return 1;
98101
}
@@ -103,22 +106,27 @@ return 0;
103106
### Append elements of static-array to Dynamic-Array
104107

105108
```C
109+
//
110+
// Initialize dynamic-array
106111
DynArray dynamic_array;
107112
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
108113
return 1;
109114
}
110-
115+
//
116+
// Add static integer-array to dynamic-array
111117
int static_int_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
112118
if (append_static_array_elements_to_dyn_array(&dynamic_array, static_int_array, sizeof(int), (size_t)9) != NO_ERROR) {
113119
printf("Couldn't append int-elements of static-array to dynamic-array\n");
114120
}
115-
121+
//
122+
// Add static char-array to dynamic-array
116123
char* static_char_array = "HeLlO WoRlD";
117124
size_t static_char_array_len = strlen(static_char_array);
118125
if (append_static_array_elements_to_dyn_array(&dynamic_array, static_char_array, sizeof(char), static_char_array_len) != NO_ERROR) {
119126
printf("Couldn't append static-string to dynamic-array\n");
120127
}
121-
128+
//
129+
// Clear dynamic-array
122130
if (clear_dyn_array(&dynamic_array) != NO_ERROR) {
123131
return 1;
124132
}
@@ -129,27 +137,64 @@ return 0;
129137
### Get element of Dynamic-array by index
130138

131139
```C
140+
//
141+
// Initialize dynamic-array
132142
DynArray dynamic_array;
133143
if (init_dyn_array(&dynamic_array) != NO_ERROR) {
134144
return 1;
135145
}
136-
146+
//
147+
// Append string-element to dynamic-array
137148
char* static_char_array = "HeLlO WoRlD";
138149
size_t static_char_array_len = strlen(static_char_array);
139150
size_t data_size = sizeof(char)*((size_t)static_char_array_len);
140151
if (append_element_to_dyn_array(&dynamic_array, (void*)static_char_array, data_size) == NO_ERROR) {
152+
//
153+
// Get string-element from dynamic-array by its index
141154
printf("%s\n", (char*)get_element_by_index(&dynamic_array, 0));
142155
} else {
143156
printf("Couldn't append static-string to dynamic-array\n");
144157
}
145-
158+
//
159+
// Clear dynamic-array
146160
if (clear_dyn_array(&dynamic_array) != NO_ERROR) {
147161
return 1;
148162
}
149163

150164
return 0;
151165
```
152166

167+
### Append two Dynamica-Arrays inplace
168+
169+
```C
170+
//
171+
// Initialize both dynamic-arrays
172+
DynArray dynamic_array_a, dynamic_array_b;
173+
if (init_dyn_array(&dynamic_array_a) == NO_ERROR || init_dyn_array(&dynamic_array_b) == NO_ERROR) {
174+
//
175+
// Failed to initialize one or both dynamic-arrays
176+
return 1;
177+
}
178+
//
179+
// Add string as one element to dynamic-array-B (one node)
180+
char* static_char_array = "HeLlO WoRlD";
181+
size_t static_char_array_len = strlen(static_char_array);
182+
if (append_element_to_dyn_array(&dynamic_array_b, (void*)static_char_array, sizeof(char)*((size_t)static_char_array_len)) == NO_ERROR) {
183+
//
184+
// Append string-element from dynamic-array-B to dynamic-array-A
185+
if (append_dyn_arrays_inplace(&dynamic_array_a, &dynamic_array_b)) {
186+
printf("%s\n", (char*)get_element_by_index(&dynamic_array_a, 0));
187+
}
188+
}
189+
//
190+
// Clear dynamic-arrays
191+
if (clear_dyn_array(&dynamic_array_a) != NO_ERROR || clear_dyn_array(&dynamic_array_b) != NO_ERROR) {
192+
return 1;
193+
}
194+
195+
return 0;
196+
```
197+
153198
## ToDo
154199

155200
- [ ] Instead of iterating through whole dynamic-array at `get_len`, use `size_t length`-Value of `DynArray`-struct

includes/dynamic_array.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@ typedef struct DynArray {
3131
/*
3232
Functions
3333
*/
34-
//
35-
// Initialize new dynamic array
3634
Error_Code init_dyn_array(DynArray* dynamic_array);
3735
Error_Code append_element_to_dyn_array(DynArray* dynamic_array, void* data, const size_t data_size);
3836
void* get_last(const DynArray* dynamic_array);
3937
void* get_first(const DynArray* dynamic_array);
4038
bool get_len(const DynArray* dynamic_array, size_t* len);
4139
Error_Code append_static_array_elements_to_dyn_array(DynArray* dynamic_array, void* static_array, const size_t static_array_elem_size, const size_t static_array_len);
4240
void* get_element_by_index(const DynArray* dynamic_array, const size_t index);
41+
bool append_dyn_arrays_inplace(DynArray* a, const DynArray* b);
4342
Error_Code clear_dyn_array(DynArray* dynamic_array);
4443

4544
#endif // DYNAMIC_ARRAY_LIB_DYNAMIC_ARRAY_H

src/dynamic_array.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Error_Code check_dyn_array(const DynArray* dynamic_array) {
3030

3131
/*
3232
Initialize a new dynamic-array.
33+
34+
Set `dynamic_array->length` to 0.
3335
*/
3436
Error_Code init_dyn_array(DynArray* dynamic_array) {
3537
if (dynamic_array == NULL) {
@@ -65,6 +67,9 @@ DynArrayNode* create_new_dyn_array_node(void* data, const size_t data_size) {
6567
new_node->next_ptr = NULL;
6668
new_node->prev_ptr = NULL;
6769
//
70+
// Set data_size-value
71+
new_node->data_size = data_size;
72+
//
6873
// Allocate actual data in node
6974
new_node->data = calloc(1, data_size);
7075
if (new_node->data == NULL) {
@@ -87,6 +92,8 @@ Helper function
8792
Add first element to dynamic-array.
8893
This function assumes, that the given dynamic-array has already been checked with `check_dyn_array` and that the given
8994
`data-ptr` and `data_size` are also valid.
95+
96+
Set `dynamic_array->length` to 1.
9097
*/
9198
Error_Code add_first_element_to_dyn_array(DynArray* dynamic_array, void* data, const size_t data_size) {
9299
DynArrayNode* first_node = create_new_dyn_array_node(data, data_size);
@@ -108,6 +115,8 @@ Error_Code add_first_element_to_dyn_array(DynArray* dynamic_array, void* data, c
108115

109116
/*
110117
Append element to dynamic-array.
118+
119+
Increases `dynamic_array->length` by 1.
111120
*/
112121
Error_Code append_element_to_dyn_array(DynArray* dynamic_array, void* data, const size_t data_size) {
113122
if (check_dyn_array(dynamic_array) != NO_ERROR) {
@@ -326,6 +335,45 @@ void* get_element_by_index(const DynArray* dynamic_array, const size_t index) {
326335
return current_ptr->data;
327336
}
328337

338+
/*
339+
Append elements of dynamic-array `b` to dynamic-array `a`.
340+
Uses `append_element_to_dyn_array` under the hood.
341+
*/
342+
bool append_dyn_arrays_inplace(DynArray* a, const DynArray* b) {
343+
DynArray* dyn_array_a = a;
344+
const DynArray* dyn_array_b = b;
345+
//
346+
// Check both dynamic-arrays
347+
if (check_dyn_array(dyn_array_a) != NO_ERROR || check_dyn_array(dyn_array_b) != NO_ERROR) {
348+
//
349+
// One or both of the given dynamic-arrays are invalid
350+
// INVALID_ARRAY_ERROR
351+
return false;
352+
}
353+
if (dyn_array_b->length == 0) {
354+
//
355+
// Dynamic-array `b` is empty, nothing to append
356+
// NO_ERROR
357+
return true;
358+
}
359+
//
360+
// Iterate through dynamic-array `b`
361+
Error_Code append_elem_error_code = NO_ERROR;
362+
DynArrayNode* current_b_ptr = dyn_array_b->head_ptr;
363+
while (current_b_ptr != NULL) {
364+
append_elem_error_code = append_element_to_dyn_array(dyn_array_a, current_b_ptr->data, current_b_ptr->data_size);
365+
if (append_elem_error_code != NO_ERROR) {
366+
//
367+
// Appending element went wrong
368+
return false;
369+
}
370+
current_b_ptr = current_b_ptr->next_ptr;
371+
}
372+
//
373+
// NO_ERROR
374+
return true;
375+
}
376+
329377
/*
330378
Delete all elements on an dynamic-array.
331379
*/

0 commit comments

Comments
 (0)