// This file was generated by go generate; DO NOT EDIT

package bidi

type class int

const (
	_L           class = iota // LeftToRight
	_R                        // RightToLeft
	_EN                       // EuropeanNumber
	_ES                       // EuropeanSeparator
	_ET                       // EuropeanTerminator
	_AN                       // ArabicNumber
	_CS                       // CommonSeparator
	_B                        // ParagraphSeparator
	_S                        // SegmentSeparator
	_WS                       // WhiteSpace
	_ON                       // OtherNeutral
	_BN                       // BoundaryNeutral
	_NSM                      // NonspacingMark
	_AL                       // ArabicLetter
	classControl              // Control LRO - PDI

	numClass

	_LRO // LeftToRightOverride
	_RLO // RightToLeftOverride
	_LRE // LeftToRightEmbedding
	_RLE // RightToLeftEmbedding
	_PDF // PopDirectionalFormat
	_LRI // LeftToRightIsolate
	_RLI // RightToLeftIsolate
	_FSI // FirstStrongIsolate
	_PDI // PopDirectionalIsolate
)

var controlToClass = map[rune]class{
	0x202D: _LRO, // LeftToRightOverride,
	0x202E: _RLO, // RightToLeftOverride,
	0x202A: _LRE, // LeftToRightEmbedding,
	0x202B: _RLE, // RightToLeftEmbedding,
	0x202C: _PDF, // PopDirectionalFormat,
	0x2066: _LRI, // LeftToRightIsolate,
	0x2067: _RLI, // RightToLeftIsolate,
	0x2068: _FSI, // FirstStrongIsolate,
	0x2069: _PDI, // PopDirectionalIsolate,
}

// A trie entry has the following bits:
// 7..5  XOR mask for brackets
// 4     1: Bracket open, 0: Bracket close
// 3..0  class type
type entry uint8

const (
	openMask     = 0x10
	xorMaskShift = 5
)

func (e entry) isBracket() bool            { return e&0xF0 != 0 }
func (e entry) isOpen() bool               { return e&openMask != 0 }
func (e entry) reverseBracket(r rune) rune { return xorMasks[e>>xorMaskShift] ^ r }
func (e entry) class(r rune) class {
	c := class(e & 0x0F)
	if c == classControl {
		return controlToClass[r]
	}
	return c
}
