#region CPL License
/*
Nuclex Framework
Copyright (C) 2002-2010 Nuclex Development Labs
This library is free software; you can redistribute it and/or
modify it under the terms of the IBM Common Public License as
published by the IBM Corporation; either version 1.0 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
IBM Common Public License for more details.
You should have received a copy of the IBM Common Public
License along with this library
*/
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
namespace Nuclex.Support.Collections {
  /// 
  ///   Associative collection that can store several values under one key and vice versa
  /// 
  /// Type of keys used within the dictionary
  /// Type of values stored in the dictionary
  public interface IMultiDictionary :
    IDictionary>,
    IDictionary,
    ICollection>,
    IEnumerable>,
    IEnumerable {
    /// Adds a value into the dictionary under the provided key
    /// Key the value will be stored under
    /// Value that will be stored under the specified key
    void Add(TKey key, TValue value);
    /// Determines the number of values stored under the specified key
    /// Key whose values will be counted
    /// The number of values stored under the specified key
    int CountValues(TKey key);
    /// 
    ///   Removes the item with the specified key and value from the dictionary
    /// 
    /// Key of the item that will be removed
    /// Value of the item that will be removed
    /// 
    ///   True if the specified item was contained in the dictionary and was removed
    /// 
    /// If the dictionary is read-only
    bool Remove(TKey key, TValue value);
    /// Removes all items with the specified key from the dictionary
    /// Key of the item that will be removed
    /// The number of items that have been removed from the dictionary
    /// If the dictionary is read-only
    int RemoveKey(TKey key);
  }
} // namespace Nuclex.Support.Collections