*/
package org.opendaylight.yangtools.triemap;
+import java.util.Optional;
+
final class INode<K, V> extends INodeBase<K, V> {
static final Object KEY_PRESENT = new Object ();
static final Object KEY_ABSENT = new Object ();
* @return null if unsuccessful, Option[V] otherwise (indicating
* previous value bound to the key)
*/
- Option<V> rec_insertif(final K k, final V v, final int hc, final Object cond, final int lev,
+ Optional<V> rec_insertif(final K k, final V v, final int hc, final Object cond, final int lev,
final INode<K, V> parent, final Gen startgen, final TrieMap<K, V> ct) {
while (true) {
final MainNode<K, V> m = GCAS_READ(ct); // use -Yinline!
if (cond == null) {
if (sn.hc == hc && ct.equal(sn.k, k)) {
if (GCAS(cn, cn.updatedAt(pos, new SNode<>(k, v, hc), gen), ct)) {
- return Option.makeOption(sn.v);
+ return Optional.of(sn.v);
}
return null;
final MainNode<K, V> nn = rn.updatedAt(pos, inode (CNode.dual(sn, sn.hc,
new SNode<>(k, v, hc), hc, lev + 5, gen)), gen);
if (GCAS(cn, nn, ct)) {
- return Option.makeOption(); // None;
+ return Optional.empty();
}
return null;
} else if (cond == INode.KEY_ABSENT) {
if (sn.hc == hc && ct.equal(sn.k, k)) {
- return Option.makeOption(sn.v);
+ return Optional.of(sn.v);
}
final CNode<K, V> rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct);
final MainNode<K, V> nn = rn.updatedAt(pos, inode (CNode.dual(sn, sn.hc,
new SNode<>(k, v, hc), hc, lev + 5, gen)), gen);
if (GCAS(cn, nn, ct)) {
- return Option.makeOption(); // None
+ return Optional.empty();
}
return null;
} else if (cond == INode.KEY_PRESENT) {
if (sn.hc == hc && ct.equal(sn.k, k)) {
if (GCAS(cn, cn.updatedAt(pos, new SNode<>(k, v, hc), gen), ct)) {
- return Option.makeOption(sn.v);
+ return Optional.of(sn.v);
}
return null;
}
- return Option.makeOption();// None;
+ return Optional.empty();
} else {
if (sn.hc == hc && ct.equal(sn.k, k) && cond.equals(sn.v)) {
if (GCAS(cn, cn.updatedAt(pos, new SNode<>(k, v, hc), gen), ct)) {
- return Option.makeOption(sn.v);
+ return Optional.of(sn.v);
}
return null;
}
- return Option.makeOption(); // None
+ return Optional.empty();
}
}
} else if (cond == null || cond == INode.KEY_ABSENT) {
final CNode<K, V> rn = (cn.gen == gen) ? cn : cn.renewed(gen, ct);
final CNode<K, V> ncnode = rn.insertedAt (pos, flag, new SNode<>(k, v, hc), gen);
if (GCAS(cn, ncnode, ct)) {
- return Option.makeOption(); // None
+ return Optional.empty();
}
return null;
} else if (cond == INode.KEY_PRESENT) {
- return Option.makeOption(); // None;
+ return Optional.empty();
} else {
- return Option.makeOption(); // None
+ return Optional.empty();
}
} else if (m instanceof TNode) {
clean(parent, ct, lev - 5);
// 3) an l-node
final LNode<K, V> ln = (LNode<K, V>) m;
if (cond == null) {
- final Option<V> optv = ln.get(k);
+ final Optional<V> optv = ln.get(k);
if (insertln(ln, k, v, ct)) {
return optv;
}
return null;
} else if (cond == INode.KEY_ABSENT) {
- final Option<V> t = ln.get(k);
- if (t.nonEmpty()) {
+ final Optional<V> t = ln.get(k);
+ if (t.isPresent()) {
return t;
}
if (insertln(ln, k, v, ct)) {
- return Option.makeOption();// None
+ return Optional.empty();
}
return null;
} else if (cond == INode.KEY_PRESENT) {
- final Option<V> t = ln.get(k);
- if (!t.nonEmpty()) {
+ final Optional<V> t = ln.get(k);
+ if (!t.isPresent()) {
return t;
}
if (insertln(ln, k, v, ct)) {
}
return null;
} else {
- final Option<V> t = ln.get(k);
- if (t instanceof Some) {
- final Some<V> s = (Some<V>) t;
- if (cond.equals(s.get())) {
+ final Optional<V> t = ln.get(k);
+ if (t.isPresent()) {
+ if (cond.equals(t.get())) {
if (insertln(ln, k, v, ct)) {
// Difference from Scala: we choose to reuse the object returned from LNode,
// as the identity of the value does not matter in this call graph.
}
}
- return Option.makeOption();
+ return Optional.empty();
}
} else {
throw new IllegalStateException("Unhandled node " + m);
* @return null if not successful, an Option[V] indicating the previous
* value otherwise
*/
- Option<V> rec_remove(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
+ Optional<V> rec_remove(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
final Gen startgen, final TrieMap<K, V> ct) {
final MainNode<K, V> m = GCAS_READ(ct); // use -Yinline!
final int bmp = cn.bitmap;
final int flag = 1 << idx;
if ((bmp & flag) == 0) {
- return Option.makeOption();
+ return Optional.empty();
}
final int pos = Integer.bitCount(bmp & (flag - 1));
final BasicNode sub = cn.array[pos];
- Option<V> res = null;
+ Optional<V> res = null;
if (sub instanceof INode) {
final INode<K, V> in = (INode<K, V>) sub;
if (startgen == in.gen) {
if (sn.hc == hc && ct.equal(sn.k, k) && (v == null || v.equals(sn.v))) {
final MainNode<K, V> ncn = cn.removedAt(pos, flag, gen).toContracted(lev);
if (GCAS(cn, ncn, ct)) {
- res = Option.makeOption(sn.v);
+ res = Optional.of(sn.v);
} else {
res = null;
}
} else {
- res = Option.makeOption ();
+ res = Optional.empty();
}
}
- if (res instanceof None || (res == null)) {
+ if (res == null || !res.isPresent()) {
return res;
}
} else if (m instanceof LNode) {
final LNode<K, V> ln = (LNode<K, V>) m;
if (v == null) {
- final Option<V> optv = ln.get(k);
+ final Optional<V> optv = ln.get(k);
final MainNode<K, V> nn = ln.removed(k, ct);
if (GCAS(ln, nn, ct)) {
return optv;
return null;
}
- final Option<V> tmp = ln.get(k);
- if (tmp instanceof Some) {
- final Some<V> tmp1 = (Some<V>) tmp;
- if (v.equals(tmp1.get())) {
- final MainNode<K, V> nn = ln.removed(k, ct);
- if (GCAS(ln, nn, ct)) {
- return tmp;
- }
-
- return null;
+ final Optional<V> tmp = ln.get(k);
+ if (tmp.isPresent() && v.equals(tmp.get())) {
+ final MainNode<K, V> nn = ln.removed(k, ct);
+ if (GCAS(ln, nn, ct)) {
+ return tmp;
}
+
+ return null;
}
// Key not found or value does not match: we have not removed anything
- return Option.makeOption();
+ return Optional.empty();
} else {
throw new IllegalStateException("Unhandled node " + m);
}
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
}
}
- private Option<V> insertifhc(final K k, final int hc, final V v, final Object cond) {
+ private Optional<V> insertifhc(final K k, final int hc, final V v, final Object cond) {
while (true) {
final INode<K, V> r = RDCSS_READ_ROOT();
- final Option<V> ret = r.rec_insertif(k, v, hc, cond, 0, null, r.gen, this);
+ final Optional<V> ret = r.rec_insertif(k, v, hc, cond, 0, null, r.gen, this);
if (ret != null) {
return ret;
}
}
}
- private Option<V> removehc(final K k, final V v, final int hc) {
+ private Optional<V> removehc(final K k, final V v, final int hc) {
while (true) {
final INode<K, V> r = RDCSS_READ_ROOT();
- final Option<V> res = r.rec_remove(k, v, hc, 0, null, r.gen, this);
+ final Optional<V> res = r.rec_remove(k, v, hc, 0, null, r.gen, this);
if (res != null) {
return res;
}
final int hc = computeHash (k);
// return (V) lookuphc (k, hc);
final Object o = lookuphc (k, hc);
- if (o instanceof Some) {
- return ((Some<V>)o).get ();
- } else if (o instanceof None) {
- return null;
- } else {
- return (V)o;
+ if (o instanceof Optional) {
+ return ((Optional<V>) o).orElse(null);
}
+
+ return (V)o;
}
@Override
public V put(final K key, final V value) {
ensureReadWrite();
final int hc = computeHash(key);
- final Option<V> ov = insertifhc (key, hc, value, null);
- if (ov instanceof Some) {
- Some<V> sv = (Some<V>)ov;
- return sv.get ();
- }
-
- return null;
+ return insertifhc (key, hc, value, null).orElse(null);
}
TrieMap<K, V> add(final K k, final V v) {
public V remove(final Object k) {
ensureReadWrite();
final int hc = computeHash ((K)k);
- final Option<V> ov = removehc ((K)k, (V) null, hc);
- if (ov instanceof Some) {
- Some<V> sv = (Some<V>)ov;
- return sv.get();
- }
-
- return null;
+ return removehc ((K)k, (V) null, hc).orElse(null);
}
@Override
public V putIfAbsent(final K k, final V v) {
ensureReadWrite();
final int hc = computeHash (k);
- final Option<V> ov = insertifhc (k, hc, v, INode.KEY_ABSENT);
- if (ov instanceof Some) {
- Some<V> sv = (Some<V>)ov;
- return sv.get();
- }
-
- return null;
+ return insertifhc (k, hc, v, INode.KEY_ABSENT).orElse(null);
}
@Override
public boolean remove(final Object k, final Object v) {
ensureReadWrite();
final int hc = computeHash ((K)k);
- return removehc((K)k, (V)v, hc).nonEmpty();
+ return removehc((K)k, (V)v, hc).isPresent();
}
@Override
public boolean replace(final K k, final V oldvalue, final V newvalue) {
ensureReadWrite();
final int hc = computeHash (k);
- return insertifhc (k, hc, newvalue, oldvalue).nonEmpty();
+ return insertifhc (k, hc, newvalue, oldvalue).isPresent();
}
@Override
public V replace(final K k, final V v) {
ensureReadWrite();
final int hc = computeHash (k);
- final Option<V> ov = insertifhc (k, hc, v, INode.KEY_PRESENT);
- if (ov instanceof Some) {
- Some<V> sv = (Some<V>)ov;
- return sv.get();
- }
-
- return null;
+ return insertifhc (k, hc, v, INode.KEY_PRESENT).orElse(null);
}
/***