xref: /haiku/headers/private/package/hpkg/Strings.h (revision 5fb1c6ff1f55fe4094a761b653041b3a0b9abf1d)
10d6b3b20SOliver Tappe /*
20d6b3b20SOliver Tappe  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
30d6b3b20SOliver Tappe  * Distributed under the terms of the MIT License.
40d6b3b20SOliver Tappe  */
5*5fb1c6ffSOliver Tappe #ifndef _PACKAGE__HPKG__PRIVATE__STRINGS_H_
6*5fb1c6ffSOliver Tappe #define _PACKAGE__HPKG__PRIVATE__STRINGS_H_
70d6b3b20SOliver Tappe 
80d6b3b20SOliver Tappe 
90d6b3b20SOliver Tappe #include <util/OpenHashTable.h>
100d6b3b20SOliver Tappe 
110d6b3b20SOliver Tappe 
120d6b3b20SOliver Tappe namespace BPackageKit {
130d6b3b20SOliver Tappe 
14*5fb1c6ffSOliver Tappe namespace BHPKG {
150d6b3b20SOliver Tappe 
160d6b3b20SOliver Tappe namespace BPrivate {
170d6b3b20SOliver Tappe 
180d6b3b20SOliver Tappe 
190d6b3b20SOliver Tappe uint32	hash_string(const char* string);
200d6b3b20SOliver Tappe 
210d6b3b20SOliver Tappe 
220d6b3b20SOliver Tappe struct CachedString {
230d6b3b20SOliver Tappe 	char*			string;
240d6b3b20SOliver Tappe 	int32			index;
250d6b3b20SOliver Tappe 	uint32			usageCount;
260d6b3b20SOliver Tappe 	CachedString*	next;	// hash table link
270d6b3b20SOliver Tappe 
280d6b3b20SOliver Tappe 	CachedString()
290d6b3b20SOliver Tappe 		:
300d6b3b20SOliver Tappe 		string(NULL),
310d6b3b20SOliver Tappe 		index(-1),
320d6b3b20SOliver Tappe 		usageCount(1)
330d6b3b20SOliver Tappe 	{
340d6b3b20SOliver Tappe 	}
350d6b3b20SOliver Tappe 
360d6b3b20SOliver Tappe 	~CachedString()
370d6b3b20SOliver Tappe 	{
380d6b3b20SOliver Tappe 		free(string);
390d6b3b20SOliver Tappe 	}
400d6b3b20SOliver Tappe 
410d6b3b20SOliver Tappe 	bool Init(const char* string)
420d6b3b20SOliver Tappe 	{
430d6b3b20SOliver Tappe 		this->string = strdup(string);
440d6b3b20SOliver Tappe 		if (this->string == NULL)
450d6b3b20SOliver Tappe 			return false;
460d6b3b20SOliver Tappe 
470d6b3b20SOliver Tappe 		return true;
480d6b3b20SOliver Tappe 	}
490d6b3b20SOliver Tappe };
500d6b3b20SOliver Tappe 
510d6b3b20SOliver Tappe 
520d6b3b20SOliver Tappe struct CachedStringHashDefinition {
530d6b3b20SOliver Tappe 	typedef const char*		KeyType;
540d6b3b20SOliver Tappe 	typedef	CachedString	ValueType;
550d6b3b20SOliver Tappe 
560d6b3b20SOliver Tappe 	size_t HashKey(const char* key) const
570d6b3b20SOliver Tappe 	{
580d6b3b20SOliver Tappe 		return hash_string(key);
590d6b3b20SOliver Tappe 	}
600d6b3b20SOliver Tappe 
610d6b3b20SOliver Tappe 	size_t Hash(const CachedString* value) const
620d6b3b20SOliver Tappe 	{
630d6b3b20SOliver Tappe 		return HashKey(value->string);
640d6b3b20SOliver Tappe 	}
650d6b3b20SOliver Tappe 
660d6b3b20SOliver Tappe 	bool Compare(const char* key, const CachedString* value) const
670d6b3b20SOliver Tappe 	{
680d6b3b20SOliver Tappe 		return strcmp(value->string, key) == 0;
690d6b3b20SOliver Tappe 	}
700d6b3b20SOliver Tappe 
710d6b3b20SOliver Tappe 	CachedString*& GetLink(CachedString* value) const
720d6b3b20SOliver Tappe 	{
730d6b3b20SOliver Tappe 		return value->next;
740d6b3b20SOliver Tappe 	}
750d6b3b20SOliver Tappe };
760d6b3b20SOliver Tappe 
770d6b3b20SOliver Tappe 
780d6b3b20SOliver Tappe typedef BOpenHashTable<CachedStringHashDefinition> CachedStringTable;
790d6b3b20SOliver Tappe 
800d6b3b20SOliver Tappe 
810d6b3b20SOliver Tappe struct CachedStringUsageGreater {
820d6b3b20SOliver Tappe 	bool operator()(const CachedString* a, const CachedString* b)
830d6b3b20SOliver Tappe 	{
840d6b3b20SOliver Tappe 		return a->usageCount > b->usageCount;
850d6b3b20SOliver Tappe 	}
860d6b3b20SOliver Tappe };
870d6b3b20SOliver Tappe 
880d6b3b20SOliver Tappe 
890d6b3b20SOliver Tappe }	// namespace BPrivate
900d6b3b20SOliver Tappe 
91*5fb1c6ffSOliver Tappe }	// namespace BHPKG
920d6b3b20SOliver Tappe 
930d6b3b20SOliver Tappe }	// namespace BPackageKit
940d6b3b20SOliver Tappe 
950d6b3b20SOliver Tappe 
96*5fb1c6ffSOliver Tappe #endif	// _PACKAGE__HPKG__PRIVATE__STRINGS_H_
97