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
*/
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->len = num_bits;
@ -41,12 +41,9 @@ void a_Bitvec_clear(bitvec_t *bvec)
/**
* Free a bitvec
*/
void a_Bitvec_free(bitvec_t *bvec)
bitvec_t::~bitvec_t()
{
if (bvec) {
dFree(bvec->vec);
dFree(bvec);
}
dFree(vec);
}
/**

View File

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

View File

@ -183,7 +183,7 @@ static void Dicache_remove(const DilloUrl *Url, int version)
/* entry cleanup */
delete entry->url;
dFree(entry->cmap);
a_Bitvec_free(entry->BitVec);
delete entry->BitVec;
a_Imgbuf_unref(entry->v_imgbuf);
if (entry->Decoder) {
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->height = height;
DicEntry->type = type;
DicEntry->BitVec = a_Bitvec_new((int)height);
DicEntry->BitVec = a_Bitvec_new((int)height).release();
DicEntry->State = DIC_SetParms;
dicache_size_total += DicEntry->TotalSize;
@ -592,7 +592,7 @@ void a_Dicache_freeall(void)
dList_remove_fast(CachedIMGs, entry);
delete entry->url;
dFree(entry->cmap);
a_Bitvec_free(entry->BitVec);
delete entry->BitVec;
a_Imgbuf_unref(entry->v_imgbuf);
dicache_size_total -= entry->TotalSize;
dFree(entry);

View File

@ -78,7 +78,7 @@ void *a_Image_get_dw(DilloImage *Image)
*/
static void Image_free(DilloImage *Image)
{
a_Bitvec_free(Image->BitVec);
delete Image->BitVec;
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);
if (!Image->BitVec)
Image->BitVec = a_Bitvec_new(height);
Image->BitVec = a_Bitvec_new(height).release();
Image->width = width;
Image->height = height;
Image->State = IMG_SetParms;