Fast ring-buffer deque (double-ended queue), for integers only. Fork of https://github.com/gammazero/deque
Go to file
2018-04-23 23:06:09 -04:00
.gitignore initial commit 2018-04-23 23:06:09 -04:00
.travis.yml initial commit 2018-04-23 23:06:09 -04:00
deque.go initial commit 2018-04-23 23:06:09 -04:00
deque_test.go initial commit 2018-04-23 23:06:09 -04:00
go.test.sh initial commit 2018-04-23 23:06:09 -04:00
README.md initial commit 2018-04-23 23:06:09 -04:00

deque

Build Status Go Report Card codecov License

A fast ring-buffer deque (double-ended queue) implementation.

GoDoc

This deque implementation automatically re-sizes by powers of two, growing when additional capacity is needed and shrinking when only a quarter of the capacity is used. This allows bitwise arithmetic for all calculations.

The ring-buffer implementation significantly improves memory and time performance with fewer GC pauses, compared to implementations based on slices and linked lists.

For maximum speed, this deque implementation leaves concurrency safety up to the application to provide, however is best for the application if needed at all.

Installation

$ go get github.com/gammazero/deque

Example

package main

import (
    "fmt"
    "github.com/gammazero/deque"
)

func main() {
    var q deque.Deque
    q.PushBack("foo")
    q.PushBack("bar")
    q.PushBack("baz")

    fmt.Println(q.Len())   // Prints: 3
    fmt.Println(q.Front()) // Prints: foo
    fmt.Println(q.Back())  // Prints: baz

    q.PopFront() // remove "foo"
    q.PopBack()  // remove "baz"

    q.PushFront("hello")
    q.PushBack("world")

    // Print: hello bar world
    for i := 0; i < q.Len(); i++ {
        fmt.Print(q.PeekAt(i), " ")
    }
    fmt.Println()
}