diff options
author | 2021-08-12 21:03:24 +0200 | |
---|---|---|
committer | 2021-08-12 21:03:24 +0200 | |
commit | 98263a7de64269898a2f81207e38943b5c8e8653 (patch) | |
tree | 743c90f109a6c5d27832d1dcef2388d939f0f77a /vendor/github.com/golang/geo/s2/query_entry.go | |
parent | Text duplication fix (#137) (diff) | |
download | gotosocial-98263a7de64269898a2f81207e38943b5c8e8653.tar.xz |
Grand test fixup (#138)
* start fixing up tests
* fix up tests + automate with drone
* fiddle with linting
* messing about with drone.yml
* some more fiddling
* hmmm
* add cache
* add vendor directory
* verbose
* ci updates
* update some little things
* update sig
Diffstat (limited to 'vendor/github.com/golang/geo/s2/query_entry.go')
-rw-r--r-- | vendor/github.com/golang/geo/s2/query_entry.go | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/vendor/github.com/golang/geo/s2/query_entry.go b/vendor/github.com/golang/geo/s2/query_entry.go new file mode 100644 index 000000000..65e819e3a --- /dev/null +++ b/vendor/github.com/golang/geo/s2/query_entry.go @@ -0,0 +1,93 @@ +// Copyright 2020 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package s2 + +import "container/heap" + +// A queryQueueEntry stores CellIDs and distance from a target. It is used by the +// different S2 Query types to efficiently build their internal priority queue +// in the optimized algorithm implementations. +type queryQueueEntry struct { + // A lower bound on the distance from the target to ID. This is the key + // of the priority queue. + distance distance + + // The cell being queued. + id CellID + + // If the CellID belongs to a ShapeIndex, this field stores the + // corresponding ShapeIndexCell. Otherwise ID is a proper ancestor of + // one or more ShapeIndexCells and this field stores is nil. + indexCell *ShapeIndexCell +} + +// queryQueue is used by the optimized algorithm to maintain a priority queue of +// unprocessed CellIDs, sorted in increasing order of distance from the target. +type queryQueue struct { + queue queryPQ +} + +// newQueryQueue returns a new initialized queryQueue. +func newQueryQueue() *queryQueue { + q := &queryQueue{ + queue: make(queryPQ, 0), + } + heap.Init(&q.queue) + return q +} + +// push adds the given entry to the top of this queue. +func (q *queryQueue) push(e *queryQueueEntry) { + heap.Push(&q.queue, e) +} + +// pop returns the top element of this queue. +func (q *queryQueue) pop() *queryQueueEntry { + return heap.Pop(&q.queue).(*queryQueueEntry) +} + +func (q *queryQueue) size() int { + return q.queue.Len() +} + +func (q *queryQueue) reset() { + q.queue = q.queue[:0] +} + +// queryPQ is a priority queue that implements the heap interface. +type queryPQ []*queryQueueEntry + +func (q queryPQ) Len() int { return len(q) } +func (q queryPQ) Less(i, j int) bool { + return q[i].distance.less(q[j].distance) +} + +// Swap swaps the two entries. +func (q queryPQ) Swap(i, j int) { + q[i], q[j] = q[j], q[i] +} + +// Push adds the given entry to the queue. +func (q *queryPQ) Push(x interface{}) { + item := x.(*queryQueueEntry) + *q = append(*q, item) +} + +// Pop returns the top element of the queue. +func (q *queryPQ) Pop() interface{} { + item := (*q)[len(*q)-1] + *q = (*q)[:len(*q)-1] + return item +} |