From a16f3cb74d031958a8e135a46d2bb2b2711577edc3ac88570971df927ed16a3a Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Fri, 1 Aug 2025 00:59:32 -0400 Subject: [PATCH] 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. --- src/bitvec.cc | 11 ++++------- src/bitvec.hh | 10 ++++++++-- src/dicache.cc | 6 +++--- src/image.cc | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/bitvec.cc b/src/bitvec.cc index 02b6458..73069d1 100644 --- a/src/bitvec.cc +++ b/src/bitvec.cc @@ -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); } /** diff --git a/src/bitvec.hh b/src/bitvec.hh index 2d61a84..281ab7d 100644 --- a/src/bitvec.hh +++ b/src/bitvec.hh @@ -1,6 +1,11 @@ #ifndef __BITVEC_H__ #define __BITVEC_H__ +extern "C++" +{ +#include +} + #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); diff --git a/src/dicache.cc b/src/dicache.cc index 5123bb5..f8438ca 100644 --- a/src/dicache.cc +++ b/src/dicache.cc @@ -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); diff --git a/src/image.cc b/src/image.cc index 8591b5a..d77695a 100644 --- a/src/image.cc +++ b/src/image.cc @@ -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;