8
8
#define CTL_SVEC
9
9
#define HOLD
10
10
#define vec svec
11
+
11
12
//#define _vec _svec
12
13
// undefined:
13
14
#define set __SET
14
15
#define push_back __PUSH_BACK
15
16
#define push_front __PUSH_FRONT
17
+ #define emplace __EMPLACE
16
18
#define emplace_back __EMPLACE_BACK
17
19
#define sort __SORT
18
20
// replaced:
19
21
#define insert __INSERT
20
22
#define erase __ERASE
21
- #define emplace __EMPLACE
22
23
#define assign_range __ASSIGN_RANGE
23
24
#define assign_generic __ASSIGN_GENERIC
24
- #define copy __COPY
25
25
26
26
#include <ctl/vector.h>
27
27
38
38
#undef assign_range
39
39
#undef assign_generic
40
40
41
- #define A JOIN(svec, T)
41
+ static inline I JOIN (A , find )(A * self , T key )
42
+ {
43
+ // FIXME binary_search
44
+ vec_foreach (T , self , ref )
45
+ if (JOIN (A , _equal )(self , ref , & key ))
46
+ return JOIN (I , iter )(self , ref - & self -> vector [0 ]);
47
+ return JOIN (A , end (self ));
48
+ }
42
49
43
- // FIXME sorted
44
- static inline void JOIN (A , emplace )(I * pos , T * value )
50
+ static inline void JOIN (A , insert )(A * self , T value )
45
51
{
46
- A * self = pos -> container ;
47
- if (!JOIN (I , done )(pos ))
52
+ // TODO binary_search pos
53
+ T * pos = JOIN (A , back )(self );
54
+ vec_foreach (T , self , ref )
55
+ if (!self .compare (& value , ref )) // lower
56
+ {
57
+ pos = ref - & self -> vector [0 ]);
58
+ break ;
59
+ }
48
60
{
49
- size_t index = pos -> ref - self -> vector ;
50
- //JOIN(A, emplace_back)(self, JOIN(A, back)(self));
51
- for (size_t i = self -> size - 2 ; i > index ; i -- )
52
- self -> vector [i ] = self -> vector [i - 1 ];
53
- self -> vector [index ] = * value ;
61
+ //size_t index = pos->ref - self->vector;
62
+ //size_t end = pos->end - self->vector;
63
+ // TODO memmove with POD
64
+ //JOIN(A, push_back)(self, *JOIN(A, back)(self));
65
+ //for (size_t i = self->size - 2; i > index; i--)
66
+ // self->vector[i] = self->vector[i - 1];
67
+ //self->vector[index] = value;
68
+ //pos->ref = &self->vector[index];
69
+ //pos->end = &self->vector[end];
54
70
}
55
- else
56
- JOIN (A , emplace_back )(self , value );
71
+ //else
72
+ //{
73
+ // // or at end
74
+ // JOIN(A, push_back)(self, value);
75
+ // pos->end = pos->ref = &self->vector[self->size];
76
+ //}
57
77
}
58
78
59
79
// FIXME sorted
@@ -65,7 +85,7 @@ static inline void JOIN(A, assign_range)(A *self, T *from, T *last)
65
85
while (from != last )
66
86
{
67
87
if (i >= orig_size ) // grow
68
- JOIN (A , push_back )(self , self -> copy (from ));
88
+ JOIN (A , insert )(self , self -> copy (from ));
69
89
else
70
90
{
71
91
T * ref = & self -> vector [i ];
@@ -92,7 +112,7 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
92
112
while (!done (range ))
93
113
{
94
114
if (i >= orig_size ) // grow
95
- JOIN (A , push_back )(self , self -> copy (ref (range )));
115
+ JOIN (A , insert )(self , self -> copy (ref (range )));
96
116
else
97
117
{
98
118
T * sref = & self -> vector [i ];
@@ -108,20 +128,6 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
108
128
JOIN (A , pop_back )(self );
109
129
}
110
130
111
- static inline void JOIN (A , insert_index )(A * self , size_t index , T value )
112
- {
113
- if (self -> size > 0 )
114
- {
115
- JOIN (A , push_back )(self , * JOIN (A , back )(self ));
116
- // TODO memmove with POD
117
- for (size_t i = self -> size - 2 ; i > index ; i -- )
118
- self -> vector [i ] = self -> vector [i - 1 ];
119
- self -> vector [index ] = value ;
120
- }
121
- else
122
- JOIN (A , push_back )(self , value );
123
- }
124
-
125
131
static inline I JOIN (A , erase_index )(A * self , size_t index )
126
132
{
127
133
static T zero ;
@@ -178,79 +184,6 @@ static inline I *JOIN(A, erase_range)(I *range)
178
184
return range ;
179
185
}
180
186
181
- static inline void JOIN (A , insert )(A * self , T value )
182
- {
183
- // TODO binary_search pos
184
- {
185
- size_t index = pos -> ref - self -> vector ;
186
- size_t end = pos -> end - self -> vector ;
187
- // TODO memmove with POD
188
- JOIN (A , push_back )(self , * JOIN (A , back )(self ));
189
- for (size_t i = self -> size - 2 ; i > index ; i -- )
190
- self -> vector [i ] = self -> vector [i - 1 ];
191
- self -> vector [index ] = value ;
192
- pos -> ref = & self -> vector [index ];
193
- pos -> end = & self -> vector [end ];
194
- }
195
- else
196
- {
197
- // or at end
198
- JOIN (A , push_back )(self , value );
199
- pos -> end = pos -> ref = & self -> vector [self -> size ];
200
- }
201
- }
202
-
203
- static inline void JOIN (A , insert_count )(A * self , size_t count , T value )
204
- {
205
- // TODO binary_search pos
206
- size_t index = pos -> ref - self -> vector ;
207
- JOIN (A , reserve )(self , self -> size + count );
208
- if (!JOIN (I , done )(pos ))
209
- {
210
- for (size_t i = 0 ; i < count ; i ++ )
211
- JOIN (A , insert_index )(self , index ++ , self -> copy (& value ));
212
- }
213
- else
214
- {
215
- for (size_t i = 0 ; i < count ; i ++ )
216
- JOIN (A , push_back )(self , self -> copy (& value ));
217
- }
218
- #if defined CTL_STR
219
- JOIN (A , reserve )(self , self -> size );
220
- #endif
221
- if (self -> free )
222
- self -> free (& value );
223
- }
224
-
225
- static inline void JOIN (A , insert_range )(A * self , I * range2 )
226
- {
227
- // TODO binary_search pos
228
- size_t index = pos -> ref - self -> vector ;
229
- size_t f2 = range2 -> ref - range2 -> container -> vector ;
230
- size_t l2 = range2 -> end - range2 -> container -> vector ;
231
- // only if not overlapping, and resize does no realloc
232
- if (f2 < l2 )
233
- {
234
- JOIN (A , reserve )(self , self -> size + (l2 - f2 ));
235
- if (self == range2 -> container )
236
- {
237
- range2 -> ref = & range2 -> container -> vector [f2 ];
238
- range2 -> end = & range2 -> container -> vector [l2 ];
239
- }
240
- }
241
- if (!JOIN (I , done )(pos ))
242
- {
243
- foreach_range_ (A , it , range2 ) if (it .ref ) JOIN (A , insert_index )(self , index ++ , self -> copy (it .ref ));
244
- }
245
- else
246
- {
247
- foreach_range_ (A , it , range2 ) if (it .ref ) JOIN (A , push_back )(self , self -> copy (it .ref ));
248
- }
249
- #if defined CTL_STR
250
- JOIN (A , reserve )(self , self -> size );
251
- #endif
252
- }
253
-
254
187
static inline I JOIN (A , erase )(A * self , T value )
255
188
{
256
189
// TODO binary_search pos
@@ -309,36 +242,6 @@ static inline A JOIN(A, copy)(A *self)
309
242
return other ;
310
243
}
311
244
312
- static inline I JOIN (A , find )(A * self , T key )
313
- {
314
- // FIXME binary_search
315
- //vec_foreach(T, self, ref)
316
- // if (JOIN(A, _equal)(self, ref, &key))
317
- // return JOIN(I, iter)(self, ref - &self->vector[0]);
318
- return JOIN (A , end (self ));
319
- }
320
-
321
- // move elements from range to the end of out.
322
- // different to C++ where the deletion is skipped.
323
- // the STL does no move, just does assignment. (like our at)
324
- static inline A * JOIN (A , move_range )(I * range , A * out )
325
- {
326
- static T zero ;
327
- A * self = range -> container ;
328
- T * ref = range -> ref ;
329
- while (ref != range -> end )
330
- {
331
- JOIN (A , push_back )(out , * ref );
332
- // erase without free
333
- size_t index = ref - & self -> vector [0 ];
334
- memmove (ref , ref + 1 , (self -> size - index - 1 ) * sizeof (T ));
335
- self -> vector [self -> size - 1 ] = zero ;
336
- self -> size -- ;
337
- ref ++ ;
338
- }
339
- return out ;
340
- }
341
-
342
245
#ifdef INCLUDE_ALGORITHM
343
246
#include <ctl/algorithm.h>
344
247
#endif
0 commit comments