mirror of
https://github.com/apple/swift-foundation.git
synced 2025-05-24 14:46:13 +08:00
* rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move localized uppercase and lowercase to FoundationLocalization - if-def out of CharacterSet from FoundationPreview. It's not implemented at all there, and having a no-op stub is misleading * rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move components separated by string and range of string functions * rdar://107955097 (FoundationPreview: Batch move string API (continued)) Enable snake case options for JSON encoder and decoder. We haven't been able to enable this option because it needed `CharacterSet`, which hasn't been properly implemented for FoundationPreview. Now that we have `BuiltInUnicodeScalarSet`, which mirrors `CharacterSet`, we can switch to that and enable the options. * rdar://107955097 (FoundationPreview: Batch move string API (continued)) - Move `StringProtocol.lineRange(for:)` and `paragraphRange(for:)` to FoundationEssentials - Rename String+Regex.swift to RegexPatternCache.swift - Consolidate extensions on various String family members and remove one redundant swift file --------- Co-authored-by: I-Ting Tina Liu <iting_liu@apple.com>
39 lines
1.4 KiB
Swift
39 lines
1.4 KiB
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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension BidirectionalCollection where Index == String.Index {
|
|
internal func _alignIndex(roundingDown i: Index) -> Index {
|
|
return i < endIndex ? index(before: index(after: i)) : i
|
|
}
|
|
|
|
internal func _alignIndex(roundingUp i: Index) -> Index {
|
|
let truncated = _alignIndex(roundingDown: i)
|
|
if i > truncated && i < endIndex {
|
|
return index(after: i)
|
|
} else {
|
|
return i
|
|
}
|
|
}
|
|
|
|
internal func _boundaryAlignedRange<R: RangeExpression>(_ r: R) -> Range<Index> where R.Bound == String.Index {
|
|
let range = r.relative(to: self)
|
|
return _alignIndex(roundingDown: range.lowerBound)..<_alignIndex(roundingUp: range.upperBound)
|
|
}
|
|
|
|
internal func _checkRange(_ r: Range<Index>) -> Range<Index>? {
|
|
guard r.lowerBound >= startIndex, r.upperBound <= endIndex else {
|
|
return nil
|
|
}
|
|
return r
|
|
}
|
|
}
|