mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-11-14 16:25:57 -05:00
d4da365c5f
* Reorganize strmatcher's package structure * Rename types in strmatcher package according to their file names * Stablize strmatcher's Matcher interface * Implement []matcherEntry as SimpleMatcherGroup * Implement mph algorithm extracted from MphIndexMatcher as MphMatcherGroup * Implement AddMatcher/AddFullMatcher/AddDomainMatcher/AddSubstrMatcher for each MatcherGroup * Stablize strmatcher's MatcherGroup interface * Stablize strmatcher's IndexMatcher interface * Update strmatcher's benchmark * Compatibility fix for app/router's DomainMatcher condition * Fix code quality issue * Fix basic matcher issues * Update priority specification for Substr matcher
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package strmatcher
|
|
|
|
// LinearIndexMatcher is an implementation of IndexMatcher.
|
|
// Empty initialization works.
|
|
type LinearIndexMatcher struct {
|
|
count uint32
|
|
fullMatcher FullMatcherGroup
|
|
domainMatcher DomainMatcherGroup
|
|
substrMatcher SubstrMatcherGroup
|
|
otherMatchers 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:
|
|
g.fullMatcher.AddFullMatcher(matcher, index)
|
|
case DomainMatcher:
|
|
g.domainMatcher.AddDomainMatcher(matcher, index)
|
|
case SubstrMatcher:
|
|
g.substrMatcher.AddSubstrMatcher(matcher, index)
|
|
default:
|
|
g.otherMatchers.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 {
|
|
result := []uint32{}
|
|
result = append(result, g.fullMatcher.Match(input)...)
|
|
result = append(result, g.domainMatcher.Match(input)...)
|
|
result = append(result, g.substrMatcher.Match(input)...)
|
|
result = append(result, g.otherMatchers.Match(input)...)
|
|
return result
|
|
}
|
|
|
|
// MatchAny implements IndexMatcher.MatchAny.
|
|
func (g *LinearIndexMatcher) MatchAny(input string) bool {
|
|
return len(g.Match(input)) > 0
|
|
}
|
|
|
|
// Size implements IndexMatcher.Size.
|
|
func (g *LinearIndexMatcher) Size() uint32 {
|
|
return g.count
|
|
}
|