Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.97 KB | None | 0 0
  1. package linked_list_set;
  2.  
  3. import kotlinx.atomicfu.AtomicRef;
  4.  
  5. public class SetImpl implements Set {
  6.     private class Node {
  7.         int key;
  8.         AtomicRef<NodeRemoved> NR;
  9.  
  10.         Node(int x, Node next) {
  11.             this.key = x;
  12.             this.NR = new AtomicRef<>(new NodeRemoved(next));
  13.         }
  14.     }
  15.  
  16.     private class NodeRemoved {
  17.         final Node next;
  18.  
  19.         NodeRemoved(Node next) {
  20.             this.next = next;
  21.         }
  22.     }
  23.  
  24.     private class Removed extends NodeRemoved {
  25.  
  26.         Removed(Node next) {
  27.             super(next);
  28.         }
  29.     }
  30.  
  31.     private final AtomicRef<Node> head = new AtomicRef<>(new Node(Integer.MIN_VALUE, new Node(Integer.MAX_VALUE, null)));
  32.  
  33.     private class Window {
  34.         Node nextNR;
  35.         NodeRemoved next;
  36.  
  37.         Window(Node nextNR, NodeRemoved next) {
  38.             this.nextNR = nextNR;
  39.             this.next = next;
  40.         }
  41.     }
  42.  
  43.     /**
  44.      * Returns the {@link Window}, where cur.x < x <= next.x
  45.      */
  46.     private Window findWindow(int x) {
  47.         while (true) {
  48.             Node cur = head.getValue();
  49.             NodeRemoved nextNR = cur.NR.getValue();
  50.             Node next = nextNR.next;
  51.  
  52.             while (true) {
  53.                 if (next.NR.getValue() instanceof Removed) {
  54.                     NodeRemoved newNext = new NodeRemoved(next.NR.getValue().next);
  55.                     if ((nextNR instanceof Removed) || cur.NR.compareAndSet(nextNR, newNext)) {
  56.                         nextNR = newNext;
  57.                         next = nextNR.next;
  58.                     } else break;
  59.                 } else if (next.key >= x) {
  60.                     if (nextNR instanceof Removed) break;
  61.                     return new Window(cur, nextNR);
  62.                 } else {
  63.                     cur = next;
  64.                     nextNR = cur.NR.getValue();
  65.                     next = nextNR.next;
  66.                 }
  67.             }
  68.  
  69.         }
  70.     }
  71.  
  72.     @Override
  73.     public boolean add(int x) {
  74.         while (true) {
  75.             Window w = findWindow(x);
  76.             if (w.next.next.key == x)
  77.                 return false;
  78.             if (w.nextNR.NR.compareAndSet(w.next, new NodeRemoved(new Node(x, w.next.next))))
  79.                 return true;
  80.         }
  81.     }
  82.  
  83.     @Override
  84.     public boolean remove(int x) {
  85.         while (true) {
  86.             Window w = findWindow(x);
  87.             Node toRemote = w.next.next;
  88.             NodeRemoved next = toRemote.NR.getValue();
  89.             if (toRemote.key != x) {
  90.                 return false;
  91.             }
  92.             if (!(next instanceof Removed) && toRemote.NR.compareAndSet(next, new Removed(next.next))) {
  93.                 w.nextNR.NR.compareAndSet(w.next, new NodeRemoved(next.next));
  94.                 return true;
  95.             }
  96.         }
  97.     }
  98.  
  99.     @Override
  100.     public boolean contains(int x) {
  101.         NodeRemoved toContains = findWindow(x).next;
  102.         return !(toContains instanceof Removed) && toContains.next.key == x;
  103.     }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement