X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=third-party%2Ftriemap%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Ftriemap%2FListMap.java;h=1522b6611fa72df49272e431b8436408e1f73b80;hb=9b016fa3fe1c0d97fdc7b758b1674a1fc59ee303;hp=519ee4ee5e4d97d2b8e53642aaee2bd054e31715;hpb=0c7a59f5d967341f028269879afa09d742a92de5;p=yangtools.git diff --git a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ListMap.java b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ListMap.java index 519ee4ee5e..1522b6611f 100644 --- a/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ListMap.java +++ b/third-party/triemap/src/main/java/org/opendaylight/yangtools/triemap/ListMap.java @@ -17,8 +17,8 @@ package org.opendaylight.yangtools.triemap; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Iterator; -import java.util.Map; import java.util.Map.Entry; +import java.util.NoSuchElementException; /** * Mimic immutable ListMap in Scala @@ -27,232 +27,105 @@ import java.util.Map.Entry; * * @param */ -abstract class ListMap { +final class ListMap { + private final K k; + private final V v; - ListMap next; + // Modified during remove0 only + private ListMap next; - static ListMap map(final K k, final V v, final ListMap tail){ - return new Node<> (k, v, tail); + private ListMap(final K k, final V v) { + this(k, v, null); } - static ListMap map(final K k, final V v){ - return new Node<> (k, v, null); + private ListMap(final K k, final V v, final ListMap next) { + this.k = k; + this.v = v; + this.next = next; } - static ListMap map(final K k1, final V v1, final K k2, final V v2){ - return new Node<> (k1, v1, new Node<>(k2,v2, null)); + static ListMap map(final K k1, final V v1, final K k2, final V v2) { + return new ListMap<>(k1, v1, new ListMap<>(k2, v2)); } - public abstract int size (); - - public abstract boolean isEmpty() ; - - abstract public boolean contains(K k, V v); - - abstract public boolean contains(K key); - - abstract public Option get (K key); - - abstract public ListMap add (K key, V value); - - abstract public ListMap remove (K key); - - abstract public Iterator> iterator(); - - - static class EmptyListMap extends ListMap { - @Override - public ListMap add (final K key, final V value) { - return ListMap.map(key, value, null); - } + int size() { + return next == null ? 1 : next.size() + 1; + } - @Override - public boolean contains(final K k, final V v) { - return false; + Option get(final K key) { + if (key.equals(k)) { + return Option.makeOption(v); } + return next == null ? Option.makeOption() : next.get(key); + } - @Override - public boolean contains(final K k) { - return false; - } + ListMap add(final K key, final V value) { + return new ListMap<>(key, value, remove(key)); + } - @Override - public ListMap remove(final K key) { + ListMap remove(final K key) { + if (!contains(key)) { return this; } - @Override - public int size () { - return 0; - } + return remove0(key); + } - @Override - public boolean isEmpty () { + private boolean contains(final K key) { + if (key.equals(this.k)) { return true; } - @Override - public Option get (final K key) { - return Option.makeOption(); - } - - @Override - public Iterator> iterator () { - return new EmptyListMapIterator<> (); - } - - static class EmptyListMapIterator implements Iterator> { - - @Override - public boolean hasNext () { - return false; - } - - @Override - public Entry next () { - return null; - } - - @Override - public void remove () { - throw new RuntimeException("Operation not supported"); - } - - } + return next != null && next.contains(key); } - static class Node extends ListMap { - final K k; - final V v; - - Node(final K k, final V v, final ListMap next) { - this.k = k; - this.v = v; - this.next = next; - } - - @Override - public ListMap add (final K key, final V value) { - return ListMap.map(key, value, remove (key)); - } - - @Override - public boolean contains(final K k, final V v) { - if(k.equals (this.k) && v.equals (this.v)) { - return true; - } else if(next != null) { - return next.contains (k, v); - } - return false; - } - - @Override - public boolean contains(final K k) { - if(k.equals (this.k)) { - return true; - } else if(next != null) { - return next.contains (k); + private ListMap remove0(final K key) { + ListMap n = this; + ListMap ret = null; + ListMap lastN = null; + while (n != null) { + if (key.equals(n.k)) { + n = n.next; + continue; } - return false; - } - @Override - public ListMap remove(final K key) { - if(!contains(key)) { - return this; + if (ret != null) { + lastN.next = new ListMap<>(n.k, n.v); + lastN = lastN.next; } else { - return remove0(key); + ret = new ListMap<>(n.k, n.v); + lastN = ret; } + n = n.next; } + return ret; + } - private ListMap remove0 (final K key) { - ListMap n = this; - ListMap newN = null; - ListMap lastN = null; - while (n != null) { - if(n instanceof EmptyListMap) { - newN.next = n; - break; - } - Node nn = (Node)n; - if (key.equals (nn.k)) { - n = n.next; - continue; - } else { - if (newN != null) { - lastN.next = ListMap.map (nn.k, nn.v, null); - lastN = lastN.next; - } else { - newN = ListMap.map (nn.k, nn.v, null); - lastN = newN; - } - } - n = n.next; - } - return newN; - } + Iterator> iterator() { + return new NodeIterator<>(this); + } - @Override - public int size () { - if(next == null) { - return 1; - } else { - return 1+next.size (); - } - } + static final class NodeIterator implements Iterator> { + private ListMap n; - @Override - public boolean isEmpty () { - return false; + NodeIterator(final ListMap n) { + this.n = n; } @Override - public Option get(final K key) { - if (key.equals(k)) { - return Option.makeOption(v); - } - if (next != null) { - return next.get(key); - } - return Option.makeOption(); + public boolean hasNext() { + return n != null; } - @Override - public Iterator> iterator () { - return new NodeIterator<> (this); - } - - static class NodeIterator implements Iterator> { - ListMap n; - - public NodeIterator (final Node n) { - this.n = n; - } - - @Override - public boolean hasNext () { -// return n!= null && n.next != null && !(n.next instanceof EmptyListMap); - return n!= null && !(n instanceof EmptyListMap); - } - - @Override - public Entry next () { - if (n instanceof Node) { - Node nn = (Node) n; - Entry res = new SimpleImmutableEntry<> (nn.k, nn.v); - n = n.next; - return res; - } else { - return null; - } - } - - @Override - public void remove () { - throw new RuntimeException("Operation not supported"); + public Entry next() { + if (n == null) { + throw new NoSuchElementException(); } + final Entry res = new SimpleImmutableEntry<>(n.k, n.v); + n = n.next; + return res; } } }