class Concurrent::Edge::LockFreeLinkedSet::Node

Public Class Methods

new(data = nil, successor = nil) click to toggle source
Calls superclass method
# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 11
def initialize(data = nil, successor = nil)
  super()
  @SuccessorReference = AtomicMarkableReference.new(successor || Tail.new)
  @Data                = data
  @Key                 = key_for data
end

Public Instance Methods

<=>(other) click to toggle source

We use `Object#hash` as a way to enforce ordering on the nodes. This can be configurable in the future; for example, you could enforce a split-ordering on the nodes in the set.

# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 51
def <=>(other)
  @Key <=> other.hash
end
data() click to toggle source
# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 18
def data
  @Data
end
key() click to toggle source
# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 26
def key
  @Key
end
key_for(data) click to toggle source

This method provides a unqiue key for the data which will be used for ordering. This is configurable, and changes depending on how you wish the nodes to be ordered.

# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 44
def key_for(data)
  data.hash
end
last?() click to toggle source

Check to see if the node is the last in the list.

# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 31
def last?
  @SuccessorReference.value.is_a? Tail
end
next_node() click to toggle source

Next node in the list. Note: this is not the AtomicMarkableReference of the next node, this is the actual Node itself.

# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 37
def next_node
  @SuccessorReference.value
end
successor_reference() click to toggle source
# File lib/concurrent/edge/lock_free_linked_set/node.rb, line 22
def successor_reference
  @SuccessorReference
end