| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- package bytes
- import (
- "github.com/gofiber/utils/v2/internal/caseconv"
- )
- // ToLower converts an ASCII byte slice to lower-case without modifying the input.
- func ToLower(b []byte) []byte {
- n := len(b)
- if n == 0 {
- return b
- }
- table := caseconv.ToLowerTable
- i := 0
- for i < n {
- c := b[i]
- low := table[c]
- if low != c {
- dst := make([]byte, n)
- copy(dst, b[:i])
- dst[i] = low
- i++
- limit := i + ((n - i) &^ 3)
- for i < limit {
- dst[i+0] = table[b[i+0]]
- dst[i+1] = table[b[i+1]]
- dst[i+2] = table[b[i+2]]
- dst[i+3] = table[b[i+3]]
- i += 4
- }
- for i < n {
- dst[i] = table[b[i]]
- i++
- }
- return dst
- }
- i++
- }
- return b
- }
- // ToUpper converts an ASCII byte slice to upper-case without modifying the input.
- func ToUpper(b []byte) []byte {
- n := len(b)
- if n == 0 {
- return b
- }
- table := caseconv.ToUpperTable
- i := 0
- for i < n {
- c := b[i]
- up := table[c]
- if up != c {
- dst := make([]byte, n)
- copy(dst, b[:i])
- dst[i] = up
- i++
- limit := i + ((n - i) &^ 3)
- for i < limit {
- dst[i+0] = table[b[i+0]]
- dst[i+1] = table[b[i+1]]
- dst[i+2] = table[b[i+2]]
- dst[i+3] = table[b[i+3]]
- i += 4
- }
- for i < n {
- dst[i] = table[b[i]]
- i++
- }
- return dst
- }
- i++
- }
- return b
- }
- // UnsafeToLower converts an ASCII byte slice to lower-case in-place.
- // The passed slice content is modified and the same slice is returned.
- func UnsafeToLower(b []byte) []byte {
- table := caseconv.ToLowerTable
- n := len(b)
- i := 0
- limit := n &^ 3
- for i < limit {
- b0 := b[i+0]
- b1 := b[i+1]
- b2 := b[i+2]
- b3 := b[i+3]
- b[i+0] = table[b0]
- b[i+1] = table[b1]
- b[i+2] = table[b2]
- b[i+3] = table[b3]
- i += 4
- }
- for i < n {
- b[i] = table[b[i]]
- i++
- }
- return b
- }
- // UnsafeToUpper converts an ASCII byte slice to upper-case in-place.
- // The passed slice content is modified and the same slice is returned.
- func UnsafeToUpper(b []byte) []byte {
- table := caseconv.ToUpperTable
- n := len(b)
- i := 0
- limit := n &^ 3
- for i < limit {
- b0 := b[i+0]
- b1 := b[i+1]
- b2 := b[i+2]
- b3 := b[i+3]
- b[i+0] = table[b0]
- b[i+1] = table[b1]
- b[i+2] = table[b2]
- b[i+3] = table[b3]
- i += 4
- }
- for i < n {
- b[i] = table[b[i]]
- i++
- }
- return b
- }
|