aboutsummaryrefslogtreecommitdiff
path: root/page.go
diff options
context:
space:
mode:
Diffstat (limited to 'page.go')
-rw-r--r--page.go31
1 files changed, 25 insertions, 6 deletions
diff --git a/page.go b/page.go
index 7651a6b..ccc6666 100644
--- a/page.go
+++ b/page.go
@@ -145,12 +145,33 @@ func (a pgids) merge(b pgids) pgids {
// Return the opposite slice if one is nil.
if len(a) == 0 {
return b
- } else if len(b) == 0 {
+ }
+ if len(b) == 0 {
return a
}
+ merged := make(pgids, len(a)+len(b))
+ mergepgids(merged, a, b)
+ return merged
+}
+
+// merge copies the sorted union of a and b into dst.
+// If dst is too small, it panics.
+func mergepgids(dst, a, b pgids) {
+ if len(dst) < len(a)+len(b) {
+ panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b)))
+ }
+ // Copy in the opposite slice if one is nil.
+ if len(a) == 0 {
+ copy(dst, b)
+ return
+ }
+ if len(b) == 0 {
+ copy(dst, a)
+ return
+ }
- // Create a list to hold all elements from both lists.
- merged := make(pgids, 0, len(a)+len(b))
+ // Merged will hold all elements from both lists.
+ merged := dst[:0]
// Assign lead to the slice with a lower starting value, follow to the higher value.
lead, follow := a, b
@@ -172,7 +193,5 @@ func (a pgids) merge(b pgids) pgids {
}
// Append what's left in follow.
- merged = append(merged, follow...)
-
- return merged
+ _ = append(merged, follow...)
}