golang trieval 代码
文件路径:/src/vendor/golang.org/x/net/idna/trieval.go
/ Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
package idna
/ This file contains definitions for interpreting the trie value of the idna
/ trie generated by "go run gen*.go". It is shared by both the generator
/ program and the resultant package. Sharing is achieved by the generator
/ copying gen_trieval.go to trieval.go and changing what's above this comment.
/ info holds information from the IDNA mapping table for a single rune. It is
/ the value returned by a trie lookup. In most cases, all information fits in
/ a 16-bit value. For mappings, this value may contain an index into a slice
/ with the mapped string. Such mappings can consist of the actual mapped value
/ or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
/ input rune. This technique is used by the cases packages and reduces the
/ table size significantly.
/
/ The per-rune values have the following format:
/
/ if mapped {
/ if inlinedXOR {
/ 15..13 inline XOR marker
/ 12..11 unused
/ 10..3 inline XOR mask
/ } else {
/ 15..3 index into xor or mapping table
/ }
/ } else {
/ 15..14 unused
/ 13 mayNeedNorm
/ 12..11 attributes
/ 10..8 joining type
/ 7..3 category type
/ }
/ 2 use xor pattern
/ 1..0 mapped category
/
/ See the definitions below for a more detailed description of the various
/ bits.
type info uint16
const (
catSmallMask = 0x3
catBigMask = 0xF8
indexShift = 3
xorBit = 0x4 / interpret the index as an xor pattern
inlineXOR = 0xE000 / These bits are set if the XOR pattern is inlined.
joinShift = 8
joinMask = 0x07
/ Attributes
attributesMask = 0x1800
viramaModifier = 0x1800
modifier = 0x1000
rtl = 0x0800
mayNeedNorm = 0x2000
)
/ A category corresponds to a category defined in the IDNA mapping table.
type category uint16
const (
unknown category = 0 / not currently defined in unicode.
mapped category = 1
disallowedSTD3Mapped category = 2
deviation category = 3
)
const (
valid category = 0x08
validNV8 category = 0x18
validXV8 category = 0x28
disallowed category = 0x40
disallowedSTD3Valid category = 0x80
ignored category = 0xC0
)
/ join types and additional rune information
const (
joiningL = (iota + 1)
joiningD
joiningT
joiningR
/the following types are derived during processing
joinZWJ
joinZWNJ
joinVirama
numJoinTypes
)
func (c info) isMapped() bool {
return c&0x3 != 0
}
func (c info) category() category {
small := c & catSmallMask
if small != 0 {
return category(small)
}
return category(c & catBigMask)
}
func (c info) joinType() info {
if c.isMapped() {
return 0
}
return (c >> joinShift) & joinMask
}
func (c info) isModifier() bool {
return c&(modifier|catSmallMask) == modifier
}
func (c info) isViramaModifier() bool {
return c&(attributesMask|catSmallMask) == viramaModifier
}