From 313578a1a07e79aba273f47a281247e76e6329d6 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 11 Jan 2015 03:53:07 +0900 Subject: Improve prefix/suffix cache lookup --- src/pattern.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'src/pattern.go') diff --git a/src/pattern.go b/src/pattern.go index 2aa45c2c..31ba8137 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -194,24 +194,19 @@ func (p *Pattern) Match(chunk *Chunk) []*Item { } } - // ChunkCache: Prefix match - foundPrefixCache := false - for idx := len(cacheKey) - 1; idx > 0; idx-- { - if cached, found := _cache.Find(chunk, cacheKey[:idx]); found { - cachedChunk := Chunk(cached) - space = &cachedChunk - foundPrefixCache = true - break - } - } - - // ChunkCache: Suffix match - if !foundPrefixCache { - for idx := 1; idx < len(cacheKey); idx++ { - if cached, found := _cache.Find(chunk, cacheKey[idx:]); found { + // ChunkCache: Prefix/suffix match +Loop: + for idx := 1; idx < len(cacheKey); idx++ { + // [---------| ] | [ |---------] + // [--------| ] | [ |--------] + // [-------| ] | [ |-------] + prefix := cacheKey[:len(cacheKey)-idx] + suffix := cacheKey[idx:] + for _, substr := range [2]*string{&prefix, &suffix} { + if cached, found := _cache.Find(chunk, *substr); found { cachedChunk := Chunk(cached) space = &cachedChunk - break + break Loop } } } -- cgit v1.2.3