Class: Concurrent::Collection::RubyNonConcurrentPriorityQueue
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb |
Overview
This implementation is not thread safe.
**Private Implementation:** This abstraction is a private, internal implementation detail. It should never be used directly.
A queue collection in which the elements are sorted based on their comparison (spaceship) operator <=>
. Items are added to the queue at a position relative to their priority. On removal the element with the “highest” priority is removed. By default the sort order is from highest to lowest, but a lowest-to-highest sort order can be set on construction.
The API is based on the Queue
class from the Ruby standard library.
The pure Ruby implementation, RubyNonConcurrentPriorityQueue
uses a heap algorithm stored in an array. The algorithm is based on the work of Robert Sedgewick and Kevin Wayne.
The JRuby native implementation is a thin wrapper around the standard library java.util.NonConcurrentPriorityQueue
.
When running under JRuby the class NonConcurrentPriorityQueue
extends JavaNonConcurrentPriorityQueue
. When running under all other interpreters it extends RubyNonConcurrentPriorityQueue
.
Class Method Summary
-
.from_list(list, opts = {}) ⇒ NonConcurrentPriorityQueue
Create a new priority queue from the given list.
-
.new(opts = {}) ⇒ RubyNonConcurrentPriorityQueue
constructor
Create a new priority queue with no items.
Instance Attribute Summary
-
#empty? ⇒ Boolean
readonly
Returns
true
ifself
contains no elements.
Instance Method Summary
-
#<<(item)
Alias for #push.
-
#clear
Removes all of the elements from this priority queue.
-
#delete(item) ⇒ Object
Deletes all items from
self
that are equal toitem
. -
#deq
Alias for #pop.
-
#enq(item)
Alias for #push.
-
#has_priority?(item)
Alias for #include?.
-
#include?(item) ⇒ Boolean
(also: #has_priority?)
Returns
true
if the given item is present inself
(that is, if any element ==item
), otherwise returns false. -
#length ⇒ Fixnum
(also: #size)
The current length of the queue.
-
#peek ⇒ Object
Retrieves, but does not remove, the head of this queue, or returns
nil
if this queue is empty. -
#pop ⇒ Object
(also: #deq, #shift)
Retrieves and removes the head of this queue, or returns
nil
if this queue is empty. -
#push(item)
(also: #<<, #enq)
Inserts the specified element into this priority queue.
-
#shift
Alias for #pop.
-
#size
Alias for #length.
-
#ordered?(x, y) ⇒ Boolean
private
Are the items at the given indexes ordered based on the priority order specified at construction?
-
#sink(k)
private
Percolate down to maintain heap invariant.
-
#swap(x, y)
private
Exchange the values at the given indexes within the internal array.
-
#swim(k)
private
Percolate up to maintain heap invariant.
Constructor Details
.new(opts = {}) ⇒ RubyNonConcurrentPriorityQueue
Create a new priority queue with no items.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 11
def initialize(opts = {}) order = opts.fetch(:order, :max) @comparator = [:min, :low].include?(order) ? -1 : 1 clear end
Class Method Details
.from_list(list, opts = {}) ⇒ NonConcurrentPriorityQueue
Create a new priority queue from the given list.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 89
def self.from_list(list, opts = {}) queue = new(opts) list.each{|item| queue << item } queue end
Instance Attribute Details
#empty? ⇒ Boolean
(readonly)
Returns true
if self
contains no elements.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 43
def empty? size == 0 end
Instance Method Details
#<<(item)
Alias for #push.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 85
alias_method :<<, :push
#clear
Removes all of the elements from this priority queue.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 18
def clear @queue = [nil] @length = 0 true end
#delete(item) ⇒ Object
Deletes all items from self
that are equal to item
.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 25
def delete(item) return false if empty? original_length = @length k = 1 while k <= @length if @queue[k] == item swap(k, @length) @length -= 1 sink(k) || swim(k) @queue.pop else k += 1 end end @length != original_length end
#deq
Alias for #pop.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 74
alias_method :deq, :pop
#enq(item)
Alias for #push.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 86
alias_method :enq, :push
#has_priority?(item)
Alias for #include?.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 51
alias_method :has_priority?, :include?
#include?(item) ⇒ Boolean
Also known as: #has_priority?
Returns true
if the given item is present in self
(that is, if any element == item
), otherwise returns false.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 48
def include?(item) @queue.include?(item) end
#length ⇒ Fixnum
Also known as: #size
The current length of the queue.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 54
def length @length end
#ordered?(x, y) ⇒ Boolean
(private)
Are the items at the given indexes ordered based on the priority order specified at construction?
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 119
def ordered?(x, y) (@queue[x] <=> @queue[y]) == @comparator end
#peek ⇒ Object
Retrieves, but does not remove, the head of this queue, or returns nil
if this queue is empty.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 60
def peek empty? ? nil : @queue[1] end
#pop ⇒ Object Also known as: #deq, #shift
Retrieves and removes the head of this queue, or returns nil
if this queue is empty.
#push(item) Also known as: #<<, #enq
Inserts the specified element into this priority queue.
#shift
Alias for #pop.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 75
alias_method :shift, :pop
#sink(k) (private)
Percolate down to maintain heap invariant.
#size
Alias for #length.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 57
alias_method :size, :length
#swap(x, y) (private)
Exchange the values at the given indexes within the internal array.
# File 'lib/concurrent-ruby/concurrent/collection/ruby_non_concurrent_priority_queue.rb', line 103
def swap(x, y) temp = @queue[x] @queue[x] = @queue[y] @queue[y] = temp end
#swim(k) (private)
Percolate up to maintain heap invariant.