1/* 2 * Copyright 2009-2013, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _PACKAGE__HPKG__PRIVATE__STRINGS_H_ 6#define _PACKAGE__HPKG__PRIVATE__STRINGS_H_ 7 8 9#include <new> 10 11#include <util/OpenHashTable.h> 12 13 14namespace BPackageKit { 15 16namespace BHPKG { 17 18namespace BPrivate { 19 20 21uint32 hash_string(const char* string); 22 23 24struct CachedString { 25 char* string; 26 int32 index; 27 uint32 usageCount; 28 CachedString* next; // hash table link 29 30 CachedString() 31 : 32 string(NULL), 33 index(-1), 34 usageCount(1) 35 { 36 } 37 38 ~CachedString() 39 { 40 free(string); 41 } 42 43 bool Init(const char* string) 44 { 45 this->string = strdup(string); 46 if (this->string == NULL) 47 return false; 48 49 return true; 50 } 51}; 52 53 54struct CachedStringHashDefinition { 55 typedef const char* KeyType; 56 typedef CachedString ValueType; 57 58 size_t HashKey(const char* key) const 59 { 60 return hash_string(key); 61 } 62 63 size_t Hash(const CachedString* value) const 64 { 65 return HashKey(value->string); 66 } 67 68 bool Compare(const char* key, const CachedString* value) const 69 { 70 return strcmp(value->string, key) == 0; 71 } 72 73 CachedString*& GetLink(CachedString* value) const 74 { 75 return value->next; 76 } 77}; 78 79 80typedef BOpenHashTable<CachedStringHashDefinition> CachedStringTable; 81 82 83struct CachedStringUsageGreater { 84 bool operator()(const CachedString* a, const CachedString* b) 85 { 86 return a->usageCount > b->usageCount; 87 } 88}; 89 90 91struct StringCache : public CachedStringTable { 92 StringCache(); 93 ~StringCache(); 94 95 CachedString* Get(const char* value); 96 void Put(CachedString* string); 97}; 98 99 100} // namespace BPrivate 101 102} // namespace BHPKG 103 104} // namespace BPackageKit 105 106 107#endif // _PACKAGE__HPKG__PRIVATE__STRINGS_H_ 108