12#ifndef ARCANE_UTILS_HASHTABLEMAP_H
13#define ARCANE_UTILS_HASHTABLEMAP_H
17#include "arcane/utils/HashTable.h"
28template <
typename KeyType,
typename ValueType>
29class HashTableMapEnumeratorT;
51template <
typename KeyType,
typename ValueType,
typename KeyTraitsType = HashTraitsT<KeyType>>
57 typedef typename KeyTraitsType::KeyTypeConstRef KeyTypeConstRef;
58 typedef typename KeyTraitsType::KeyTypeValue KeyTypeValue;
59 typedef typename KeyTraitsType::Printable Printable;
60 typedef typename KeyTraitsType::HashValueType HashValueType;
71 :
m_key(KeyTypeValue())
77 Data* next() {
return m_next; }
79 KeyTypeConstRef key() {
return m_key; }
80 const ValueType& value()
const {
return m_value; }
81 ValueType& value() {
return m_value; }
98 Data* m_next =
nullptr;
161 _add(i, data->key(), data->value());
171 Integer
hf = _keyToBucket(
id);
172 for (
Data* i = m_buckets[
hf]; i; i = i->m_next) {
237 const Data*
ht = _lookup(
id);
262 bool add(KeyTypeConstRef
id,
const ValueType& value)
264 Integer
hf = _keyToBucket(
id);
280 Integer
hf = _keyToBucket(
id);
298 HashValueType
hf = _applyHash(
id);
299 Data*
ht = _lookupBucket(_hashValueToBucket(
hf),
id);
308 ht = _add(_hashValueToBucket(
hf),
id, value);
324 HashValueType
hf = _applyHash(
id);
325 Data*
ht = _lookupBucket(_hashValueToBucket(
hf),
id);
331 ht = _add(_hashValueToBucket(
hf),
id, ValueType());
345 Integer
hf = _keyToBucket(
id);
354 ConstArrayView<Data*> buckets()
const
383 template <
class Lambda>
void
386 for (Integer
k = 0, n = m_buckets.size();
k < n; ++
k) {
398 template <
class Lambda>
void
401 for (Integer
k = 0, n = m_buckets.size();
k < n; ++
k) {
427 _add(_keyToBucket(current->key()), current->key(), current->value());
445 mutable Int64 m_nb_collision = 0;
446 mutable Int64 m_nb_direct = 0;
450 Data* _add(Integer
bucket, KeyTypeConstRef key,
const ValueType& value)
464 HashValueType _applyHash(KeyTypeConstRef
id)
const
467 return KeyTraitsType::hashFunction(
id);
470 Integer _keyToBucket(KeyTypeConstRef
id)
const
475 Integer _hashValueToBucket(KeyTypeValue
id)
const
480 Data* _baseLookupBucket(Integer bucket, KeyTypeConstRef
id)
const
482 for (Data* i = m_buckets[bucket]; i; i = i->next()) {
483 if (!(i->key() ==
id)) {
493 Data* _baseRemoveBucket(Integer bucket, KeyTypeConstRef
id)
495 Data* i = m_buckets[bucket];
497 if (i->m_key ==
id) {
498 m_buckets[bucket] = i->next();
502 for (; i->next(); i = i->next()) {
503 if (i->next()->key() ==
id) {
505 i->setNext(i->next()->next());
511 this->_throwNotFound(
id, Printable());
515 inline Data* _baseLookup(KeyTypeConstRef
id)
const
517 return _baseLookupBucket(_keyToBucket(
id),
id);
520 inline Data* _baseRemove(KeyTypeConstRef
id)
522 return _baseRemoveBucket(_keyToBucket(
id),
id);
525 void _baseAdd(Integer bucket, KeyTypeConstRef
id, Data* hd)
527 Data* buck = m_buckets[bucket];
530 m_buckets[bucket] = hd;
534 Data* _lookup(KeyTypeConstRef
id)
536 return _baseLookup(
id);
539 const Data* _lookup(KeyTypeConstRef
id)
const
541 return _baseLookup(
id);
544 Data* _lookupBucket(Integer bucket, KeyTypeConstRef
id)
const
546 return _baseLookupBucket(bucket,
id);
549 Data* _removeBucket(Integer bucket, KeyTypeConstRef
id)
551 return _baseRemoveBucket(bucket,
id);
580 void _print(FalseType)
584 void _print(TrueType)
586 for (Integer z = 0, zs = m_buckets.size(); z < zs; ++z) {
587 for (Data* i = m_buckets[z]; i; i = i->next()) {
588 cout <<
"* KEY=" << i->key() <<
" bucket=" << z <<
'\n';
593 void _throwNotFound ARCANE_NORETURN(KeyTypeConstRef, FalseType)
const
595 HashTableBase::_throwNotFound();
598 void _throwNotFound ARCANE_NORETURN(KeyTypeConstRef
id, TrueType)
const
600 std::cout <<
"ERROR: can not find key=" <<
id <<
" bucket=" << _keyToBucket(
id) <<
"\n";
602 HashTableBase::_throwNotFound();
605 void _computeMaxCount()
623template <
typename KeyType,
typename ValueType>
627 typedef typename HashType::Data
Data;
632 : m_buckets(
rhs.buckets())
634 , m_current_bucket(-1)
642 m_current_data = m_current_data->next();
643 if (!m_current_data) {
644 while (m_current_data == 0 && (m_current_bucket + 1) < m_buckets.size()) {
646 m_current_data = m_buckets[m_current_bucket];
649 return m_current_data != 0;
651 ValueType& operator*() {
return m_current_data->value(); }
652 const ValueType& operator*()
const {
return m_current_data->value(); }
653 Data* data() {
return m_current_data; }
654 const Data* data()
const {
return m_current_data; }
659 Data* m_current_data;
660 Integer m_current_bucket;
Classe de base d'une table de hachage simple pour les entités.
Integer m_nb_bucket
Nombre de buckets.
Integer nearestPrimeNumber(Integer n)
Retourne le nombre premier le plus proche de n par excès. Le nombre premier le plus proche et supérie...
Integer m_count
Nombre d'éléments.
Enumerateur sur un HashTableMap.
Table de hachage pour tableaux associatifs.
const ValueType & operator[](KeyTypeConstRef id) const
Recherche la valeur correspondant à la clé id.
void rehash()
Repositionne les données après changement de valeur des clés.
HashTableMapT(Integer table_size, bool use_prime, Integer buffer_size)
Crée une table de taille table_size.
void nocheckAdd(KeyTypeConstRef id, const ValueType &value)
Ajoute la valeur value correspondant à la clé id.
const Data * lookup(KeyTypeConstRef id) const
Recherche la valeur correspondant à la clé id.
Data * lookup(KeyTypeConstRef id)
Recherche la valeur correspondant à la clé id.
Data * lookupAdd(KeyTypeConstRef id, const ValueType &value, bool &is_add)
Recherche ou ajoute la valeur correspondant à la clé id.
void remove(KeyTypeConstRef id)
Supprime la valeur associée à la clé id.
void _rehash(Integer new_size)
Repositionne les données après changement de valeur des clés.
void resize(Integer new_size, bool use_prime=false)
Redimensionne la table de hachage.
ValueType & lookupValue(KeyTypeConstRef id)
Recherche la valeur correspondant à la clé id.
ThatClass & operator=(const ThatClass &from)
Opérateur de recopie.
ValueType & operator[](KeyTypeConstRef id)
Recherche la valeur correspondant à la clé id.
bool add(KeyTypeConstRef id, const ValueType &value)
Ajoute la valeur value correspondant à la clé id.
void eachValue(const Lambda &lambda)
Applique le fonctor f à tous les éléments de la collection et utilise x->value() (de type ValueType) ...
void clear()
Supprime tous les éléments de la table.
void each(const Lambda &lambda)
Applique le fonctor f à tous les éléments de la collection.
MultiBufferT< Data > * m_buffer
Tampon d'allocation des valeurs.
const ValueType & lookupValue(KeyTypeConstRef id) const
Recherche la valeur correspondant à la clé id.
HashTableMapT(Integer table_size, bool use_prime)
Crée une table de taille table_size.
Data * lookupAdd(KeyTypeConstRef id)
Recherche ou ajoute la valeur correspondant à la clé id.
Data * m_first_free
Pointeur vers le premier Data utilisable.
bool hasKey(KeyTypeConstRef id)
true si une valeur avec la clé id est présente
Integer m_max_count
Nombre maximal d'élément avant retaillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
void setValue(const ValueType &avalue)
Modifie la valeur de l'instance.
ValueType m_value
Valeur de l'élément.
KeyTypeValue m_key
Clé de recherche.
void setKey(const KeyType &new_key)
Change la valeur de la clé.