*/
package org.opendaylight.yangtools.triemap;
+import static org.opendaylight.yangtools.triemap.LookupResult.RESTART;
+import static org.opendaylight.yangtools.triemap.PresencePredicate.ABSENT;
+import static org.opendaylight.yangtools.triemap.PresencePredicate.PRESENT;
+
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
final class INode<K, V> extends BasicNode {
- static final Object KEY_PRESENT = new Object ();
- static final Object KEY_ABSENT = new Object ();
-
- /**
- * Virtual result for lookup methods indicating that the lookup needs to be restarted. This is a faster version
- * of throwing a checked exception to control the restart.
- */
- static final Object RESTART = new Object();
-
@SuppressWarnings("rawtypes")
private static final AtomicReferenceFieldUpdater<INode, MainNode> MAINNODE_UPDATER =
AtomicReferenceFieldUpdater.newUpdater(INode.class, MainNode.class, "mainnode");
- public final Gen gen;
+ private final Gen gen;
private volatile MainNode<K, V> mainnode;
*
* @return true if successful, false otherwise
*/
- boolean rec_insert(final K k, final V v, final int hc, final int lev, final INode<K, V> parent, final Gen startgen,
+ boolean rec_insert(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
final TrieMap<K, V> ct) {
+ return rec_insert(k, v, hc, lev, parent, gen, ct);
+ }
+
+ private boolean rec_insert(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) {
while (true) {
final MainNode<K, V> m = GCAS_READ (ct); // use -Yinline!
* previous value bound to the key)
*/
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 TrieMap<K, V> ct) {
+ return rec_insertif(k, v, hc, cond, lev, parent, gen, ct);
+ }
+
+ private 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!
}
return null;
- } else if (cond == INode.KEY_ABSENT) {
+ } else if (cond == ABSENT) {
if (sn.hc == hc && ct.equal(sn.k, k)) {
return Optional.of(sn.v);
}
}
return null;
- } else if (cond == INode.KEY_PRESENT) {
+ } else if (cond == PRESENT) {
if (sn.hc == hc && ct.equal(sn.k, k)) {
if (GCAS(cn, cn.updatedAt(pos, new SNode<>(k, v, hc), gen), ct)) {
return Optional.of(sn.v);
return Optional.empty();
}
}
- } else if (cond == null || cond == INode.KEY_ABSENT) {
+ } else if (cond == null || cond == 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 null;
- } else if (cond == INode.KEY_PRESENT) {
- return Optional.empty();
} else {
return Optional.empty();
}
return optv;
}
return null;
- } else if (cond == INode.KEY_ABSENT) {
+ } else if (cond == ABSENT) {
final Optional<V> t = ln.get(k);
if (t.isPresent()) {
return t;
return Optional.empty();
}
return null;
- } else if (cond == INode.KEY_PRESENT) {
+ } else if (cond == PRESENT) {
final Optional<V> t = ln.get(k);
if (!t.isPresent()) {
return t;
* @return null if no value has been found, RESTART if the operation
* wasn't successful, or any other value otherwise
*/
- Object rec_lookup(final K k, final int hc, final int lev, final INode<K, V> parent, final Gen startgen,
+ Object rec_lookup(final K k, final int hc, final int lev, final INode<K, V> parent, final TrieMap<K, V> ct) {
+ return rec_lookup(k, hc, lev, parent, gen, ct);
+ }
+
+ private Object rec_lookup(final K k, final int hc, 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!
continue;
}
- // used to be throw RestartException
return RESTART;
} else if (sub instanceof SNode) {
// 2) singleton node
return null;
}
- // used to be throw RestartException
clean(parent, ct, lev - 5);
return RESTART;
}
* value otherwise
*/
Optional<V> rec_remove(final K k, final V v, final int hc, final int lev, final INode<K, V> parent,
+ final TrieMap<K, V> ct) {
+ return rec_remove(k, v, hc, lev, parent, gen, ct);
+ }
+
+ private 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!