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  }