github.com/Asutorufa/yuhaiin@v0.3.6-0.20240502055049-7984da7023a0/pkg/net/trie/domain/reader.go (about) 1 package domain 2 3 import "strings" 4 5 type fqdnReader struct { 6 domain string 7 aft, pre int 8 } 9 10 func newReader(domain string) *fqdnReader { 11 return &fqdnReader{ 12 domain: domain, 13 aft: len(domain), 14 pre: strings.LastIndexByte(domain, '.') + 1, 15 } 16 } 17 18 func (d *fqdnReader) hasNext() bool { 19 return d.aft >= 0 20 } 21 22 func (d *fqdnReader) last() bool { 23 return d.pre == 0 24 } 25 26 func (d *fqdnReader) next() bool { 27 d.aft = d.pre - 1 28 if d.aft < 0 { 29 return false 30 } 31 d.pre = strings.LastIndexByte(d.domain[:d.aft], '.') + 1 32 return true 33 } 34 35 func (d *fqdnReader) reset() { 36 d.aft = len(d.domain) 37 d.pre = strings.LastIndexByte(d.domain, '.') + 1 38 } 39 40 var valueEmpty = string([]byte{0x03}) 41 42 func (d *fqdnReader) str() string { 43 if d.pre == d.aft { 44 return valueEmpty 45 } 46 return d.domain[d.pre:d.aft] 47 }