38 template<
typename K,
typename V>
42 time_t lifetime, KeyTime=0;
49 if ((hip = Lookup(KeyVal, &hiploc)))
52 (LifeTime || hip->
Time() ? LifeTime + time(0) : 0) );}
54 && ((lifetime=hip->
Time())==0||lifetime>=time(0)))
return hip->
Data();
55 hip->
Set(KeyData, KeyTime);
61 if (LifeTime) KeyTime = LifeTime + time(0);
75 template<
typename K,
typename V>
84 if (!(hip = Lookup(KeyVal, &hiploc)))
return -ENOENT;
88 if ((cnt = hip->
Count())) {hip->
Update(cnt-1, 0);
return cnt;}
100 template<
typename K,
typename V>
109 if (!(hip = Lookup(KeyVal, &hiploc)))
return (V *)0;
110 if ( (lifetime = hip->
Time()) && lifetime < time(0) )
114 if (KeyTime) *KeyTime = (time_t)0;
120 if (KeyTime) *KeyTime = lifetime;
128 template<
typename K,
typename V>
136 for (i = 0; i < 16; i++)
137 {
if (rashTable[i].Item)
138 {
delete rashTable[i].Item; rashTable[i].Item = 0;}
139 if (rashTable[i].Table)
140 {
delete []rashTable[i].Table; rashTable[i].Table = 0;}
152 template<
typename K,
typename V>
154 int (*func)(K, V,
void *),
void *Arg)
164 for (i = 0; i < 16; i++)
165 {
if ((hip = tab[i].Item))
166 {
if ((lifetime = hip->
Time()) && lifetime < time(0)) rc = -1;
167 else if ( (rc = (*func)(hip->
Key(), *hip->
Data(), Arg)) > 0 )
169 if (rc < 0) {
delete hip;
174 if (tab[i].Table && (theVal =
Apply(tab[i].Table, func, Arg)))
184 template<
typename K,
typename V>
188 unsigned long long kVal = key2ull(theKey);
196 }
while(kVal && (tab = tab[j].Table));
213 template<
typename K,
typename V>
216 unsigned long long kVal = key2ull(theKey);
223 if ((kVal = kVal >> 4))
224 {
if (tab[j].Table) tab = tab[j].
Table;
231 tab[j].
Item = theItem;
239 template<
typename K,
typename V>
242 #ifdef Xrd_Big_Endian
243 union {
unsigned long long us; K kv[8/
sizeof(K)];} Val;
245 Val.kv[8/
sizeof(K)-1] = theKey;
247 union {
unsigned long long us; K kv;} Val;
void Set(V &keyData, time_t newtime)
void Update(int newcount, time_t newtime)
XrdOucRash_Tent< K, V > * Table
XrdOucRash_Item< K, V > * Item
V * Add(K KeyVal, V &KeyData, time_t LifeTime=0, XrdOucRash_Options opt=Rash_default)
V * Apply(int(*func)(K, V, void *), void *Arg)
V * Find(K KeyVal, time_t *KeyTime=0)
static auto Apply(FUNC &&func, std::tuple< ARGs... > &tup) -> decltype(tuple_call_impl(func, tup, typename seq_gen< sizeof...(ARGs)>::type{}))