Bitvec now is RAII (sorta).

I should probably use either a `std::vector< uint8_t >` or
maybe a bitvector object... but for now, this is progress.
This commit is contained in:
2025-08-01 00:59:32 -04:00
parent c47430b1ae
commit a16f3cb74d
4 changed files with 17 additions and 14 deletions

View File

@ -21,9 +21,9 @@ extern "C" {
/** /**
* Create a new bitvec with 'num_bits' size * Create a new bitvec with 'num_bits' size
*/ */
bitvec_t *a_Bitvec_new(int num_bits) std::unique_ptr< bitvec_t > a_Bitvec_new(int num_bits)
{ {
bitvec_t *bvec = dNew(bitvec_t, 1); auto bvec = std::make_unique< bitvec_t >();
bvec->vec = dNew0(uchar_t, num_bits/BVEC_SIZE + 1); bvec->vec = dNew0(uchar_t, num_bits/BVEC_SIZE + 1);
bvec->len = num_bits; bvec->len = num_bits;
@ -41,12 +41,9 @@ void a_Bitvec_clear(bitvec_t *bvec)
/** /**
* Free a bitvec * Free a bitvec
*/ */
void a_Bitvec_free(bitvec_t *bvec) bitvec_t::~bitvec_t()
{ {
if (bvec) { dFree(vec);
dFree(bvec->vec);
dFree(bvec);
}
} }
/** /**

View File

@ -1,6 +1,11 @@
#ifndef __BITVEC_H__ #ifndef __BITVEC_H__
#define __BITVEC_H__ #define __BITVEC_H__
extern "C++"
{
#include <memory>
}
#include "d_size.h" #include "d_size.h"
using BVEC_TYPE= uchar_t; using BVEC_TYPE= uchar_t;
@ -9,6 +14,8 @@ constexpr auto BVEC_SIZE= sizeof(BVEC_TYPE);
struct bitvec_t { struct bitvec_t {
BVEC_TYPE *vec; BVEC_TYPE *vec;
int len; /* number of bits [1 based] */ int len; /* number of bits [1 based] */
~bitvec_t();
}; };
@ -16,8 +23,7 @@ extern "C" {
/* /*
* Function prototypes * Function prototypes
*/ */
bitvec_t *a_Bitvec_new(int bits); std::unique_ptr< bitvec_t > a_Bitvec_new(int bits);
void a_Bitvec_free(bitvec_t *bvec);
int a_Bitvec_get_bit(bitvec_t *bvec, int pos); int a_Bitvec_get_bit(bitvec_t *bvec, int pos);
void a_Bitvec_set_bit(bitvec_t *bvec, int pos); void a_Bitvec_set_bit(bitvec_t *bvec, int pos);
void a_Bitvec_clear(bitvec_t *bvec); void a_Bitvec_clear(bitvec_t *bvec);

View File

@ -183,7 +183,7 @@ static void Dicache_remove(const DilloUrl *Url, int version)
/* entry cleanup */ /* entry cleanup */
delete entry->url; delete entry->url;
dFree(entry->cmap); dFree(entry->cmap);
a_Bitvec_free(entry->BitVec); delete entry->BitVec;
a_Imgbuf_unref(entry->v_imgbuf); a_Imgbuf_unref(entry->v_imgbuf);
if (entry->Decoder) { if (entry->Decoder) {
entry->Decoder(CA_Abort, reinterpret_cast< CacheClient * >( entry->DecoderData )); entry->Decoder(CA_Abort, reinterpret_cast< CacheClient * >( entry->DecoderData ));
@ -270,7 +270,7 @@ void a_Dicache_set_parms(DilloUrl *url, int version, DilloImage *Image,
DicEntry->width = width; DicEntry->width = width;
DicEntry->height = height; DicEntry->height = height;
DicEntry->type = type; DicEntry->type = type;
DicEntry->BitVec = a_Bitvec_new((int)height); DicEntry->BitVec = a_Bitvec_new((int)height).release();
DicEntry->State = DIC_SetParms; DicEntry->State = DIC_SetParms;
dicache_size_total += DicEntry->TotalSize; dicache_size_total += DicEntry->TotalSize;
@ -592,7 +592,7 @@ void a_Dicache_freeall(void)
dList_remove_fast(CachedIMGs, entry); dList_remove_fast(CachedIMGs, entry);
delete entry->url; delete entry->url;
dFree(entry->cmap); dFree(entry->cmap);
a_Bitvec_free(entry->BitVec); delete entry->BitVec;
a_Imgbuf_unref(entry->v_imgbuf); a_Imgbuf_unref(entry->v_imgbuf);
dicache_size_total -= entry->TotalSize; dicache_size_total -= entry->TotalSize;
dFree(entry); dFree(entry);

View File

@ -78,7 +78,7 @@ void *a_Image_get_dw(DilloImage *Image)
*/ */
static void Image_free(DilloImage *Image) static void Image_free(DilloImage *Image)
{ {
a_Bitvec_free(Image->BitVec); delete Image->BitVec;
dFree(Image); dFree(Image);
} }
@ -118,7 +118,7 @@ void a_Image_set_parms(DilloImage *Image, void *v_imgbuf, DilloUrl *url,
I2IR(Image)->setBuffer((Imgbuf*)v_imgbuf, resize); I2IR(Image)->setBuffer((Imgbuf*)v_imgbuf, resize);
if (!Image->BitVec) if (!Image->BitVec)
Image->BitVec = a_Bitvec_new(height); Image->BitVec = a_Bitvec_new(height).release();
Image->width = width; Image->width = width;
Image->height = height; Image->height = height;
Image->State = IMG_SetParms; Image->State = IMG_SetParms;