tag/TagPool: add constexpr MAX_REF
This commit is contained in:
parent
cf7c1afb93
commit
f1285a6dfd
@ -23,6 +23,8 @@
|
|||||||
#include "util/Cast.hxx"
|
#include "util/Cast.hxx"
|
||||||
#include "util/VarSize.hxx"
|
#include "util/VarSize.hxx"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -36,6 +38,8 @@ struct TagPoolSlot {
|
|||||||
unsigned char ref;
|
unsigned char ref;
|
||||||
TagItem item;
|
TagItem item;
|
||||||
|
|
||||||
|
static constexpr unsigned MAX_REF = std::numeric_limits<decltype(ref)>::max();
|
||||||
|
|
||||||
TagPoolSlot(TagPoolSlot *_next, TagType type,
|
TagPoolSlot(TagPoolSlot *_next, TagType type,
|
||||||
const char *value, size_t length)
|
const char *value, size_t length)
|
||||||
:next(_next), ref(1) {
|
:next(_next), ref(1) {
|
||||||
@ -116,7 +120,7 @@ tag_pool_get_item(TagType type, const char *value, size_t length)
|
|||||||
if (slot->item.type == type &&
|
if (slot->item.type == type &&
|
||||||
length == strlen(slot->item.value) &&
|
length == strlen(slot->item.value) &&
|
||||||
memcmp(value, slot->item.value, length) == 0 &&
|
memcmp(value, slot->item.value, length) == 0 &&
|
||||||
slot->ref < 0xff) {
|
slot->ref < TagPoolSlot::MAX_REF) {
|
||||||
assert(slot->ref > 0);
|
assert(slot->ref > 0);
|
||||||
++slot->ref;
|
++slot->ref;
|
||||||
return &slot->item;
|
return &slot->item;
|
||||||
@ -135,11 +139,11 @@ tag_pool_dup_item(TagItem *item)
|
|||||||
|
|
||||||
assert(slot->ref > 0);
|
assert(slot->ref > 0);
|
||||||
|
|
||||||
if (slot->ref < 0xff) {
|
if (slot->ref < TagPoolSlot::MAX_REF) {
|
||||||
++slot->ref;
|
++slot->ref;
|
||||||
return item;
|
return item;
|
||||||
} else {
|
} else {
|
||||||
/* the reference counter overflows above 0xff;
|
/* the reference counter overflows above MAX_REF;
|
||||||
duplicate the item, and start with 1 */
|
duplicate the item, and start with 1 */
|
||||||
size_t length = strlen(item->value);
|
size_t length = strlen(item->value);
|
||||||
auto slot_p = tag_value_slot_p(item->type,
|
auto slot_p = tag_value_slot_p(item->type,
|
||||||
|
Loading…
Reference in New Issue
Block a user