Add LazyCollections.lazyAdd for Sets
[yangtools.git] / common / util / src / main / java / org / opendaylight / yangtools / util / LazyCollections.java
index a9970deee5100cfd2408f7f6bdbd9af84fdae014..109e984c94fdb49ecf53f525db7201ef90c82a22 100644 (file)
@@ -9,42 +9,68 @@ package org.opendaylight.yangtools.util;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
- * Utility methods for lazily instantiated collections. These are useful for
- * situations when we start off with an empty collection (where Collections.empty()
- * can be reused), but need to add more things.
+ * Utility methods for lazily instantiated collections. These are useful for situations when we start off with an empty
+ * collection (where Collections.empty() * can be reused), but need to add more things.
  */
 public final class LazyCollections {
-
     private LazyCollections() {
-        throw new UnsupportedOperationException("Utility class should not be instantiated");
+        // Hidden on purpose
     }
 
     /**
      * Add an element to a list, potentially transforming the list.
      *
+     * @param <E> the type of elements in the list
      * @param list Current list
      * @param obj Object that needs to be added
      * @return new list
      */
-    public static <T> List<T> lazyAdd(final List<T> list, final T obj) {
-        final List<T> ret;
+    public static <E> List<E> lazyAdd(final List<E> list, final E obj) {
+        final List<E> ret;
 
         switch (list.size()) {
-        case 0:
-            return Collections.singletonList(obj);
-        case 1:
-            ret = new ArrayList<>();
-            ret.addAll(list);
-            break;
-        default:
-            ret = list;
+            case 0:
+                return Collections.singletonList(obj);
+            case 1:
+                ret = new ArrayList<>(2);
+                ret.addAll(list);
+                break;
+            default:
+                ret = list;
         }
 
         ret.add(obj);
         return ret;
     }
 
+    /**
+     * Add an element to a set, potentially transforming the set.
+     *
+     * @param <E> the type of elements in the set
+     * @param set Current set
+     * @param obj Object that needs to be added
+     * @return new set
+     */
+    public static <E> Set<E> lazyAdd(final Set<E> set, final E obj) {
+        final Set<E> ret;
+
+        switch (set.size()) {
+            case 0:
+                return Collections.singleton(obj);
+            case 1:
+                ret = new HashSet<>(4);
+                ret.addAll(set);
+                break;
+            default:
+                ret = set;
+        }
+
+        ret.add(obj);
+        return ret;
+    }
 }