summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2017-08-16 12:26:06 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2017-08-16 12:26:06 +0900
commit0558dfee795c297abef27a3abaa232c73d8a042d (patch)
tree0ff7906ad4ba93c8615fa33b80ac955ff488ea56
parent487c8fe88f4cfcc55850b8aef73665b1d09b8fe0 (diff)
Remove count field from ChunkList
-rw-r--r--src/chunklist.go22
-rw-r--r--src/chunklist_test.go7
-rw-r--r--src/core.go13
3 files changed, 17 insertions, 25 deletions
diff --git a/src/chunklist.go b/src/chunklist.go
index 599a1ad1..510cd734 100644
--- a/src/chunklist.go
+++ b/src/chunklist.go
@@ -8,14 +8,12 @@ type Chunk struct {
count int
}
-// ItemBuilder is a closure type that builds Item object from a pointer to a
-// string and an integer
-type ItemBuilder func(*Item, []byte, int) bool
+// ItemBuilder is a closure type that builds Item object from byte array
+type ItemBuilder func(*Item, []byte) bool
// ChunkList is a list of Chunks
type ChunkList struct {
chunks []*Chunk
- count int
mutex sync.Mutex
trans ItemBuilder
}
@@ -24,13 +22,12 @@ type ChunkList struct {
func NewChunkList(trans ItemBuilder) *ChunkList {
return &ChunkList{
chunks: []*Chunk{},
- count: 0,
mutex: sync.Mutex{},
trans: trans}
}
-func (c *Chunk) push(trans ItemBuilder, data []byte, index int) bool {
- if trans(&c.items[c.count], data, index) {
+func (c *Chunk) push(trans ItemBuilder, data []byte) bool {
+ if trans(&c.items[c.count], data) {
c.count++
return true
}
@@ -62,13 +59,9 @@ func (cl *ChunkList) Push(data []byte) bool {
cl.chunks = append(cl.chunks, &Chunk{})
}
- if cl.lastChunk().push(cl.trans, data, cl.count) {
- cl.count++
- cl.mutex.Unlock()
- return true
- }
+ ret := cl.lastChunk().push(cl.trans, data)
cl.mutex.Unlock()
- return false
+ return ret
}
// Snapshot returns immutable snapshot of the ChunkList
@@ -76,7 +69,6 @@ func (cl *ChunkList) Snapshot() ([]*Chunk, int) {
cl.mutex.Lock()
ret := make([]*Chunk, len(cl.chunks))
- count := cl.count
copy(ret, cl.chunks)
// Duplicate the last chunk
@@ -86,5 +78,5 @@ func (cl *ChunkList) Snapshot() ([]*Chunk, int) {
}
cl.mutex.Unlock()
- return ret, count
+ return ret, CountItems(ret)
}
diff --git a/src/chunklist_test.go b/src/chunklist_test.go
index c8d33a67..6c1d09eb 100644
--- a/src/chunklist_test.go
+++ b/src/chunklist_test.go
@@ -11,9 +11,8 @@ func TestChunkList(t *testing.T) {
// FIXME global
sortCriteria = []criterion{byScore, byLength}
- cl := NewChunkList(func(item *Item, s []byte, i int) bool {
+ cl := NewChunkList(func(item *Item, s []byte) bool {
item.text = util.ToChars(s)
- item.text.Index = int32(i * 2)
return true
})
@@ -44,9 +43,7 @@ func TestChunkList(t *testing.T) {
t.Error("Snapshot should contain only two items")
}
if chunk1.items[0].text.ToString() != "hello" ||
- chunk1.items[0].Index() != 0 ||
- chunk1.items[1].text.ToString() != "world" ||
- chunk1.items[1].Index() != 2 {
+ chunk1.items[1].text.ToString() != "world" {
t.Error("Invalid data")
}
if chunk1.IsFull() {
diff --git a/src/core.go b/src/core.go
index 61f14f91..6bb4b2e7 100644
--- a/src/core.go
+++ b/src/core.go
@@ -83,20 +83,22 @@ func Run(opts *Options, revision string) {
// Chunk list
var chunkList *ChunkList
+ var itemIndex int32
header := make([]string, 0, opts.HeaderLines)
if len(opts.WithNth) == 0 {
- chunkList = NewChunkList(func(item *Item, data []byte, index int) bool {
+ chunkList = NewChunkList(func(item *Item, data []byte) bool {
if len(header) < opts.HeaderLines {
header = append(header, string(data))
eventBox.Set(EvtHeader, header)
return false
}
item.text, item.colors = ansiProcessor(data)
- item.text.Index = int32(index)
+ item.text.Index = itemIndex
+ itemIndex++
return true
})
} else {
- chunkList = NewChunkList(func(item *Item, data []byte, index int) bool {
+ chunkList = NewChunkList(func(item *Item, data []byte) bool {
tokens := Tokenize(string(data), opts.Delimiter)
trans := Transform(tokens, opts.WithNth)
transformed := joinTokens(trans)
@@ -106,8 +108,9 @@ func Run(opts *Options, revision string) {
return false
}
item.text, item.colors = ansiProcessor([]byte(transformed))
- item.text.Index = int32(index)
+ item.text.Index = itemIndex
item.origText = &data
+ itemIndex++
return true
})
}
@@ -153,7 +156,7 @@ func Run(opts *Options, revision string) {
reader := NewReader(
func(runes []byte) bool {
item := Item{}
- if chunkList.trans(&item, runes, 0) {
+ if chunkList.trans(&item, runes) {
if result, _, _ := pattern.MatchItem(&item, false, slab); result != nil {
opts.Printer(item.text.ToString())
found = true