package  cases 
 
import  "golang.org/x/text/transform"  
 
 
 
 
 
 
 
 
 
 
 
type  context struct  { 
	dst, src []byte  
	atEOF    bool  
 
	pDst int   
	pSrc int   
 
	 
	nDst, nSrc int  
	err        error  
 
	sz   int    
	info info   
 
	 
	isMidWord bool   
} 
 
func  (c  *context ) Reset () { 
	c .isMidWord  = false  
} 
 
 
 
 
func  (c  *context ) ret () (nDst , nSrc  int , err  error ) { 
	if  c .err  != nil  || c .nSrc  == len (c .src ) { 
		return  c .nDst , c .nSrc , c .err  
	} 
	 
 
 
	if  c .atEOF  && c .pSrc  == len (c .src ) { 
		return  c .pDst , c .pSrc , nil  
	} 
	return  c .nDst , c .nSrc , transform .ErrShortSrc  
} 
 
 
 
 
func  (c  *context ) retSpan () (n  int , err  error ) { 
	_ , nSrc , err  := c .ret () 
	return  nSrc , err  
} 
 
 
 
func  (c  *context ) checkpoint () { 
	if  c .err  == nil  { 
		c .nDst , c .nSrc  = c .pDst , c .pSrc +c .sz  
	} 
} 
 
 
 
func  (c  *context ) unreadRune () { 
	c .sz  = 0  
} 
 
func  (c  *context ) next () bool  { 
	c .pSrc  += c .sz  
	if  c .pSrc  == len (c .src ) || c .err  != nil  { 
		c .info , c .sz  = 0 , 0  
		return  false  
	} 
	v , sz  := trie .lookup (c .src [c .pSrc :]) 
	c .info , c .sz  = info (v ), sz  
	if  c .sz  == 0  { 
		if  c .atEOF  { 
			 
 
 
			c .sz  = 1  
		} else  { 
			c .err  = transform .ErrShortSrc  
			return  false  
		} 
	} 
	return  true  
} 
 
 
func  (c  *context ) writeBytes (b  []byte ) bool  { 
	if  len (c .dst )-c .pDst  < len (b ) { 
		c .err  = transform .ErrShortDst  
		return  false  
	} 
	 
	for  _ , ch  := range  b  { 
		c .dst [c .pDst ] = ch  
		c .pDst ++ 
	} 
	return  true  
} 
 
 
func  (c  *context ) writeString (s  string ) bool  { 
	if  len (c .dst )-c .pDst  < len (s ) { 
		c .err  = transform .ErrShortDst  
		return  false  
	} 
	 
	for  i  := 0 ; i  < len (s ); i ++ { 
		c .dst [c .pDst ] = s [i ] 
		c .pDst ++ 
	} 
	return  true  
} 
 
 
func  (c  *context ) copy () bool  { 
	return  c .writeBytes (c .src [c .pSrc  : c .pSrc +c .sz ]) 
} 
 
 
 
 
func  (c  *context ) copyXOR () bool  { 
	if  !c .copy () { 
		return  false  
	} 
	if  c .info &xorIndexBit  == 0  { 
		 
		c .dst [c .pDst -1 ] ^= byte (c .info  >> xorShift ) 
	} else  { 
		 
 
 
		idx  := c .info  >> xorShift  
		for  p  := c .pDst  - 1 ; ; p -- { 
			c .dst [p ] ^= xorData [idx ] 
			idx -- 
			if  xorData [idx ] == 0  { 
				break  
			} 
		} 
	} 
	return  true  
} 
 
 
func  (c  *context ) hasPrefix (s  string ) bool  { 
	b  := c .src [c .pSrc :] 
	if  len (b ) < len (s ) { 
		return  false  
	} 
	for  i , c  := range  b [:len (s )] { 
		if  c  != s [i ] { 
			return  false  
		} 
	} 
	return  true  
} 
 
 
 
func  (c  *context ) caseType () info  { 
	cm  := c .info  & 0x7  
	if  cm  < 4  { 
		return  cm  
	} 
	if  cm  >= cXORCase  { 
		 
		b  := c .src [c .pSrc +c .sz -1 ] 
		return  info (b &1 ) ^ cm &0x3  
	} 
	if  cm  == cIgnorableCased  { 
		return  cLower  
	} 
	return  cUncased  
} 
 
 
func  lower(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cLower  { 
		return  c .copy () 
	} 
	if  c .info &exceptionBit  == 0  { 
		return  c .copyXOR () 
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	offset  := 2  + e [0 ]&lengthMask   
	if  nLower  := (e [1 ] >> lengthBits ) & lengthMask ; nLower  != noChange  { 
		return  c .writeString (e [offset  : offset +nLower ]) 
	} 
	return  c .copy () 
} 
 
func  isLower(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cLower  { 
		return  true  
	} 
	if  c .info &exceptionBit  == 0  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	if  nLower  := (e [1 ] >> lengthBits ) & lengthMask ; nLower  != noChange  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	return  true  
} 
 
 
func  upper(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cUpper  { 
		return  c .copy () 
	} 
	if  c .info &exceptionBit  == 0  { 
		return  c .copyXOR () 
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	offset  := 2  + e [0 ]&lengthMask   
	 
	n  := (e [1 ] >> lengthBits ) & lengthMask  
	if  ct  == cTitle  { 
		 
		if  n  == noChange  { 
			n  = 0  
		} 
		n , e  = e [1 ]&lengthMask , e [n :] 
	} 
	if  n  != noChange  { 
		return  c .writeString (e [offset  : offset +n ]) 
	} 
	return  c .copy () 
} 
 
 
func  isUpper(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cUpper  { 
		return  true  
	} 
	if  c .info &exceptionBit  == 0  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	 
	n  := (e [1 ] >> lengthBits ) & lengthMask  
	if  ct  == cTitle  { 
		n  = e [1 ] & lengthMask  
	} 
	if  n  != noChange  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	return  true  
} 
 
 
func  title(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cTitle  { 
		return  c .copy () 
	} 
	if  c .info &exceptionBit  == 0  { 
		if  ct  == cLower  { 
			return  c .copyXOR () 
		} 
		return  c .copy () 
	} 
	 
	e  := exceptions [c .info >>exceptionShift :] 
	offset  := 2  + e [0 ]&lengthMask   
 
	nFirst  := (e [1 ] >> lengthBits ) & lengthMask  
	if  nTitle  := e [1 ] & lengthMask ; nTitle  != noChange  { 
		if  nFirst  != noChange  { 
			e  = e [nFirst :] 
		} 
		return  c .writeString (e [offset  : offset +nTitle ]) 
	} 
	if  ct  == cLower  && nFirst  != noChange  { 
		 
		return  c .writeString (e [offset  : offset +nFirst ]) 
	} 
	 
	return  c .copy () 
} 
 
 
func  isTitle(c  *context ) bool  { 
	ct  := c .caseType () 
	if  c .info &hasMappingMask  == 0  || ct  == cTitle  { 
		return  true  
	} 
	if  c .info &exceptionBit  == 0  { 
		if  ct  == cLower  { 
			c .err  = transform .ErrEndOfSpan  
			return  false  
		} 
		return  true  
	} 
	 
	e  := exceptions [c .info >>exceptionShift :] 
	if  nTitle  := e [1 ] & lengthMask ; nTitle  != noChange  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	nFirst  := (e [1 ] >> lengthBits ) & lengthMask  
	if  ct  == cLower  && nFirst  != noChange  { 
		c .err  = transform .ErrEndOfSpan  
		return  false  
	} 
	return  true  
} 
 
 
func  foldFull(c  *context ) bool  { 
	if  c .info &hasMappingMask  == 0  { 
		return  c .copy () 
	} 
	ct  := c .caseType () 
	if  c .info &exceptionBit  == 0  { 
		if  ct  != cLower  || c .info &inverseFoldBit  != 0  { 
			return  c .copyXOR () 
		} 
		return  c .copy () 
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	n  := e [0 ] & lengthMask  
	if  n  == 0  { 
		if  ct  == cLower  { 
			return  c .copy () 
		} 
		n  = (e [1 ] >> lengthBits ) & lengthMask  
	} 
	return  c .writeString (e [2  : 2 +n ]) 
} 
 
 
func  isFoldFull(c  *context ) bool  { 
	if  c .info &hasMappingMask  == 0  { 
		return  true  
	} 
	ct  := c .caseType () 
	if  c .info &exceptionBit  == 0  { 
		if  ct  != cLower  || c .info &inverseFoldBit  != 0  { 
			c .err  = transform .ErrEndOfSpan  
			return  false  
		} 
		return  true  
	} 
	e  := exceptions [c .info >>exceptionShift :] 
	n  := e [0 ] & lengthMask  
	if  n  == 0  && ct  == cLower  { 
		return  true  
	} 
	c .err  = transform .ErrEndOfSpan  
	return  false  
} 
  
The pages are generated with Golds   v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds  is a Go 101  project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1  (reachable from the left QR code) to get the latest news of Golds .