[内部実装]
#include "kclib1.h"
void KIndexS_init(KIndexS *w, int s1, void *cmp, void *opt)
{
KSizPtr_init(&w->sp, s1 * sizeof (void *));
w->cmp = cmp;
w->opt = opt;
}
void KIndexS_free(KIndexS *w)
{
KSizPtr_free(&w->sp);
}
int KIndexS_search(KIndexS *w, void *key, int *cr)
{
int a, b, c, cc, ccb;
int (*cmp)(void *, void *, void *);
void *opt = w->opt, *pk = &key;
if (w->sp.s <= 0) {
*cr = -1;
return 0;
}
cmp = w->cmp;
cc = cmp(opt, pk, w->sp.p);
if (cc <= 0) {
*cr = cc;
return 0;
}
cc = cmp(opt, pk, w->sp.p + w->sp.s - sizeof (void *));
if (cc > 0) {
*cr = -1;
return w->sp.s;
}
if (cc == 0) {
*cr = 0;
return w->sp.s - sizeof (void *);
}
ccb = cc;
a = 0;
b = w->sp.s - sizeof (void *);
for (;;) {
c = ((b - a) >> 1) & (- sizeof (void *));
if (c == 0) break;
c += a;
cc = cmp(opt, pk, w->sp.p + c);
if (cc > 0)
a = c;
else {
b = c;
ccb = c;
}
}
*cr = cc;
return b;
}
int KIndexS_ins(KIndexS *w, void *d)
{
int cr, i;
i = KIndexS_search(w, d, &cr);
// if (cr == 0) return ~i;
KSizPtr_insPtr(&w->sp, i, d);
return i;
}
int KIndexS_del(KIndexS *w, void *d)
{
int cr, i;
i = KIndexS_search(w, d, &cr);
if (cr != 0) return ~i;
if (*((void **) (w->sp.p + i)) != d) return 0x80000000;
KSizPtr_delPtr(&w->sp, i);
return i;
}
void KIndexS_add(KIndexS *w, void *d)
{
KSizPtr_addPtr(&w->sp, d);
}
void KIndexS_sort(KIndexS *w)
{
kqsort(w->sp.p, w->sp.s / sizeof (void *), sizeof (void *), w->cmp, w->opt);
}
int KIndexS_getN(KIndexS *w)
{
return w->sp.s / sizeof (void *);
}
void *KIndexS_getPtr(KIndexS *w, int i)
{
return *((void **) (w->sp.p + i * sizeof (void *)));
}