summaryrefslogtreecommitdiff
path: root/vendor/github.com/golang/geo/s2/query_entry.go
diff options
context:
space:
mode:
authorLibravatar Tobi Smethurst <31960611+tsmethurst@users.noreply.github.com>2021-08-12 21:03:24 +0200
committerLibravatar GitHub <noreply@github.com>2021-08-12 21:03:24 +0200
commit98263a7de64269898a2f81207e38943b5c8e8653 (patch)
tree743c90f109a6c5d27832d1dcef2388d939f0f77a /vendor/github.com/golang/geo/s2/query_entry.go
parentText duplication fix (#137) (diff)
downloadgotosocial-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.go93
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
+}