1
1
#include <stdint.h>
2
2
#include <stdlib.h>
3
3
4
- #include "Array.h"
5
4
#include "Vector.h"
6
5
7
6
struct vector
8
7
{
9
- size_t size ;
8
+ size_t length ;
10
9
array * array ;
11
10
};
12
11
13
- size_t get_array_size (size_t vectorSize )
12
+ // private methods
13
+ array * vector_array (vector * vector );
14
+
15
+ size_t get_computed_array_length (size_t vectorSize )
14
16
{
15
17
if (vectorSize < 5 )
16
18
{
@@ -19,105 +21,167 @@ size_t get_array_size(size_t vectorSize)
19
21
return vectorSize + 10 ;
20
22
}
21
23
22
- vector * vector_create (size_t size , size_t sizeOfType )
24
+ // public implementation
25
+ vector * vector_create (size_t length , size_t itemSize )
23
26
{
24
27
vector * vec = (vector * )malloc (sizeof (vector ));
25
28
if (vec == NULL )
26
29
{
27
30
return NULL ;
28
31
}
29
32
30
- array * array = array_create (get_array_size ( size ), sizeOfType );
33
+ array * array = array_create (get_computed_array_length ( length ), itemSize );
31
34
if (array == NULL )
32
35
{
33
36
free (vec );
34
37
return NULL ;
35
38
}
36
- vec -> size = size ;
39
+ vec -> length = length ;
37
40
vec -> array = array ;
38
41
return vec ;
39
42
}
40
43
41
- void * vector_at (vector * vector , size_t index )
44
+ vector * vector_clone (vector * vectorToClone )
42
45
{
43
- if (index >= vector_size (vector ))
46
+ vector * vec = vector_create (vector_length (vectorToClone ), vector_item_size (vectorToClone ));
47
+ if (vec == NULL || !vector_copy (vec , vectorToClone , vector_length (vectorToClone )))
44
48
{
45
49
return NULL ;
46
50
}
47
- return array_at (vector -> array , index );
51
+ vec -> length = vector_length (vectorToClone );
52
+ return vec ;
48
53
}
49
54
50
- bool vector_set_at (vector * vector , size_t index , void * value )
55
+ vector * vector_from_array (array * array )
56
+ {
57
+ vector * vec = vector_create (array_length (array ), array_item_size (array ));
58
+ if (vec == NULL || !vector_copy_array (vec , array , array_length (array )))
59
+ {
60
+ return NULL ;
61
+ }
62
+ return vec ;
63
+ }
64
+
65
+ vector * vector_from_data (void * data , size_t length , size_t itemSize )
66
+ {
67
+ vector * vec = vector_create (length , itemSize );
68
+ if (vec == NULL || !vector_copy_data (vec , data , length ))
69
+ {
70
+ return NULL ;
71
+ }
72
+ return vec ;
73
+ }
74
+
75
+ bool vector_copy (vector * destination , vector * source , size_t length )
51
76
{
52
- if (index >= vector_size (vector ))
77
+ size_t sourceLen = vector_length (source ), sourceItemSize = vector_item_size (source );
78
+ size_t destLen = vector_length (destination ), destItemSize = vector_item_size (destination );
79
+ if (sourceItemSize != destItemSize || length > sourceLen || sourceLen > destLen )
53
80
{
54
81
return false;
55
82
}
56
- return array_set_at (vector -> array , index , value );
83
+
84
+ return vector_copy_array (destination , vector_array (source ), length );
85
+ }
86
+
87
+ bool vector_copy_array (vector * destination , array * source , size_t length )
88
+ {
89
+ return array_copy (vector_array (destination ), source , length );
90
+ }
91
+
92
+ bool vector_copy_data (vector * destination , void * source , size_t length )
93
+ {
94
+ return array_copy_data (vector_array (destination ), source , length );
95
+ }
96
+
97
+ void * vector_at (vector * vector , size_t index )
98
+ {
99
+ if (index >= vector_length (vector ))
100
+ {
101
+ return NULL ;
102
+ }
103
+ return array_at (vector -> array , index );
57
104
}
58
105
59
106
bool vector_get_at (vector * vector , size_t index , void * value )
60
107
{
61
- if (index >= vector_size (vector ))
108
+ if (index >= vector_length (vector ))
62
109
{
63
110
return false;
64
111
}
65
112
return array_get_at (vector -> array , index , value );
66
113
}
67
114
68
- void * vector_front (vector * vector ) { return vector_at (vector , 0 ); }
115
+ bool vector_set_at (vector * vector , size_t index , void * value )
116
+ {
117
+ if (index >= vector_length (vector ))
118
+ {
119
+ return false;
120
+ }
121
+ return array_set_at (vector -> array , index , value );
122
+ }
69
123
70
- bool vector_set_front (vector * vector , void * value ) { return vector_set_at (vector , 0 , value ); }
124
+ void * vector_front (vector * vector ) { return vector_at (vector , 0 ); }
71
125
72
126
bool vector_get_front (vector * vector , void * value ) { return vector_get_at (vector , 0 , value ); }
73
127
74
- void * vector_back (vector * vector ) { return vector_at (vector , vector_size (vector ) - 1 ); }
128
+ bool vector_set_front (vector * vector , void * value ) { return vector_set_at (vector , 0 , value ); }
129
+
130
+ void * vector_back (vector * vector ) { return vector_at (vector , vector_length (vector ) - 1 ); }
75
131
76
- bool vector_set_back (vector * vector , void * value ) { return vector_set_at (vector , vector_size (vector ) - 1 , value ); }
132
+ bool vector_get_back (vector * vector , void * value ) { return vector_get_at (vector , vector_length (vector ) - 1 , value ); }
77
133
78
- bool vector_get_back (vector * vector , void * value ) { return vector_get_at (vector , vector_size (vector ) - 1 , value ); }
134
+ bool vector_set_back (vector * vector , void * value ) { return vector_set_at (vector , vector_length (vector ) - 1 , value ); }
79
135
80
136
void * vector_data (vector * vector ) { return array_data (vector -> array ); }
81
137
82
- size_t vector_size (vector * vector ) { return vector -> size ; }
138
+ size_t vector_length (vector * vector ) { return vector -> length ; }
139
+
140
+ size_t vector_capacity (vector * vector ) { return array_length (vector -> array ); }
83
141
84
- bool vector_empty (vector * vector ) { return vector_size (vector ) == 0 ; }
142
+ size_t vector_item_size (vector * vector ) { return array_item_size (vector -> array ); }
143
+
144
+ array * vector_array (vector * vector ) { return vector -> array ; }
145
+
146
+ bool vector_empty (vector * vector ) { return vector_length (vector ) == 0 ; }
85
147
86
148
bool vector_append (vector * vector , void * value )
87
149
{
88
- if (vector_size (vector ) < array_size (vector -> array ))
150
+ size_t currentLen = vector_length (vector );
151
+ if (currentLen < vector_capacity (vector ))
89
152
{
90
- vector -> size ++ ;
153
+ vector -> length ++ ;
91
154
return vector_set_back (vector , value );
92
155
}
93
- size_t newArraySize = get_array_size ( vector -> size + 1 );
156
+ size_t newArraySize = get_computed_array_length ( currentLen + 1 );
94
157
95
- array * newArray = array_create (newArraySize , array_size_of_type (vector -> array ));
158
+ array * newArray = array_create (newArraySize , vector_item_size (vector ));
96
159
if (newArray == NULL )
97
160
{
98
161
return false;
99
162
}
100
163
101
- array_copy (vector -> array , newArray );
102
- array_destroy (vector -> array );
164
+ array * oldArray = vector_array (vector );
103
165
vector -> array = newArray ;
104
- vector -> size ++ ;
166
+ vector -> length ++ ;
167
+ vector_copy_array (vector , oldArray , currentLen );
168
+ array_destroy (oldArray );
105
169
return vector_set_back (vector , value );
106
170
}
107
171
108
172
bool vector_pop (vector * vector , void * value )
109
173
{
110
174
bool result = vector_get_back (vector , value );
111
- if (result && vector -> size > 0 )
175
+ if (result && vector -> length > 0 )
112
176
{
113
- vector -> size -- ;
177
+ vector -> length -- ;
114
178
}
115
179
return result ;
116
180
}
117
181
118
182
void vector_erase (vector * vector , size_t index ) {}
119
183
120
- void vector_clear (vector * vector ) { vector -> size = 0 ; }
184
+ void vector_clear (vector * vector ) { vector -> length = 0 ; }
121
185
122
186
void vector_destroy (vector * vector )
123
187
{
0 commit comments