Fix removing a tag unsetting the bit array even if more elements with that tag exist

This commit is contained in:
James R 2020-12-05 01:14:52 -08:00
parent ae663e7247
commit e5a3e6a845
3 changed files with 25 additions and 6 deletions

View File

@ -145,7 +145,7 @@ static int lib_numTaggroupElements(lua_State *L)
else else
{ {
const taggroup_t ** garray = lua_touserdata(L, up_garray); const taggroup_t ** garray = lua_touserdata(L, up_garray);
lua_pushnumber(L, garray[tag] ? garray[tag]->count : 0); lua_pushnumber(L, Taggroup_Count(garray[tag]));
} }
return 1; return 1;
} }

View File

@ -110,6 +110,12 @@ size_t Taggroup_Find (const taggroup_t *group, const size_t id)
return -1; return -1;
} }
/// group->count, but also checks for NULL
size_t Taggroup_Count (const taggroup_t *group)
{
return group ? group->count : 0;
}
/// Iterate thru elements in a global taggroup. /// Iterate thru elements in a global taggroup.
INT32 Taggroup_Iterate INT32 Taggroup_Iterate
( taggroup_t *garray[], ( taggroup_t *garray[],
@ -153,9 +159,10 @@ void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id)
return; return;
if (! in_bit_array(tags_available, tag)) if (! in_bit_array(tags_available, tag))
{
num_tags++; num_tags++;
set_bit_array(tags_available, tag);
set_bit_array(tags_available, tag); }
// Create group if empty. // Create group if empty.
if (!group) if (!group)
@ -182,6 +189,16 @@ void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id)
group->elements[i] = id; group->elements[i] = id;
} }
static size_t total_elements_with_tag (const mtag_t tag)
{
return
(
Taggroup_Count(tags_sectors[tag]) +
Taggroup_Count(tags_lines[tag]) +
Taggroup_Count(tags_mapthings[tag])
);
}
/// Remove an element from a global taggroup. /// Remove an element from a global taggroup.
void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id) void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id)
{ {
@ -197,10 +214,11 @@ void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id)
if ((rempos = Taggroup_Find(group, id)) == (size_t)-1) if ((rempos = Taggroup_Find(group, id)) == (size_t)-1)
return; return;
if (in_bit_array(tags_available, tag)) if (group->count == 1 && total_elements_with_tag(tag) == 1)
{
num_tags--; num_tags--;
unset_bit_array(tags_available, tag);
unset_bit_array(tags_available, tag); }
// Strip away taggroup if no elements left. // Strip away taggroup if no elements left.
if (!(oldcount = group->count--)) if (!(oldcount = group->count--))

View File

@ -54,6 +54,7 @@ extern taggroup_t* tags_mapthings[];
void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id); void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id);
void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id); void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id);
size_t Taggroup_Find (const taggroup_t *group, const size_t id); size_t Taggroup_Find (const taggroup_t *group, const size_t id);
size_t Taggroup_Count (const taggroup_t *group);
INT32 Taggroup_Iterate INT32 Taggroup_Iterate
( taggroup_t *garray[], ( taggroup_t *garray[],