Class: Garcon::MutexPriorityQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/garcon/task/priority_queue.rb

Overview

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.

Direct Known Subclasses

PriorityQueue

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ MutexPriorityQueue

Create a new priority queue with no items.

Parameters:

  • opts (Hash) (defaults to: {})

    The options for creating the queue.

Options Hash (opts):

  • :order (Symbol) — default: :max

    dictates the order in which items are stored: from highest to lowest when :max or :high; from lowest to highest when :min or :low



41
42
43
44
45
# File 'lib/garcon/task/priority_queue.rb', line 41

def initialize(opts = {})
  order = opts.fetch(:order, :max)
  @comparator = [:min, :low].include?(order) ? -1 : 1
  clear
end

Class Method Details

.from_list(list, opts = {}) ⇒ PriorityQueue

Create a new priority queue from the given list.

Parameters:

  • list (Enumerable)

    The list to build the queue from.

  • opts (Hash) (defaults to: {})

    The options for creating the queue.

Returns:



164
165
166
167
168
# File 'lib/garcon/task/priority_queue.rb', line 164

def self.from_list(list, opts = {})
  queue = new(opts)
  list.each { |item| queue << item }
  queue
end

Instance Method Details

#clearObject

Removes all of the elements from this priority queue.



49
50
51
52
53
# File 'lib/garcon/task/priority_queue.rb', line 49

def clear
  @queue = [nil]
  @length = 0
  true
end

#delete(item) ⇒ Object

Deletes all items from self that are equal to item.

Parameters:

  • item (Object)

    The item to be removed from the queue.

Returns:

  • (Object)

    True if the item is found else false.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/garcon/task/priority_queue.rb', line 63

def delete(item)
  original_length = @length
  k = 1
  while k <= @length
    if @queue[k] == item
      swap(k, @length)
      @length -= 1
      sink(k)
      @queue.pop
    else
      k += 1
    end
  end
  @length != original_length
end

#empty?Boolean

Returns true if self contains no elements.

Returns:

  • (Boolean)

    True if there are no items in the queue else false.



84
85
86
# File 'lib/garcon/task/priority_queue.rb', line 84

def empty?
  size == 0
end

#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.

Parameters:

  • item (Object)

    The item to search for

Returns:

  • (Boolean)

    True if the item is found else false.



97
98
99
# File 'lib/garcon/task/priority_queue.rb', line 97

def include?(item)
  @queue.include?(item)
end

#lengthFixnum Also known as: size

The current length of the queue.

Returns:

  • (Fixnum)

    The number of items in the queue.



107
108
109
# File 'lib/garcon/task/priority_queue.rb', line 107

def length
  @length
end

#peekObject

Retrieves, but does not remove, the head of this queue, or returns nil if this queue is empty.

Returns:

  • (Object)

    The head of the queue or nil when empty.



118
119
120
# File 'lib/garcon/task/priority_queue.rb', line 118

def peek
  @queue[1]
end

#popObject Also known as: deq, shift

Retrieves and removes the head of this queue, or returns nil if this queue is empty.

Returns:

  • (Object)

    The head of the queue or nil when empty.



128
129
130
131
132
133
134
135
# File 'lib/garcon/task/priority_queue.rb', line 128

def pop
  max = @queue[1]
  swap(1, @length)
  @length -= 1
  sink(1)
  @queue.pop
  max
end

#push(item) ⇒ Object Also known as: <<, enq

Inserts the specified element into this priority queue.

Parameters:

  • Item (Object)

    the item to insert onto the queue.



144
145
146
147
148
149
# File 'lib/garcon/task/priority_queue.rb', line 144

def push(item)
  @length += 1
  @queue << item
  swim(@length)
  true
end