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 }