Skip to content

A FIFO queue written in pure Swift, backed by a circular buffer

License

Notifications You must be signed in to change notification settings

peteraisher/SwiftQueue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SwiftQueue

A first-in-first-out queue.

The SwiftQueue type stores its elements in a circular buffer in one or two contiguous regions of memory. Add elements to the queue by calling append(_:) and remove elements in the order they were added by calling removeFirst() on a non-empty queue or popFirst() on a possibly-empty queue.

Subscript access allows access to the elements of the queue in the order that they were added.

Features

  • Conforms to the same protocols as Array including Collection and RangeReplaceableCollection.
  • Uses a highly-performant circular buffer backing.
  • append(_:) and popFirst() are both O(1) operations.
  • Significantly better cache-locality than linked-list implementations.
  • Thoroughly documented source code.

Documentation

The source code contains extensive documentation of both public and internal functions. SwiftQueue does not add extra methods for push(_:), pop() and peek() instead using the existing methods and properties defined in Swift's various protocols:

  • append(_:) to add an element to the end of the queue
  • popFirst() -> Element? to remove the first element in the queue or return nil if empty
  • first: Element? to access the first element in the queue without removing it.

Initialization

SwiftQueue can be initialized just like an Array instance.

A queue with Int elements can be created as follows:

var queue = SwiftQueue<Int>()
...
var queue = SwiftQueue([1, 3, 5, 8, 9])
...
var queue = SwiftQueue( 2 ..< 14 )
...
var queue: SwiftQueue = [1, 2, 4, 3, 6]

Adding, removing, and accessing elements

Elements can be added, removed and accessed using standard methods and properties:

var queue: SwiftQueue = ["I", "love", "to", "queue"]

queue.append("!")           // queue is now ["I", "love", "to", "queue", "!"]
print(queue.removeFirst())  // prints "I"
                            // queue is now ["love", "to", "queue", "!"]

print(queue.first!)         // prints "love"

for element in queue {
    print(element)          // prints "to", "queue", "!"
}

print(queue[1])             // prints "queue"

while let element = queue.popFirst() {
    print(element)          // prints "to", "queue", "!"
}

print(queue.isEmpty)        // prints "true"

Other operations

Other methods and properties can be used like with Array:

let queue: SwiftQueue = [1.0, 3.2, 3.5, 8.0]

queue.count             // returns 4

queue.last              // returns Optional(8.0)

Performance

For operations such as append(_:), performance of SwiftQueue is similar to Array. The operations removeFirst() and removeFirst(k) have complexity O(1) and O(k) respectively, instead of O(n), where n is the length of the collection. Additionally, when the number of calls to append(_:) and removeFirst() are balanced and the length of the queue remains stable, memory locality is maintained, thereby improving cache performance.

About

A FIFO queue written in pure Swift, backed by a circular buffer

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages