Skip to content

Commit e706666

Browse files
authored
Merge pull request #4168 from phausler/CharacterSet
[Foundation] Ensure _SwiftNSCharacterSet overrides all abstract metho…
2 parents 184272c + 017f664 commit e706666

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

stdlib/public/SDK/Foundation/CharacterSet.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
@_exported import Foundation // Clang module
14+
import CoreFoundation
1415

1516
private func _utfRangeToNSRange(_ inRange : Range<UnicodeScalar>) -> NSRange {
1617
return NSMakeRange(Int(inRange.lowerBound.value), Int(inRange.upperBound.value - inRange.lowerBound.value))
@@ -483,28 +484,37 @@ extension _SwiftNSCharacterSet {
483484

484485
// Immutable
485486

487+
@objc(bitmapRepresentation)
486488
var bitmapRepresentation: Data {
487489
return _mapUnmanaged { $0.bitmapRepresentation }
488490
}
489491

492+
@objc(invertedSet)
490493
var inverted : CharacterSet {
491494
return _mapUnmanaged { $0.inverted }
492495
}
493496

497+
@objc(hasMemberInPlane:)
494498
func hasMember(inPlane plane: UInt8) -> Bool {
495499
return _mapUnmanaged {$0.hasMemberInPlane(plane) }
496500
}
497501

502+
@objc(characterIsMember:)
498503
func characterIsMember(_ member: unichar) -> Bool {
499504
return _mapUnmanaged { $0.characterIsMember(member) }
500505
}
501506

507+
@objc(longCharacterIsMember:)
502508
func longCharacterIsMember(_ member: UTF32Char) -> Bool {
503509
return _mapUnmanaged { $0.longCharacterIsMember(member) }
504510
}
505511

512+
@objc(isSupersetOfSet:)
506513
func isSuperset(of other: CharacterSet) -> Bool {
507-
return _mapUnmanaged { $0.isSuperset(of: other) }
514+
return _mapUnmanaged {
515+
// this is a work around for <rdar://problem/27768939>
516+
return CFCharacterSetIsSupersetOfSet($0 as CFCharacterSet, (other as NSCharacterSet).copy() as! CFCharacterSet)
517+
}
508518
}
509519

510520
}

test/1_stdlib/TestCharacterSet.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,28 @@ class TestCharacterSet : TestCharacterSetSuper {
180180
expectNotEqual(anyHashables[0], anyHashables[1])
181181
expectEqual(anyHashables[1], anyHashables[2])
182182
}
183+
184+
func test_superSet() {
185+
let a = CharacterSet.letters.isSuperset(of: CharacterSet(charactersIn: "ab"))
186+
expectTrue(a)
187+
}
188+
189+
func test_union() {
190+
let union = CharacterSet(charactersIn: "ab").union(CharacterSet(charactersIn: "cd"))
191+
let expected = CharacterSet(charactersIn: "abcd")
192+
expectEqual(expected, union)
193+
}
194+
195+
func test_hasMember() {
196+
let contains = CharacterSet.letters.hasMember(inPlane: 1)
197+
expectTrue(contains)
198+
}
199+
200+
func test_bitmap() {
201+
let bitmap = CharacterSet(charactersIn: "ab").bitmapRepresentation
202+
expectEqual(0x6, bitmap[12])
203+
expectEqual(8192, bitmap.count)
204+
}
183205
}
184206

185207

@@ -195,6 +217,10 @@ CharacterSetTests.test("testBasics") { TestCharacterSet().testBasics() }
195217
CharacterSetTests.test("test_classForCoder") { TestCharacterSet().test_classForCoder() }
196218
CharacterSetTests.test("test_AnyHashableContainingCharacterSet") { TestCharacterSet().test_AnyHashableContainingCharacterSet() }
197219
CharacterSetTests.test("test_AnyHashableCreatedFromNSCharacterSet") { TestCharacterSet().test_AnyHashableCreatedFromNSCharacterSet() }
220+
CharacterSetTests.test("test_superSet") { TestCharacterSet().test_superSet() }
221+
CharacterSetTests.test("test_union") { TestCharacterSet().test_union() }
222+
CharacterSetTests.test("test_hasMember") { TestCharacterSet().test_hasMember() }
223+
CharacterSetTests.test("test_bitmap") { TestCharacterSet().test_bitmap() }
198224
runAllTests()
199225
#endif
200226

0 commit comments

Comments
 (0)