Skip to content

Commit

Permalink
more svec
Browse files Browse the repository at this point in the history
  • Loading branch information
rurban committed Feb 21, 2024
1 parent fd43d41 commit 68d27e7
Show file tree
Hide file tree
Showing 3 changed files with 503 additions and 134 deletions.
169 changes: 36 additions & 133 deletions ctl/sorted_vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@
#define CTL_SVEC
#define HOLD
#define vec svec

//#define _vec _svec
// undefined:
#define set __SET
#define push_back __PUSH_BACK
#define push_front __PUSH_FRONT
#define emplace __EMPLACE
#define emplace_back __EMPLACE_BACK
#define sort __SORT
// replaced:
#define insert __INSERT
#define erase __ERASE
#define emplace __EMPLACE
#define assign_range __ASSIGN_RANGE
#define assign_generic __ASSIGN_GENERIC
#define copy __COPY

#include <ctl/vector.h>

Expand All @@ -38,22 +38,42 @@
#undef assign_range
#undef assign_generic

#define A JOIN(svec, T)
static inline I JOIN(A, find)(A *self, T key)
{
// FIXME binary_search
vec_foreach(T, self, ref)
if (JOIN(A, _equal)(self, ref, &key))
return JOIN(I, iter)(self, ref - &self->vector[0]);
return JOIN(A, end(self));
}

// FIXME sorted
static inline void JOIN(A, emplace)(I *pos, T *value)
static inline void JOIN(A, insert)(A *self, T value)
{
A *self = pos->container;
if (!JOIN(I, done)(pos))
// TODO binary_search pos
T *pos = JOIN(A, back)(self);
vec_foreach(T, self, ref)
if (!self.compare(&value, ref)) // lower
{
pos = ref - &self->vector[0]);
break;
}
{
size_t index = pos->ref - self->vector;
//JOIN(A, emplace_back)(self, JOIN(A, back)(self));
for (size_t i = self->size - 2; i > index; i--)
self->vector[i] = self->vector[i - 1];
self->vector[index] = *value;
//size_t index = pos->ref - self->vector;
//size_t end = pos->end - self->vector;
// TODO memmove with POD
//JOIN(A, push_back)(self, *JOIN(A, back)(self));
//for (size_t i = self->size - 2; i > index; i--)
// self->vector[i] = self->vector[i - 1];
//self->vector[index] = value;
//pos->ref = &self->vector[index];
//pos->end = &self->vector[end];
}
else
JOIN(A, emplace_back)(self, value);
//else
//{
// // or at end
// JOIN(A, push_back)(self, value);
// pos->end = pos->ref = &self->vector[self->size];
//}
}

// FIXME sorted
Expand All @@ -65,7 +85,7 @@ static inline void JOIN(A, assign_range)(A *self, T *from, T *last)
while(from != last)
{
if (i >= orig_size) // grow
JOIN(A, push_back)(self, self->copy(from));
JOIN(A, insert)(self, self->copy(from));
else
{
T *ref = &self->vector[i];
Expand All @@ -92,7 +112,7 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
while(!done(range))
{
if (i >= orig_size) // grow
JOIN(A, push_back)(self, self->copy(ref(range)));
JOIN(A, insert)(self, self->copy(ref(range)));
else
{
T *sref = &self->vector[i];
Expand All @@ -108,20 +128,6 @@ static inline void JOIN(A, assign_generic)(A *self, GI *range)
JOIN(A, pop_back)(self);
}

static inline void JOIN(A, insert_index)(A *self, size_t index, T value)
{
if (self->size > 0)
{
JOIN(A, push_back)(self, *JOIN(A, back)(self));
// TODO memmove with POD
for (size_t i = self->size - 2; i > index; i--)
self->vector[i] = self->vector[i - 1];
self->vector[index] = value;
}
else
JOIN(A, push_back)(self, value);
}

static inline I JOIN(A, erase_index)(A *self, size_t index)
{
static T zero;
Expand Down Expand Up @@ -178,79 +184,6 @@ static inline I *JOIN(A, erase_range)(I *range)
return range;
}

static inline void JOIN(A, insert)(A *self, T value)
{
// TODO binary_search pos
{
size_t index = pos->ref - self->vector;
size_t end = pos->end - self->vector;
// TODO memmove with POD
JOIN(A, push_back)(self, *JOIN(A, back)(self));
for (size_t i = self->size - 2; i > index; i--)
self->vector[i] = self->vector[i - 1];
self->vector[index] = value;
pos->ref = &self->vector[index];
pos->end = &self->vector[end];
}
else
{
// or at end
JOIN(A, push_back)(self, value);
pos->end = pos->ref = &self->vector[self->size];
}
}

static inline void JOIN(A, insert_count)(A *self, size_t count, T value)
{
// TODO binary_search pos
size_t index = pos->ref - self->vector;
JOIN(A, reserve)(self, self->size + count);
if (!JOIN(I, done)(pos))
{
for (size_t i = 0; i < count; i++)
JOIN(A, insert_index)(self, index++, self->copy(&value));
}
else
{
for (size_t i = 0; i < count; i++)
JOIN(A, push_back)(self, self->copy(&value));
}
#if defined CTL_STR
JOIN(A, reserve)(self, self->size);
#endif
if (self->free)
self->free(&value);
}

static inline void JOIN(A, insert_range)(A *self, I *range2)
{
// TODO binary_search pos
size_t index = pos->ref - self->vector;
size_t f2 = range2->ref - range2->container->vector;
size_t l2 = range2->end - range2->container->vector;
// only if not overlapping, and resize does no realloc
if (f2 < l2)
{
JOIN(A, reserve)(self, self->size + (l2 - f2));
if (self == range2->container)
{
range2->ref = &range2->container->vector[f2];
range2->end = &range2->container->vector[l2];
}
}
if (!JOIN(I, done)(pos))
{
foreach_range_(A, it, range2) if (it.ref) JOIN(A, insert_index)(self, index++, self->copy(it.ref));
}
else
{
foreach_range_(A, it, range2) if (it.ref) JOIN(A, push_back)(self, self->copy(it.ref));
}
#if defined CTL_STR
JOIN(A, reserve)(self, self->size);
#endif
}

static inline I JOIN(A, erase)(A* self, T value)
{
// TODO binary_search pos
Expand Down Expand Up @@ -309,36 +242,6 @@ static inline A JOIN(A, copy)(A *self)
return other;
}

static inline I JOIN(A, find)(A *self, T key)
{
// FIXME binary_search
//vec_foreach(T, self, ref)
// if (JOIN(A, _equal)(self, ref, &key))
// return JOIN(I, iter)(self, ref - &self->vector[0]);
return JOIN(A, end(self));
}

// move elements from range to the end of out.
// different to C++ where the deletion is skipped.
// the STL does no move, just does assignment. (like our at)
static inline A *JOIN(A, move_range)(I *range, A *out)
{
static T zero;
A *self = range->container;
T *ref = range->ref;
while (ref != range->end)
{
JOIN(A, push_back)(out, *ref);
// erase without free
size_t index = ref - &self->vector[0];
memmove(ref, ref + 1, (self->size - index - 1) * sizeof(T));
self->vector[self->size - 1] = zero;
self->size--;
ref++;
}
return out;
}

#ifdef INCLUDE_ALGORITHM
#include <ctl/algorithm.h>
#endif
Expand Down
4 changes: 3 additions & 1 deletion ctl/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,9 @@ static inline size_t JOIN(A, erase_if)(A *self, int (*_match)(T *))
#ifndef CTL_STR
static inline I JOIN(A, find)(A *self, T key)
{
vec_foreach(T, self, ref) if (JOIN(A, _equal)(self, ref, &key)) return JOIN(I, iter)(self, ref - &self->vector[0]);
vec_foreach(T, self, ref)
if (JOIN(A, _equal)(self, ref, &key))
return JOIN(I, iter)(self, ref - &self->vector[0]);
return JOIN(A, end(self));
}
#endif
Expand Down
Loading

0 comments on commit 68d27e7

Please sign in to comment.