mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
202 lines
5.7 KiB
Plaintext
202 lines
5.7 KiB
Plaintext
//===--- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
% # Ignore the following warning. This _is_ the correct file to edit.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// 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],
|
|
setUpFunction: { blackHole(workload) })
|
|
|
|
public let CharacterPropertiesStashed = BenchmarkInfo(
|
|
name: "CharacterPropertiesStashed",
|
|
runFunction: run_CharacterPropertiesStashed,
|
|
tags: [.validation, .api, .String],
|
|
setUpFunction: { setupStash() })
|
|
|
|
public let CharacterPropertiesStashedMemo = BenchmarkInfo(
|
|
name: "CharacterPropertiesStashedMemo",
|
|
runFunction: run_CharacterPropertiesStashedMemo,
|
|
tags: [.validation, .api, .String],
|
|
setUpFunction: { setupMemo() })
|
|
|
|
public let CharacterPropertiesPrecomputed = BenchmarkInfo(
|
|
name: "CharacterPropertiesPrecomputed",
|
|
runFunction: run_CharacterPropertiesPrecomputed,
|
|
tags: [.validation, .api, .String],
|
|
setUpFunction: { setupPrecomputed() })
|
|
|
|
extension Character {
|
|
var firstScalar: UnicodeScalar { return unicodeScalars.first! }
|
|
}
|
|
|
|
% Properties = { "Alphanumeric": "alphanumerics", \
|
|
% "Capitalized": "capitalizedLetters", \
|
|
% "Control": "controlCharacters", \
|
|
% "Decimal": "decimalDigits", \
|
|
% "Letter": "letters", \
|
|
% "Lowercase": "lowercaseLetters", \
|
|
% "Uppercase": "uppercaseLetters", \
|
|
% "Newline": "newlines", \
|
|
% "Whitespace": "whitespaces", \
|
|
% "Punctuation": "punctuationCharacters" \
|
|
% }
|
|
|
|
// Fetch the CharacterSet for every call
|
|
% for Property, Set in Properties.items():
|
|
func is${Property}(_ c: Character) -> Bool {
|
|
return CharacterSet.${Set}.contains(c.firstScalar)
|
|
}
|
|
% end
|
|
|
|
// Stash the set
|
|
% for Property, Set in Properties.items():
|
|
let ${Set} = CharacterSet.${Set}
|
|
func is${Property}Stashed(_ c: Character) -> Bool {
|
|
return ${Set}.contains(c.firstScalar)
|
|
}
|
|
% end
|
|
|
|
func setupStash() {
|
|
blackHole(workload)
|
|
% for Property, Set in Properties.items():
|
|
blackHole(${Set})
|
|
% end
|
|
}
|
|
|
|
// Memoize the stashed set
|
|
% for Property, Set in Properties.items():
|
|
var ${Set}Memo = Set<UInt32>()
|
|
func is${Property}StashedMemo(_ c: Character) -> Bool {
|
|
let scalar = c.firstScalar
|
|
if ${Set}Memo.contains(scalar.value) { return true }
|
|
if ${Set}.contains(scalar) {
|
|
${Set}Memo.insert(scalar.value)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
% end
|
|
|
|
func setupMemo() {
|
|
blackHole(workload)
|
|
% for Property, Set in Properties.items():
|
|
blackHole(${Set}Memo)
|
|
% end
|
|
}
|
|
|
|
// Precompute whole scalar set
|
|
% for Property, Set in Properties.items():
|
|
var ${Set}Precomputed: Set<UInt32> = {
|
|
var result = Set<UInt32>()
|
|
for i in 0...0x0010_FFFF {
|
|
guard let scalar = UnicodeScalar(i) else { continue }
|
|
if ${Set}.contains(scalar) {
|
|
result.insert(scalar.value)
|
|
}
|
|
}
|
|
return result
|
|
}()
|
|
func is${Property}Precomputed(_ c: Character) -> Bool {
|
|
return ${Set}Precomputed.contains(c.firstScalar.value)
|
|
}
|
|
% end
|
|
|
|
func setupPrecomputed() {
|
|
blackHole(workload)
|
|
% for Property, Set in Properties.items():
|
|
blackHole(${Set}Precomputed)
|
|
% end
|
|
}
|
|
|
|
// 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 {
|
|
% for Property, Set in Properties.items():
|
|
blackHole(is${Property}(c))
|
|
% end
|
|
}
|
|
}
|
|
}
|
|
|
|
@inline(never)
|
|
public func run_CharacterPropertiesStashed(_ N: Int) {
|
|
for _ in 1...N*10 {
|
|
for c in workload {
|
|
% for Property, Set in Properties.items():
|
|
blackHole(is${Property}Stashed(c))
|
|
% end
|
|
}
|
|
}
|
|
}
|
|
|
|
@inline(never)
|
|
public func run_CharacterPropertiesStashedMemo(_ N: Int) {
|
|
for _ in 1...N*10 {
|
|
for c in workload {
|
|
% for Property, Set in Properties.items():
|
|
blackHole(is${Property}StashedMemo(c))
|
|
% end
|
|
}
|
|
}
|
|
}
|
|
|
|
@inline(never)
|
|
public func run_CharacterPropertiesPrecomputed(_ N: Int) {
|
|
for _ in 1...N*10 {
|
|
for c in workload {
|
|
% for Property, Set in Properties.items():
|
|
blackHole(is${Property}Precomputed(c))
|
|
% end
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// TODO: run_CharacterPropertiesComputed
|
|
|
|
// ${'Local Variables'}:
|
|
// eval: (read-only-mode 1)
|
|
// End:
|