Copyright 2011 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

package unicode
Bit masks for each code point under U+0100, for fast lookup.
const (
	pC     = 1 << iota // a control character.
	pP                 // a punctuation character.
	pN                 // a numeral.
	pS                 // a symbolic character.
	pZ                 // a spacing character.
	pLu                // an upper-case letter.
	pLl                // a lower-case letter.
	pp                 // a printable character according to Go's definition.
	pg     = pp | pZ   // a graphical character according to the Unicode definition.
	pLo    = pLl | pLu // a letter that is neither upper nor lower case.
	pLmask = pLo
)
GraphicRanges defines the set of graphic characters according to Unicode.
var GraphicRanges = []*RangeTable{
	L, M, N, P, S, Zs,
}
PrintRanges defines the set of printable characters according to Go. ASCII space, U+0020, is handled separately.
var PrintRanges = []*RangeTable{
	L, M, N, P, S,
}
IsGraphic reports whether the rune is defined as a Graphic by Unicode. Such characters include letters, marks, numbers, punctuation, symbols, and spaces, from categories L, M, N, P, S, Zs.
We convert to uint32 to avoid the extra test for negative, and in the index we convert to uint8 to avoid the range check.
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pg != 0
	}
	return In(, GraphicRanges...)
}
IsPrint reports whether the rune is defined as printable by Go. Such characters include letters, marks, numbers, punctuation, symbols, and the ASCII space character, from categories L, M, N, P, S and the ASCII space character. This categorization is the same as IsGraphic except that the only spacing character is ASCII space, U+0020.
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pp != 0
	}
	return In(, PrintRanges...)
}
IsOneOf reports whether the rune is a member of one of the ranges. The function "In" provides a nicer signature and should be used in preference to IsOneOf.
func ( []*RangeTable,  rune) bool {
	for ,  := range  {
		if Is(, ) {
			return true
		}
	}
	return false
}
In reports whether the rune is a member of one of the ranges.
func ( rune,  ...*RangeTable) bool {
	for ,  := range  {
		if Is(, ) {
			return true
		}
	}
	return false
}
IsControl reports whether the rune is a control character. The C (Other) Unicode category includes more code points such as surrogates; use Is(C, r) to test for them.
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pC != 0
All control characters are < MaxLatin1.
	return false
}
IsLetter reports whether the rune is a letter (category L).
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&(pLmask) != 0
	}
	return isExcludingLatin(Letter, )
}
IsMark reports whether the rune is a mark character (category M).
There are no mark characters in Latin-1.
	return isExcludingLatin(Mark, )
}
IsNumber reports whether the rune is a number (category N).
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pN != 0
	}
	return isExcludingLatin(Number, )
}
IsPunct reports whether the rune is a Unicode punctuation character (category P).
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pP != 0
	}
	return Is(Punct, )
}
IsSpace reports whether the rune is a space character as defined by Unicode's White Space property; in the Latin-1 space this is '\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP). Other definitions of spacing characters are set by category Z and property Pattern_White_Space.
This property isn't the same as Z; special-case it.
	if uint32() <= MaxLatin1 {
		switch  {
		case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0:
			return true
		}
		return false
	}
	return isExcludingLatin(White_Space, )
}
IsSymbol reports whether the rune is a symbolic character.
func ( rune) bool {
	if uint32() <= MaxLatin1 {
		return properties[uint8()]&pS != 0
	}
	return isExcludingLatin(Symbol, )