Skip to content

Commit

Permalink
Refactor|StringPool: A pointer can be stored for each interned string
Browse files Browse the repository at this point in the history
User pointers can be used for constructing larger data structures
where case insensitive strings are used as keys.
  • Loading branch information
skyjake committed Mar 6, 2012
1 parent e9ad6fa commit d904618
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
4 changes: 4 additions & 0 deletions doomsday/engine/api/stringpool.h
Expand Up @@ -151,6 +151,10 @@ void StringPool_SetUserValue(StringPool* pool, StringPoolId id, uint value);
*/
uint StringPool_UserValue(StringPool* pool, StringPoolId id);

void StringPool_SetUserPointer(StringPool* pool, StringPoolId id, void* ptr);

void* StringPool_UserPointer(StringPool* pool, StringPoolId id);

/**
* Is @a str considered to be in the pool?
*
Expand Down
34 changes: 32 additions & 2 deletions doomsday/engine/portable/src/stringpool.cpp
Expand Up @@ -61,10 +61,11 @@ typedef uint InternalId;
class CaselessStr
{
public:
CaselessStr(const char* text = 0) : _id(0), _userValue(0) {
CaselessStr(const char* text = 0) : _id(0), _userValue(0), _userPointer(0) {
setText(text);
}
CaselessStr(const CaselessStr& other) : _id(other._id), _userValue(other._userValue) {
CaselessStr(const CaselessStr& other)
: _id(other._id), _userValue(other._userValue), _userPointer(0) {
setText(other._str.str);
}
void setText(const char* text) {
Expand All @@ -91,6 +92,12 @@ class CaselessStr
void setUserValue(uint value) {
_userValue = value;
}
void* userPointer() const {
return _userPointer;
}
void setUserPointer(void* ptr) {
_userPointer = ptr;
}
void serialize(Writer* writer) const {
Str_Write(&_str, writer);
Writer_WritePackedUInt32(writer, _id);
Expand All @@ -106,6 +113,7 @@ class CaselessStr
ddstring_t _str;
InternalId _id; ///< The id that refers to this string.
uint _userValue;
void* _userPointer;
};

/**
Expand Down Expand Up @@ -405,6 +413,28 @@ uint StringPool_UserValue(StringPool* pool, StringPoolId id)
return pool->idMap[internalId]->userValue(); // O(1)
}

void StringPool_SetUserPointer(StringPool* pool, StringPoolId id, void* ptr)
{
const InternalId internalId = IMPORT_ID(id);

assert(pool);
assert(internalId < pool->idMap.size());
assert(pool->idMap[internalId] != 0);

pool->idMap[internalId]->setUserPointer(ptr); // O(1)
}

void* StringPool_UserPointer(StringPool* pool, StringPoolId id)
{
const InternalId internalId = IMPORT_ID(id);

assert(pool);
assert(internalId < pool->idMap.size());
assert(pool->idMap[internalId] != 0);

return pool->idMap[internalId]->userPointer(); // O(1)
}

StringPoolId StringPool_IsInterned(const StringPool* pool, const ddstring_t* str)
{
assert(pool);
Expand Down

0 comments on commit d904618

Please sign in to comment.