-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgda_vector.c
More file actions
59 lines (45 loc) · 1.51 KB
/
Copy pathgda_vector.c
File metadata and controls
59 lines (45 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Copyright (c) 2023 ETH Zurich.
// All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// main author: Marc Fischer
#include <string.h>
#include "gda_vector.h"
void GDA_vector_create(GDA_Vector** vector, size_t element_size, size_t capacity) {
*vector = (GDA_Vector*)malloc(sizeof(GDA_Vector));
(*vector)->element_size = element_size;
(*vector)->capacity = capacity;
(*vector)->size = 0;
(*vector)->data = malloc(element_size*capacity);
}
void GDA_vector_push_back(GDA_Vector* vector, const void* element) {
if (vector->size >= vector->capacity) {
vector->capacity = vector->capacity << 1;
vector->data = realloc(vector->data, vector->capacity*vector->element_size);
}
memcpy( ( (char*) vector->data) + vector->element_size*vector->size, element, vector->element_size);
vector->size++;
}
void* GDA_vector_at(GDA_Vector* vector, size_t i) {
return (void*)( ( (char*)vector->data) + i*vector->element_size);
}
size_t GDA_vector_size(GDA_Vector* vector) {
return vector->size;
}
void GDA_vector_pop_back(GDA_Vector* vector) {
vector->size--;
if(vector->size < (vector->capacity >> 2) ) { // division by 4
vector->capacity = vector->capacity >> 1;
vector->data = realloc(vector->data, vector->capacity * vector->element_size);
}
}
void GDA_vector_free(GDA_Vector** vector) {
if ((*vector)->data) {
free((*vector)->data);
(*vector)->data = 0;
}
free(*vector);
*vector = NULL;
}