Add LazyCollections.lazyAdd for Sets
[yangtools.git] / common / util / src / main / java / org / opendaylight / yangtools / util / LazyCollections.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.util;
9
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15
16 /**
17  * Utility methods for lazily instantiated collections. These are useful for situations when we start off with an empty
18  * collection (where Collections.empty() * can be reused), but need to add more things.
19  */
20 public final class LazyCollections {
21     private LazyCollections() {
22         // Hidden on purpose
23     }
24
25     /**
26      * Add an element to a list, potentially transforming the list.
27      *
28      * @param list Current list
29      * @param obj Object that needs to be added
30      * @return new list
31      */
32     public static <T> List<T> lazyAdd(final List<T> list, final T obj) {
33         final List<T> ret;
34
35         switch (list.size()) {
36             case 0:
37                 return Collections.singletonList(obj);
38             case 1:
39                 ret = new ArrayList<>(2);
40                 ret.addAll(list);
41                 break;
42             default:
43                 ret = list;
44         }
45
46         ret.add(obj);
47         return ret;
48     }
49
50     /**
51      * Add an element to a set, potentially transforming the set.
52      *
53      * @param <E> the type of elements in the set
54      * @param set Current set
55      * @param obj Object that needs to be added
56      * @return new set
57      */
58     public static <E> Set<E> lazyAdd(final Set<E> set, final E obj) {
59         final Set<E> ret;
60
61         switch (set.size()) {
62             case 0:
63                 return Collections.singleton(obj);
64             case 1:
65                 ret = new HashSet<>(4);
66                 ret.addAll(set);
67                 break;
68             default:
69                 ret = set;
70         }
71
72         ret.add(obj);
73         return ret;
74     }
75 }