| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package strmatcher
- // LinearIndexMatcher is an implementation of IndexMatcher.
- type LinearIndexMatcher struct {
- count uint32
- full *FullMatcherGroup
- domain *DomainMatcherGroup
- substr *SubstrMatcherGroup
- regex *SimpleMatcherGroup
- }
- func NewLinearIndexMatcher() *LinearIndexMatcher {
- return new(LinearIndexMatcher)
- }
- // Add implements IndexMatcher.Add.
- func (g *LinearIndexMatcher) Add(matcher Matcher) uint32 {
- g.count++
- index := g.count
- switch matcher := matcher.(type) {
- case FullMatcher:
- if g.full == nil {
- g.full = NewFullMatcherGroup()
- }
- g.full.AddFullMatcher(matcher, index)
- case DomainMatcher:
- if g.domain == nil {
- g.domain = NewDomainMatcherGroup()
- }
- g.domain.AddDomainMatcher(matcher, index)
- case SubstrMatcher:
- if g.substr == nil {
- g.substr = new(SubstrMatcherGroup)
- }
- g.substr.AddSubstrMatcher(matcher, index)
- default:
- if g.regex == nil {
- g.regex = new(SimpleMatcherGroup)
- }
- g.regex.AddMatcher(matcher, index)
- }
- return index
- }
- // Build implements IndexMatcher.Build.
- func (*LinearIndexMatcher) Build() error {
- return nil
- }
- // Match implements IndexMatcher.Match.
- func (g *LinearIndexMatcher) Match(input string) []uint32 {
- // Allocate capacity to prevent matches escaping to heap
- result := make([][]uint32, 0, 5)
- if g.full != nil {
- if matches := g.full.Match(input); len(matches) > 0 {
- result = append(result, matches)
- }
- }
- if g.domain != nil {
- if matches := g.domain.Match(input); len(matches) > 0 {
- result = append(result, matches)
- }
- }
- if g.substr != nil {
- if matches := g.substr.Match(input); len(matches) > 0 {
- result = append(result, matches)
- }
- }
- if g.regex != nil {
- if matches := g.regex.Match(input); len(matches) > 0 {
- result = append(result, matches)
- }
- }
- return CompositeMatches(result)
- }
- // MatchAny implements IndexMatcher.MatchAny.
- func (g *LinearIndexMatcher) MatchAny(input string) bool {
- if g.full != nil && g.full.MatchAny(input) {
- return true
- }
- if g.domain != nil && g.domain.MatchAny(input) {
- return true
- }
- if g.substr != nil && g.substr.MatchAny(input) {
- return true
- }
- return g.regex != nil && g.regex.MatchAny(input)
- }
- // Size implements IndexMatcher.Size.
- func (g *LinearIndexMatcher) Size() uint32 {
- return g.count
- }
|