/*
 * Copyright (C) 2013.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program 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 GNU
 * General Public License for more details.
 */

package uk.me.parabola.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.LinkedList;
import java.util.List;


public class MultiIdentityHashMap<K,V> extends IdentityHashMap<K,List<V>> {

	/**
	* the empty list to be returned when there is key without values.
	*/
	private final List<V> emptyList = Collections.unmodifiableList(new ArrayList<V>(0));

	/**
	* Returns the list of values associated with the given key.
	*
	* @param key the key to get the values for.
	* @return a list of values for the given keys or the empty list of no such
	*         value exist.
	*/
	public List<V> get(Object key) {
		List<V> result = super.get(key);
		return result == null ? emptyList : result;
	}


	public V add(K key, V value ) {
		List<V> values = super.get(key);
	    if (values == null ) {
	        values = new LinkedList<V>();
	        super.put( key, values );
	    }
	    
	    boolean results = values.add(value);
	    
	    return ( results ? value : null );
	}

	public V removeMapping(K key, V value) {
		List<V> values = super.get(key);
	    if (values == null )
			return null;
	
	    values.remove(value);
		
		if (values.isEmpty())
			super.remove(key);

		return value;
	}
}

