Merge branch 'appcode10' into merge_appcode10
[idea/community.git] / platform / util / src / com / intellij / util / containers / MultiMap.java
index 5a27ab14a12b9962fa11bfc1cf72ccf67416a9e3..459f76efbd19b5d0cd8247abc019269319e7d134 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2011 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,17 +35,24 @@ public class MultiMap<K, V> implements Serializable {
   private static final long serialVersionUID = -2632269270151455493L;
 
   private final Map<K, Collection<V>> myMap;
-
   private Collection<V> values;
 
   public MultiMap() {
     myMap = createMap();
   }
 
+  public MultiMap(int i, float v) {
+    myMap = createMap(i, v);
+  }
+
   protected Map<K, Collection<V>> createMap() {
     return new HashMap<K, Collection<V>>();
   }
 
+  protected Map<K, Collection<V>> createMap(int i, float v) {
+    return new HashMap<K, Collection<V>>(i, v);
+  }
+
   protected Collection<V> createCollection() {
     return new ArrayList<V>();
   }
@@ -54,10 +61,9 @@ public class MultiMap<K, V> implements Serializable {
     return Collections.emptyList();
   }
 
-  public void putAllValues(MultiMap<? extends K, ? extends V> from) {
-    for (K k : from.keySet()) {
-      //noinspection unchecked
-      putValues(k, ((MultiMap)from).get(k));
+  public <Kk extends K, Vv extends V> void putAllValues(MultiMap<Kk, Vv> from) {
+    for (Map.Entry<Kk, Collection<Vv>> entry : from.entrySet()) {
+      putValues(entry.getKey(), entry.getValue());
     }
   }
 
@@ -84,6 +90,8 @@ public class MultiMap<K, V> implements Serializable {
   }
 
   public boolean isEmpty() {
+    if (myMap.isEmpty()) return true;
+
     for(Collection<V> valueList: myMap.values()) {
       if (!valueList.isEmpty()) {
         return false;
@@ -211,8 +219,20 @@ public class MultiMap<K, V> implements Serializable {
     return myMap.remove(key);
   }
 
+  @NotNull
   public static <K, V> MultiMap<K, V> emptyInstance() {
-    return EMPTY;
+    @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"}) final MultiMap<K, V> empty = EMPTY;
+    return empty;
+  }
+
+  @NotNull
+  public static <K, V> MultiMap<K, V> create() {
+    return new MultiMap<K, V>();
+  }
+
+  @NotNull
+  public static <K, V> MultiMap<K, V> create(int i, float v) {
+    return new MultiMap<K, V>(i, v);
   }
 
   @Override