github.com/arnodel/golua@v0.0.0-20230215163904-e0b5347eaaa1/lib/stringlib/pattern/byteset.go (about)

     1  package pattern
     2  
     3  type byteSet [4]uint64
     4  
     5  func (s *byteSet) merge(t byteSet) {
     6  	s[0] |= t[0]
     7  	s[1] |= t[1]
     8  	s[2] |= t[2]
     9  	s[3] |= t[3]
    10  }
    11  
    12  func (s *byteSet) add(b byte) {
    13  	s[b>>6] |= uint64(1) << (b & 0x3F)
    14  }
    15  
    16  func (s *byteSet) complement() {
    17  	s[0] ^= full64
    18  	s[1] ^= full64
    19  	s[2] ^= full64
    20  	s[3] ^= full64
    21  }
    22  
    23  func (s byteSet) contains(b byte) bool {
    24  	return s[b>>6]>>(b&0x3F)&1 != 0
    25  }
    26  
    27  // byte sets below are built with this function
    28  //
    29  func byteRange(a, b byte) (s byteSet) {
    30  	for i := a; i < b; i++ {
    31  		s.add(i)
    32  	}
    33  	s.add(b)
    34  	return
    35  }
    36  
    37  func complement(b byteSet) byteSet {
    38  	b.complement()
    39  	return b
    40  }
    41  
    42  const full64 uint64 = ^uint64(0)
    43  
    44  var (
    45  	letterSet    = byteSet{0x0, 0x7fffffe07fffffe, 0x0, 0x0}                 // r('a', 'z', 'A', 'Z')
    46  	controlSet   = byteSet{0xffffffff, 0x8000000000000000, 0x0, 0x0}         // r(0, 32, 127, 127)
    47  	digitSet     = byteSet{0x3ff000000000000, 0x0, 0x0, 0x0}                 // r('0', '9')
    48  	printableSet = byteSet{0xfffffffe00000000, 0x7fffffffffffffff, 0x0, 0x0} // r(33, 126)
    49  	lowerSet     = byteSet{0x0, 0x7fffffe00000000, 0x0, 0x0}                 // r('a', z')
    50  	punctSet     = byteSet{0xfc00fffe00000000, 0x78000001f8000001, 0x0, 0x0} // r('!', '/', ':', '@', '[', '`', '{', '~')
    51  	spaceSet     = byteSet{0x100003e00, 0x0, 0x0, 0x0}                       // r(9, 13, 32, 32)
    52  	upperSet     = byteSet{0x0, 0x7fffffe, 0x0, 0x0}                         // r('A', 'Z')
    53  	alphanumSet  = byteSet{0x3ff000000000000, 0x7fffffe07fffffe, 0x0, 0x0}   // r('A', 'Z', 'a', 'z', '0', '9')
    54  	hexSet       = byteSet{0x3ff000000000000, 0x7e0000007e, 0x0, 0x0}
    55  	zeroSet      = byteSet{0x1, 0x0, 0x0, 0x0}
    56  
    57  	fullSet = byteSet{full64, full64, full64, full64}
    58  )
    59  
    60  var namedByteSet = map[byte]byteSet{
    61  	'a': letterSet,
    62  	'c': controlSet,
    63  	'd': digitSet,
    64  	'g': printableSet,
    65  	'l': lowerSet,
    66  	'p': punctSet,
    67  	's': spaceSet,
    68  	'u': upperSet,
    69  	'w': alphanumSet,
    70  	'x': hexSet,
    71  	'z': zeroSet,
    72  	'A': complement(letterSet),
    73  	'C': complement(controlSet),
    74  	'D': complement(digitSet),
    75  	'G': complement(printableSet),
    76  	'L': complement(lowerSet),
    77  	'P': complement(punctSet),
    78  	'S': complement(spaceSet),
    79  	'U': complement(upperSet),
    80  	'W': complement(alphanumSet),
    81  	'X': complement(hexSet),
    82  	'Z': complement(zeroSet),
    83  }