28 # ifndef TPL_DYNLHASH_H 29 # define TPL_DYNLHASH_H 31 # include <tpl_lhash.H> 33 using namespace Aleph;
61 template <
typename Key,
typename Record,
class Cmp = Aleph::equal_to<Key>>
70 DLBucket(
const Key & key,
const Record & _record)
73 DLBucket(
const Key & key, Record && _record)
77 DLBucket(Key && key,
const Record & _record)
81 DLBucket(Key && key, Record && _record)
83 record(std::forward<Record>(_record)) { }
86 static DLBucket * record_to_bucket(Record * rec)
88 DLBucket * ret_val = 0;
89 size_t offset = (size_t) &ret_val->record;
90 return (DLBucket*) (((size_t) rec) - offset);
102 : table(_table), key(_key)
104 Record * record = table.
search(key);
105 bucket = record not_eq
nullptr ? record_to_bucket(record) :
nullptr;
108 operator const Record & ()
const 110 if (bucket ==
nullptr)
111 throw std::invalid_argument(
"access to unexisting entry");
113 return bucket->record;
116 DLProxy& operator = (
const Record& record)
118 if (bucket !=
nullptr)
120 bucket->record = record;
124 bucket =
new DLBucket (key, record);
125 table.LhashTable<Key>::insert(bucket);
129 DLProxy& operator = (
const DLProxy& proxy)
131 if (proxy.bucket ==
nullptr)
132 throw std::invalid_argument(
"access to unexisting entry");
134 if (bucket !=
nullptr)
136 bucket->record = proxy.bucket->record;
140 bucket =
new DLBucket (key, proxy.bucket->record);
141 table.LhashTable<Key>::insert(bucket);
173 DLBucket *
Bucket = (DLBucket*) it.get_curr_ne();
174 insert(Bucket->get_key(), Bucket->record);
210 Record * __insert(DLBucket * bucket)
213 return &bucket->record;
221 Record *
insert(
const Key & key,
const Record & record)
223 return __insert(
new DLBucket (key, record));
226 Record *
insert(
const Key & key, Record && record = Record())
228 return __insert(
new DLBucket(key, std::forward<Record>(record)));
231 Record *
insert(Key && key,
const Record & record)
233 return __insert(
new DLBucket (std::forward<Key>(key), record));
236 Record *
insert(Key && key, Record && record)
238 return __insert(
new DLBucket(std::forward<Key>(key),
239 std::forward<Record>(record)));
248 return bucket !=
nullptr ? &bucket->record :
nullptr;
253 void remove(Record * record)
255 DLBucket* bucket = record_to_bucket(record);
260 DLProxy operator [] (
const Key& key)
const 262 return DLProxy ( const_cast<DynLhashTable&>(*
this), key);
265 DLProxy operator [] (
const Key& key)
267 return DLProxy (*
this, key);
273 # endif // TPL_DYNLHASH_H Record * search(const Key &key)
Definition: tpl_dynLhash.H:245
Bucket * insert(Bucket *bucket)
Definition: tpl_lhash.H:216
Bucket * remove(Bucket *bucket) noexcept
Definition: tpl_lhash.H:288
Record * insert(const Key &key, const Record &record)
Definition: tpl_dynLhash.H:221
void empty() noexcept
VacÃa la tabla hash; libera memoria de todas las cubetas.
Definition: tpl_lhash.H:173
Definition: tpl_dynLhash.H:62
DynLhashTable(size_t len=DefaultPrime, Hash_Fct_Ptr hash_fct=dft_hash_fct< Key >)
Definition: tpl_dynLhash.H:159
Definition: tpl_lhash.H:660
typename DynLhashTable< Key, Record >::Hash_Fct_Ptr Hash_Fct_Ptr
El tipo de función hash.
Definition: tpl_dynLhash.H:149