summaryrefslogtreecommitdiffstats
path: root/src/merger.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-03-19 19:59:38 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-03-19 19:59:38 +0900
commitd94dfe087694d68073f01a51c7357fc4741641d8 (patch)
tree6b607257229b76db9fc275c6fd3533e8c9190b34 /src/merger.go
parent6130026786fce0a8ac9e053694761405f4f599c3 (diff)
Fix #151 - reduce initial memory footprint
Diffstat (limited to 'src/merger.go')
-rw-r--r--src/merger.go24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/merger.go b/src/merger.go
index 41323c18..21a74597 100644
--- a/src/merger.go
+++ b/src/merger.go
@@ -10,6 +10,7 @@ var EmptyMerger = NewMerger([][]*Item{}, false, false)
type Merger struct {
lists [][]*Item
merged []*Item
+ chunks *[]*Chunk
cursors []int
sorted bool
tac bool
@@ -17,11 +18,24 @@ type Merger struct {
count int
}
+func PassMerger(chunks *[]*Chunk, tac bool) *Merger {
+ mg := Merger{
+ chunks: chunks,
+ tac: tac,
+ count: 0}
+
+ for _, chunk := range *mg.chunks {
+ mg.count += len(*chunk)
+ }
+ return &mg
+}
+
// NewMerger returns a new Merger
func NewMerger(lists [][]*Item, sorted bool, tac bool) *Merger {
mg := Merger{
lists: lists,
merged: []*Item{},
+ chunks: nil,
cursors: make([]int, len(lists)),
sorted: sorted,
tac: tac,
@@ -41,12 +55,20 @@ func (mg *Merger) Length() int {
// Get returns the pointer to the Item object indexed by the given integer
func (mg *Merger) Get(idx int) *Item {
+ if mg.chunks != nil {
+ if mg.tac {
+ idx = mg.count - idx - 1
+ }
+ chunk := (*mg.chunks)[idx/ChunkSize]
+ return (*chunk)[idx%ChunkSize]
+ }
+
if mg.sorted {
return mg.mergedGet(idx)
}
if mg.tac {
- idx = mg.Length() - idx - 1
+ idx = mg.count - idx - 1
}
for _, list := range mg.lists {
numItems := len(list)