Database-Sophia
view release on metacpan or search on metacpan
Sophia-src/db/ref.h view on Meta::CPAN
#ifndef SP_KEY_H_
#define SP_KEY_H_
/*
* sophia database
* sphia.org
*
* Copyright (c) Dmitry Simonenko
* BSD License
*/
typedef struct spref spref;
typedef struct sprefset sprefset;
#define SPREFNONE 0
#define SPREFD 1
#define SPREFM 2
struct spref {
uint8_t type;
union {
spvh *vh;
spv *v;
} v;
} sppacked;
struct sprefset {
spref *r;
int used;
int max;
};
static inline char*
sp_refk(spref *r) {
switch (r->type) {
case SPREFD: return r->v.vh->key;
case SPREFM: return r->v.v->key;
}
return NULL;
}
static inline size_t
sp_refksize(spref *r) {
switch (r->type) {
case SPREFD: return r->v.vh->size;
case SPREFM: return r->v.v->size;
}
return 0;
}
static inline char*
sp_refv(spref *r, char *p) {
switch (r->type) {
case SPREFD: return p + r->v.vh->voffset;
case SPREFM: return sp_vv(r->v.v);
}
return NULL;
}
static inline size_t
sp_refvsize(spref *r) {
switch (r->type) {
case SPREFD: return r->v.vh->vsize;
case SPREFM: return sp_vvsize(r->v.v);
}
return 0;
}
static inline int
sp_refisdel(spref *r) {
register int flags = 0;
switch (r->type) {
case SPREFM: flags = r->v.v->flags;
break;
case SPREFD: flags = r->v.vh->flags;
break;
}
return (flags & SPDEL? 1: 0);
}
static inline int
sp_refsetinit(sprefset *s, spa *a, int count) {
s->r = sp_malloc(a, count * sizeof(spref));
if (spunlikely(s->r == NULL))
return -1;
s->used = 0;
s->max = count;
return 0;
}
static inline void
sp_refsetfree(sprefset *s, spa *a) {
if (s->r) {
sp_free(a, s->r);
s->r = NULL;
}
}
static inline void
sp_refsetadd(sprefset *s, spref *r) {
assert(s->used < s->max);
s->r[s->used] = *r;
s->used++;
}
static inline void
sp_refsetreset(sprefset *s) {
s->used = 0;
}
#endif
( run in 0.609 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )