blob: 0efbc96d9bf6fa3640869886e59e5d930cb3bf7c [file] [log] [blame]
//===--- CharacterProperties.swift ----------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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
//
//===----------------------------------------------------------------------===//
////////////////////////////////////////////////////////////////////////////////
// WARNING: This file is manually generated from .gyb template and should not
// be directly modified. Instead, make changes to CharacterProperties.swift.gyb
// and run scripts/generate_harness/generate_harness.py to regenerate this file.
////////////////////////////////////////////////////////////////////////////////
import TestsUtils
import Foundation
public let CharacterPropertiesFetch = BenchmarkInfo(
name: "CharacterPropertiesFetch",
runFunction: run_CharacterPropertiesFetch,
tags: [.validation, .api, .String])
public let CharacterPropertiesStashed = BenchmarkInfo(
name: "CharacterPropertiesStashed",
runFunction: run_CharacterPropertiesStashed,
tags: [.validation, .api, .String],
setUpFunction: { run_CharacterPropertiesStashed(1) },
tearDownFunction: nil)
public let CharacterPropertiesStashedMemo = BenchmarkInfo(
name: "CharacterPropertiesStashedMemo",
runFunction: run_CharacterPropertiesStashedMemo,
tags: [.validation, .api, .String])
public let CharacterPropertiesPrecomputed = BenchmarkInfo(
name: "CharacterPropertiesPrecomputed",
runFunction: run_CharacterPropertiesPrecomputed,
tags: [.validation, .api, .String],
setUpFunction: { run_CharacterPropertiesPrecomputed(1) },
tearDownFunction: nil)
extension Character {
var firstScalar: UnicodeScalar { return unicodeScalars.first! }
}
// Fetch the CharacterSet for every call
func isControl(_ c: Character) -> Bool {
return CharacterSet.controlCharacters.contains(c.firstScalar)
}
func isAlphanumeric(_ c: Character) -> Bool {
return CharacterSet.alphanumerics.contains(c.firstScalar)
}
func isLowercase(_ c: Character) -> Bool {
return CharacterSet.lowercaseLetters.contains(c.firstScalar)
}
func isPunctuation(_ c: Character) -> Bool {
return CharacterSet.punctuationCharacters.contains(c.firstScalar)
}
func isWhitespace(_ c: Character) -> Bool {
return CharacterSet.whitespaces.contains(c.firstScalar)
}
func isLetter(_ c: Character) -> Bool {
return CharacterSet.letters.contains(c.firstScalar)
}
func isUppercase(_ c: Character) -> Bool {
return CharacterSet.uppercaseLetters.contains(c.firstScalar)
}
func isDecimal(_ c: Character) -> Bool {
return CharacterSet.decimalDigits.contains(c.firstScalar)
}
func isNewline(_ c: Character) -> Bool {
return CharacterSet.newlines.contains(c.firstScalar)
}
func isCapitalized(_ c: Character) -> Bool {
return CharacterSet.capitalizedLetters.contains(c.firstScalar)
}
// Stash the set
let controlCharacters = CharacterSet.controlCharacters
func isControlStashed(_ c: Character) -> Bool {
return controlCharacters.contains(c.firstScalar)
}
let alphanumerics = CharacterSet.alphanumerics
func isAlphanumericStashed(_ c: Character) -> Bool {
return alphanumerics.contains(c.firstScalar)
}
let lowercaseLetters = CharacterSet.lowercaseLetters
func isLowercaseStashed(_ c: Character) -> Bool {
return lowercaseLetters.contains(c.firstScalar)
}
let punctuationCharacters = CharacterSet.punctuationCharacters
func isPunctuationStashed(_ c: Character) -> Bool {
return punctuationCharacters.contains(c.firstScalar)
}
let whitespaces = CharacterSet.whitespaces
func isWhitespaceStashed(_ c: Character) -> Bool {
return whitespaces.contains(c.firstScalar)
}
let letters = CharacterSet.letters
func isLetterStashed(_ c: Character) -> Bool {
return letters.contains(c.firstScalar)
}
let uppercaseLetters = CharacterSet.uppercaseLetters
func isUppercaseStashed(_ c: Character) -> Bool {
return uppercaseLetters.contains(c.firstScalar)
}
let decimalDigits = CharacterSet.decimalDigits
func isDecimalStashed(_ c: Character) -> Bool {
return decimalDigits.contains(c.firstScalar)
}
let newlines = CharacterSet.newlines
func isNewlineStashed(_ c: Character) -> Bool {
return newlines.contains(c.firstScalar)
}
let capitalizedLetters = CharacterSet.capitalizedLetters
func isCapitalizedStashed(_ c: Character) -> Bool {
return capitalizedLetters.contains(c.firstScalar)
}
// Memoize the stashed set
var controlCharactersMemo = Set<UInt32>()
func isControlStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if controlCharactersMemo.contains(scalar.value) { return true }
if controlCharacters.contains(scalar) {
controlCharactersMemo.insert(scalar.value)
return true
}
return false
}
var alphanumericsMemo = Set<UInt32>()
func isAlphanumericStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if alphanumericsMemo.contains(scalar.value) { return true }
if alphanumerics.contains(scalar) {
alphanumericsMemo.insert(scalar.value)
return true
}
return false
}
var lowercaseLettersMemo = Set<UInt32>()
func isLowercaseStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if lowercaseLettersMemo.contains(scalar.value) { return true }
if lowercaseLetters.contains(scalar) {
lowercaseLettersMemo.insert(scalar.value)
return true
}
return false
}
var punctuationCharactersMemo = Set<UInt32>()
func isPunctuationStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if punctuationCharactersMemo.contains(scalar.value) { return true }
if punctuationCharacters.contains(scalar) {
punctuationCharactersMemo.insert(scalar.value)
return true
}
return false
}
var whitespacesMemo = Set<UInt32>()
func isWhitespaceStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if whitespacesMemo.contains(scalar.value) { return true }
if whitespaces.contains(scalar) {
whitespacesMemo.insert(scalar.value)
return true
}
return false
}
var lettersMemo = Set<UInt32>()
func isLetterStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if lettersMemo.contains(scalar.value) { return true }
if letters.contains(scalar) {
lettersMemo.insert(scalar.value)
return true
}
return false
}
var uppercaseLettersMemo = Set<UInt32>()
func isUppercaseStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if uppercaseLettersMemo.contains(scalar.value) { return true }
if uppercaseLetters.contains(scalar) {
uppercaseLettersMemo.insert(scalar.value)
return true
}
return false
}
var decimalDigitsMemo = Set<UInt32>()
func isDecimalStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if decimalDigitsMemo.contains(scalar.value) { return true }
if decimalDigits.contains(scalar) {
decimalDigitsMemo.insert(scalar.value)
return true
}
return false
}
var newlinesMemo = Set<UInt32>()
func isNewlineStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if newlinesMemo.contains(scalar.value) { return true }
if newlines.contains(scalar) {
newlinesMemo.insert(scalar.value)
return true
}
return false
}
var capitalizedLettersMemo = Set<UInt32>()
func isCapitalizedStashedMemo(_ c: Character) -> Bool {
let scalar = c.firstScalar
if capitalizedLettersMemo.contains(scalar.value) { return true }
if capitalizedLetters.contains(scalar) {
capitalizedLettersMemo.insert(scalar.value)
return true
}
return false
}
// Precompute whole scalar set
var controlCharactersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if controlCharacters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isControlPrecomputed(_ c: Character) -> Bool {
return controlCharactersPrecomputed.contains(c.firstScalar.value)
}
var alphanumericsPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if alphanumerics.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isAlphanumericPrecomputed(_ c: Character) -> Bool {
return alphanumericsPrecomputed.contains(c.firstScalar.value)
}
var lowercaseLettersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if lowercaseLetters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isLowercasePrecomputed(_ c: Character) -> Bool {
return lowercaseLettersPrecomputed.contains(c.firstScalar.value)
}
var punctuationCharactersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if punctuationCharacters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isPunctuationPrecomputed(_ c: Character) -> Bool {
return punctuationCharactersPrecomputed.contains(c.firstScalar.value)
}
var whitespacesPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if whitespaces.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isWhitespacePrecomputed(_ c: Character) -> Bool {
return whitespacesPrecomputed.contains(c.firstScalar.value)
}
var lettersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if letters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isLetterPrecomputed(_ c: Character) -> Bool {
return lettersPrecomputed.contains(c.firstScalar.value)
}
var uppercaseLettersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if uppercaseLetters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isUppercasePrecomputed(_ c: Character) -> Bool {
return uppercaseLettersPrecomputed.contains(c.firstScalar.value)
}
var decimalDigitsPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if decimalDigits.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isDecimalPrecomputed(_ c: Character) -> Bool {
return decimalDigitsPrecomputed.contains(c.firstScalar.value)
}
var newlinesPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if newlines.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isNewlinePrecomputed(_ c: Character) -> Bool {
return newlinesPrecomputed.contains(c.firstScalar.value)
}
var capitalizedLettersPrecomputed: Set<UInt32> = {
var result = Set<UInt32>()
for i in 0...0x0010_FFFF {
guard let scalar = UnicodeScalar(i) else { continue }
if capitalizedLetters.contains(scalar) {
result.insert(scalar.value)
}
}
return result
}()
func isCapitalizedPrecomputed(_ c: Character) -> Bool {
return capitalizedLettersPrecomputed.contains(c.firstScalar.value)
}
// Compute on the fly
//
// TODO: If UnicodeScalars ever exposes category, etc., implement the others!
func isNewlineComputed(_ c: Character) -> Bool {
switch c.firstScalar.value {
case 0x000A...0x000D: return true
case 0x0085: return true
case 0x2028...0x2029: return true
default: return false
}
}
let workload = """
the quick brown 🦊 jumped over the lazy 🐢.
Π² Ρ‡Π°Ρ‰Π°Ρ… юга ΠΆΠΈΠ»-Π±Ρ‹Π» цитрус? Π΄Π°, Π½ΠΎ Ρ„Π°Π»ΡŒΡˆΠΈΠ²Ρ‹ΠΉ экзСмпляр
π“€€π“€€π““π“²π“ƒ”π“ƒ—π“ƒ€π“ƒπ“ƒ‚π“ƒƒπ“†Œπ“†π“†Žπ“†π“†π“†‘π“†’π“†²π“Ώ
πŸκƒ•θΊβ€ΎβˆΎπŸ“¦βΊ¨
πŸ‘πŸ‘©β€πŸ‘©β€πŸ‘§β€πŸ‘§πŸ‘¨β€πŸ‘¨β€πŸ‘¦β€πŸ‘¦πŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡¦πŸ‡²πŸ‡½πŸ‘πŸ»πŸ‘πŸΌπŸ‘πŸ½πŸ‘πŸΎπŸ‘πŸΏ
Lorem ipsum something something something...
"""
@inline(never)
public func run_CharacterPropertiesFetch(_ N: Int) {
for _ in 1...N*10 {
for c in workload {
blackHole(isControl(c))
blackHole(isAlphanumeric(c))
blackHole(isLowercase(c))
blackHole(isPunctuation(c))
blackHole(isWhitespace(c))
blackHole(isLetter(c))
blackHole(isUppercase(c))
blackHole(isDecimal(c))
blackHole(isNewline(c))
blackHole(isCapitalized(c))
}
}
}
@inline(never)
public func run_CharacterPropertiesStashed(_ N: Int) {
for _ in 1...N*10 {
for c in workload {
blackHole(isControlStashed(c))
blackHole(isAlphanumericStashed(c))
blackHole(isLowercaseStashed(c))
blackHole(isPunctuationStashed(c))
blackHole(isWhitespaceStashed(c))
blackHole(isLetterStashed(c))
blackHole(isUppercaseStashed(c))
blackHole(isDecimalStashed(c))
blackHole(isNewlineStashed(c))
blackHole(isCapitalizedStashed(c))
}
}
}
@inline(never)
public func run_CharacterPropertiesStashedMemo(_ N: Int) {
for _ in 1...N*10 {
for c in workload {
blackHole(isControlStashedMemo(c))
blackHole(isAlphanumericStashedMemo(c))
blackHole(isLowercaseStashedMemo(c))
blackHole(isPunctuationStashedMemo(c))
blackHole(isWhitespaceStashedMemo(c))
blackHole(isLetterStashedMemo(c))
blackHole(isUppercaseStashedMemo(c))
blackHole(isDecimalStashedMemo(c))
blackHole(isNewlineStashedMemo(c))
blackHole(isCapitalizedStashedMemo(c))
}
}
}
@inline(never)
public func run_CharacterPropertiesPrecomputed(_ N: Int) {
for _ in 1...N*10 {
for c in workload {
blackHole(isControlPrecomputed(c))
blackHole(isAlphanumericPrecomputed(c))
blackHole(isLowercasePrecomputed(c))
blackHole(isPunctuationPrecomputed(c))
blackHole(isWhitespacePrecomputed(c))
blackHole(isLetterPrecomputed(c))
blackHole(isUppercasePrecomputed(c))
blackHole(isDecimalPrecomputed(c))
blackHole(isNewlinePrecomputed(c))
blackHole(isCapitalizedPrecomputed(c))
}
}
}
// TODO: run_CharacterPropertiesComputed