X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/4d3c5111a2a7716e957547cb80a1efe7accabf6f..522c91c2baad8d9575ba62d48487800e1e0e7203:/sbr/vector.c?ds=inline diff --git a/sbr/vector.c b/sbr/vector.c index e3760651..6afe62aa 100644 --- a/sbr/vector.c +++ b/sbr/vector.c @@ -47,12 +47,6 @@ /* The number of elements bits needs to cover bit n, measured in bytes. */ #define BVEC_BYTES(n) (((n) / BVEC_BITS_BITS + 1) * BVEC_SIZEOF_BITS) -struct bvector { - unsigned long *bits; - size_t maxsize; - unsigned long tiny[2]; /* Default fixed-size storage for bits. */ -}; - /* bvector_resize ensures the storage used for bits can cover bit * newsize. It always increases the size of the storage used for bits, * even if newsize would have been covered by the existing storage. @@ -67,31 +61,44 @@ bvector_create (void) { assert (sizeof *vec->bits <= sizeof 1ul); NEW(vec); - vec->bits = vec->tiny; - vec->maxsize = BVEC_INIT_SIZE; - memset(vec->tiny, 0, sizeof vec->tiny); + bvector_init(vec); return vec; } +void bvector_init(struct bvector *bv) +{ + bv->bits = bv->tiny; + bv->maxsize = BVEC_INIT_SIZE; + memset(bv->tiny, 0, sizeof bv->tiny); +} + void bvector_copy (bvector_t dest, bvector_t src) { size_t bytes = BVEC_BYTES(src->maxsize); if (dest->bits != dest->tiny) free(dest->bits); - dest->bits = mh_xmalloc (bytes); + if (bytes <= sizeof dest->tiny) + dest->bits = dest->tiny; + else + dest->bits = mh_xmalloc (bytes); memcpy (dest->bits, src->bits, bytes); dest->maxsize = src->maxsize; } void bvector_free (bvector_t vec) { - if (vec->bits != vec->tiny) - free(vec->bits); + bvector_fini(vec); free (vec); } +void bvector_fini(struct bvector *bv) +{ + if (bv->bits != bv->tiny) + free(bv->bits); +} + void bvector_clear (bvector_t vec, size_t n) { if (n < vec->maxsize)