using System;
using System.Collections.Generic;
namespace Developpez.Dotnet.Collections
{
///
/// Représente un dictionnaire dont toutes les clés sont supposées définies. Si la clé demandée
/// n'existe pas dans le dictionnaire, une valeur par défaut est renvoyée. Cette valeur par défaut
/// est automatiquement ajoutée au dictionnaire avec la clé associée, sauf indication contraire.
///
/// Type de la clé
/// Type de la valeur
public class DefaultDictionary : DictionaryBase
{
private readonly bool _addMissingKeys;
private readonly Func _defaultValueGenerator;
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur par défaut du type V est renvoyée.
///
public DefaultDictionary()
: this(k => default(TValue), true)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur par défaut du type V est renvoyée. Si addMissingKeys vaut true, la valeur
/// par défaut est ajoutée au dictionnaire avec la clé associée.
///
/// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false
public DefaultDictionary(bool addMissingKeys)
: this(k => default(TValue), addMissingKeys)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur par défaut spécifiée est renvoyée.
///
/// La valeur par défaut à utiliser pour les clés absentes
public DefaultDictionary(TValue defaultValue)
: this(k => defaultValue, true)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur par défaut spécifiée est renvoyée. Si addMissingKeys vaut true, la valeur
/// par défaut est ajoutée au dictionnaire avec la clé associée.
///
/// La valeur par défaut à utiliser pour les clés absentes
/// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false
public DefaultDictionary(TValue defaultValue, bool addMissingKeys)
: this(k => defaultValue, addMissingKeys)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur générée par le delegate fourni en paramètre est renvoyée.
///
/// Une fonction qui renvoie une valeur initiale pour une clé absente
public DefaultDictionary(Func defaultValueGenerator)
: this(defaultValueGenerator, true)
{
}
///
/// Initialise une nouvelle instance de DefaultDictionary<T>. Si la clé demandée est absente,
/// la valeur générée par le delegate fourni en paramètre est renvoyée. Si addMissingKeys vaut true, la valeur
/// par défaut est ajoutée au dictionnaire avec la clé associée.
///
/// Une fonction qui renvoie une valeur initiale pour une clé absente
/// true pour ajouter automatiquement au dictionnaire les clés manquantes et leur valeur associée ; sinon, false
public DefaultDictionary(Func defaultValueGenerator, bool addMissingKeys)
: base(new Dictionary())
{
_defaultValueGenerator = defaultValueGenerator;
_addMissingKeys = addMissingKeys;
}
///
/// Renvoie une valeur indiquant si ce dictionnaire ajoute automatiquement
/// les clés manquantes et leur valeur associée lorsqu'elles sont demandées
///
public bool AddMissingKeys
{
get { return _addMissingKeys; }
}
///
/// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, une valeur par défaut est renvoyée
///
/// La clé pour laquelle retourner une valeur
/// La valeur correspondant à la clé
public override TValue this[TKey key]
{
get
{
TValue value;
if (!base.TryGetValue(key, out value))
{
value = _defaultValueGenerator(key);
if (_addMissingKeys)
this[key] = value;
}
return value;
}
set
{
base[key] = value;
}
}
///
/// Obtient la valeur associée à la clé spécifiée. Si la clé n'existe pas, une valeur par défaut est renvoyée.
///
/// La clé recherchée
/// Paramètre de sortie auquel la valeur trouvée est affectée
/// Toujours true
public override bool TryGetValue(TKey key, out TValue value)
{
value = this[key];
return true;
}
}
}