File: UTF8Byte.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (65 lines) | stat: -rw-r--r-- 2,005 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import Foundation

package typealias UTF8Byte = UInt8
package extension UTF8Byte {
  init(_ character: Character) throws {
    self = try character.utf8.only.unwrap(orThrow: "More than one byte: \(character)")
  }
}

package func UTF8ByteValue(_ character: Character) -> UTF8Byte? {
  character.utf8.only
}

package extension UTF8Byte {
  static let uppercaseAZ: ClosedRange<UInt8> = (65...90)
  static let lowercaseAZ: ClosedRange<UInt8> = (97...122)

  static let cSpace: Self = 32  // ' '
  static let cPlus: Self = 43  // '+'
  static let cMinus: Self = 45  // '-'
  static let cColon: Self = 58  // ':'
  static let cPeriod: Self = 46  // '.'
  static let cLeftParentheses: Self = 40  // '('
  static let cRightParentheses: Self = 41  // ')'
  static let cUnderscore: Self = 95  // '_'

  var isLowercase: Bool {
    return Self.lowercaseAZ.contains(self)
  }

  var isUppercase: Bool {
    return Self.uppercaseAZ.contains(self)
  }

  var lowercasedUTF8Byte: UInt8 {
    return isUppercase ? (self - Self.uppercaseAZ.lowerBound) + Self.lowercaseAZ.lowerBound : self
  }

  var uppercasedUTF8Byte: UInt8 {
    return isLowercase ? (self - Self.lowercaseAZ.lowerBound) + Self.uppercaseAZ.lowerBound : self
  }

  var isDelimiter: Bool {
    return (self == .cSpace)
      || (self == .cPlus)
      || (self == .cMinus)
      || (self == .cColon)
      || (self == .cPeriod)
      || (self == .cUnderscore)
      || (self == .cLeftParentheses)
      || (self == .cRightParentheses)
  }
}