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