Skip to content

Commit da8585c

Browse files
committed
more svec
1 parent ba4c7cf commit da8585c

File tree

3 files changed

+503
-134
lines changed

3 files changed

+503
-134
lines changed

ctl/sorted_vector.h

Lines changed: 36 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
#define CTL_SVEC
99
#define HOLD
1010
#define vec svec
11+
1112
//#define _vec _svec
1213
// undefined:
1314
#define set __SET
1415
#define push_back __PUSH_BACK
1516
#define push_front __PUSH_FRONT
17+
#define emplace __EMPLACE
1618
#define emplace_back __EMPLACE_BACK
1719
#define sort __SORT
1820
// replaced:
1921
#define insert __INSERT
2022
#define erase __ERASE
21-
#define emplace __EMPLACE
2223
#define assign_range __ASSIGN_RANGE
2324
#define assign_generic __ASSIGN_GENERIC
24-
#define copy __COPY
2525

2626
#include <ctl/vector.h>
2727

@@ -38,22 +38,42 @@
3838
#undef assign_range
3939
#undef assign_generic
4040

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+
}
4249

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)
4551
{
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+
}
4860
{
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];
5470
}
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+
//}
5777
}
5878

5979
// FIXME sorted
@@ -65,7 +85,7 @@ static inline void JOIN(A, assign_range)(A *self, T *from, T *last)
6585
while(from != last)
6686
{
6787
if (i >= orig_size) // grow
68-
JOIN(A, push_back)(self, self->copy(from));
88+
JOIN(A, insert)(self, self->copy(from));
6989
else
7090
{
7191
T *ref = &self->vector[i];
@@ -92,7 +112,7 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
92112
while(!done(range))
93113
{
94114
if (i >= orig_size) // grow
95-
JOIN(A, push_back)(self, self->copy(ref(range)));
115+
JOIN(A, insert)(self, self->copy(ref(range)));
96116
else
97117
{
98118
T *sref = &self->vector[i];
@@ -108,20 +128,6 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
108128
JOIN(A, pop_back)(self);
109129
}
110130

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-
125131
static inline I JOIN(A, erase_index)(A *self, size_t index)
126132
{
127133
static T zero;
@@ -178,79 +184,6 @@ static inline I *JOIN(A, erase_range)(I *range)
178184
return range;
179185
}
180186

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-
254187
static inline I JOIN(A, erase)(A* self, T value)
255188
{
256189
// TODO binary_search pos
@@ -309,36 +242,6 @@ static inline A JOIN(A, copy)(A *self)
309242
return other;
310243
}
311244

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-
342245
#ifdef INCLUDE_ALGORITHM
343246
#include <ctl/algorithm.h>
344247
#endif

ctl/vector.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,9 @@ static inline size_t JOIN(A, erase_if)(A *self, int (*_match)(T *))
734734
#ifndef CTL_STR
735735
static inline I JOIN(A, find)(A *self, T key)
736736
{
737-
vec_foreach(T, self, ref) if (JOIN(A, _equal)(self, ref, &key)) return JOIN(I, iter)(self, ref - &self->vector[0]);
737+
vec_foreach(T, self, ref)
738+
if (JOIN(A, _equal)(self, ref, &key))
739+
return JOIN(I, iter)(self, ref - &self->vector[0]);
738740
return JOIN(A, end(self));
739741
}
740742
#endif

0 commit comments

Comments
 (0)