8
8
//
9
9
10
10
/**************** Immutable Ordered Set ****************/
11
- open class NSOrderedSet : NSObject , NSCopying , NSMutableCopying , NSSecureCoding , ExpressibleByArrayLiteral {
12
- internal var _storage : NSSet
13
- internal var _orderedStorage : NSArray
11
+ open class NSOrderedSet : NSObject , NSCopying , NSMutableCopying , NSSecureCoding , ExpressibleByArrayLiteral {
12
+
13
+ fileprivate var _storage : NSSet
14
+ fileprivate var _orderedStorage : NSArray
14
15
15
16
open override func copy( ) -> Any {
16
17
return copy ( with: nil )
17
18
}
18
19
19
20
open func copy( with zone: NSZone ? = nil ) -> Any {
20
- NSUnimplemented ( )
21
+ if type ( of: self ) === NSOrderedSet . self {
22
+ return self
23
+ } else {
24
+ return NSOrderedSet ( storage: self . set as NSSet , orderedStorage: self . array as NSArray )
25
+ }
21
26
}
22
27
23
28
open override func mutableCopy( ) -> Any {
24
29
return mutableCopy ( with: nil )
25
30
}
26
31
27
32
open func mutableCopy( with zone: NSZone ? = nil ) -> Any {
28
- NSUnimplemented ( )
33
+ if type ( of: self ) === NSOrderedSet . self || type ( of: self ) === NSMutableOrderedSet . self {
34
+ let mutableOrderedSet = NSMutableOrderedSet ( )
35
+ mutableOrderedSet. _mutableStorage. _storage = self . _storage. _storage
36
+ mutableOrderedSet. _storage = mutableOrderedSet. _mutableStorage
37
+ mutableOrderedSet. _mutableOrderedStorage. _storage = self . _orderedStorage. _storage
38
+ mutableOrderedSet. _orderedStorage = mutableOrderedSet. _mutableOrderedStorage
39
+ return mutableOrderedSet
40
+ } else {
41
+ let count = self . count
42
+ let mutableSet = NSMutableSet ( capacity: count)
43
+ let mutableArray = NSMutableArray ( capacity: count)
44
+
45
+ for obj in self {
46
+ mutableSet. add ( obj)
47
+ mutableArray. add ( obj)
48
+ }
49
+ return NSMutableOrderedSet ( mutableStorage: mutableSet, mutableOrderedStorage: mutableArray)
50
+ }
29
51
}
30
52
31
53
public static var supportsSecureCoding : Bool {
@@ -124,21 +146,6 @@ open class NSOrderedSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding,
124
146
internal func _validateSubscript( _ index: Int , file: StaticString = #file, line: UInt = #line) {
125
147
precondition ( _indices. contains ( index) , " \( self ) : Index out of bounds " , file: file, line: line)
126
148
}
127
- }
128
-
129
- extension NSOrderedSet : Sequence {
130
-
131
- public typealias Iterator = NSEnumerator . Iterator
132
-
133
- /// Return a *generator* over the elements of this *sequence*.
134
- ///
135
- /// - Complexity: O(1).
136
- public func makeIterator( ) -> Iterator {
137
- return self . objectEnumerator ( ) . makeIterator ( )
138
- }
139
- }
140
-
141
- extension NSOrderedSet {
142
149
143
150
/// Returns an array with the objects at the specified indexes in the
144
151
/// ordered set.
@@ -246,8 +253,31 @@ extension NSOrderedSet {
246
253
// to the original ordered set will "show through" the facade and it will
247
254
// appear to change spontaneously, since a copy of the ordered set is not
248
255
// being made.
249
- public var array : [ Any ] { NSUnimplemented ( ) }
250
- public var set : Set < AnyHashable > { NSUnimplemented ( ) }
256
+ public var array : [ Any ] {
257
+ if type ( of: self ) === NSOrderedSet . self || type ( of: self ) === NSMutableOrderedSet . self {
258
+ return _orderedStorage. _storage
259
+ } else {
260
+ var result : [ Any ] = [ ]
261
+ result. reserveCapacity ( self . count)
262
+ for obj in self {
263
+ result. append ( obj)
264
+ }
265
+ return result
266
+ }
267
+ }
268
+
269
+ public var set : Set < AnyHashable > {
270
+ if type ( of: self ) === NSOrderedSet . self || type ( of: self ) === NSMutableOrderedSet . self {
271
+ return _storage. _storage
272
+ } else {
273
+ var result : Set < AnyHashable > = [ ]
274
+ result. reserveCapacity ( self . count)
275
+ for obj in self {
276
+ result. insert ( obj as! AnyHashable )
277
+ }
278
+ return result
279
+ }
280
+ }
251
281
252
282
open func enumerateObjects( _ block: ( Any , Int , UnsafeMutablePointer < ObjCBool > ) -> Swift . Void ) {
253
283
_orderedStorage. enumerateObjects ( block)
@@ -284,8 +314,11 @@ extension NSOrderedSet {
284
314
open func indexes( ofObjectsAt s: IndexSet , options opts: NSEnumerationOptions = [ ] , passingTest predicate: ( Any , Int , UnsafeMutablePointer < ObjCBool > ) -> Bool ) -> IndexSet {
285
315
return _orderedStorage. indexesOfObjects ( at: s, options: opts, passingTest: predicate)
286
316
}
287
-
288
- open func index( of object: Any , inSortedRange range: NSRange , options opts: NSBinarySearchingOptions = [ ] , usingComparator cmp: ( Any , Any ) -> ComparisonResult ) -> Int { NSUnimplemented ( ) } // binary search
317
+
318
+ // binary search
319
+ open func index( of object: Any , inSortedRange range: NSRange , options opts: NSBinarySearchingOptions = [ ] , usingComparator cmp: ( Any , Any ) -> ComparisonResult ) -> Int {
320
+ return _orderedStorage. index ( of: object, inSortedRange: range, options: opts, usingComparator: cmp)
321
+ }
289
322
290
323
open func sortedArray( comparator cmptr: ( Any , Any ) -> ComparisonResult ) -> [ Any ] {
291
324
return sortedArray ( options: [ ] , usingComparator: cmptr)
@@ -294,13 +327,19 @@ extension NSOrderedSet {
294
327
open func sortedArray( options opts: NSSortOptions = [ ] , usingComparator cmptr: ( Any , Any ) -> ComparisonResult ) -> [ Any ] {
295
328
return _orderedStorage. sortedArray ( options: opts, usingComparator: cmptr)
296
329
}
297
-
298
- public func description( withLocale locale: Locale ? ) -> String { NSUnimplemented ( ) }
299
- public func description( withLocale locale: Locale ? , indent level: Int ) -> String { NSUnimplemented ( ) }
300
- }
301
330
302
- extension NSOrderedSet {
303
-
331
+ override open var description : String {
332
+ return description ( withLocale: nil )
333
+ }
334
+
335
+ public func description( withLocale locale: Locale ? ) -> String {
336
+ return description ( withLocale: locale, indent: 0 )
337
+ }
338
+
339
+ public func description( withLocale locale: Locale ? , indent level: Int ) -> String {
340
+ return _orderedStorage. description ( withLocale: locale, indent: level)
341
+ }
342
+
304
343
public convenience init ( object: Any ) {
305
344
self . init ( array: [ object] )
306
345
}
@@ -358,10 +397,10 @@ extension NSOrderedSet {
358
397
359
398
/**************** Mutable Ordered Set ****************/
360
399
361
- open class NSMutableOrderedSet : NSOrderedSet {
400
+ open class NSMutableOrderedSet : NSOrderedSet {
362
401
363
- internal var _mutableStorage : NSMutableSet
364
- internal var _mutableOrderedStorage : NSMutableArray
402
+ fileprivate var _mutableStorage : NSMutableSet
403
+ fileprivate var _mutableOrderedStorage : NSMutableArray
365
404
366
405
public override init ( objects: UnsafePointer < AnyObject > ? , count cnt: Int ) {
367
406
let storage = NSMutableSet ( objects: objects, count: cnt)
@@ -418,8 +457,28 @@ open class NSMutableOrderedSet : NSOrderedSet {
418
457
addObjects ( from: elements)
419
458
}
420
459
460
+
461
+ fileprivate init ( mutableStorage: NSMutableSet , mutableOrderedStorage: NSMutableArray ) {
462
+ _mutableStorage = mutableStorage
463
+ _mutableOrderedStorage = mutableOrderedStorage
464
+ super. init ( objects: [ ] , count: 0 )
465
+ _storage = _mutableStorage
466
+ _orderedStorage = _mutableOrderedStorage
467
+ }
468
+
421
469
public required init ? ( coder aDecoder: NSCoder ) { NSUnimplemented ( ) }
422
470
471
+ open override func copy( with zone: NSZone ? = nil ) -> Any {
472
+ if type ( of: self ) === NSMutableOrderedSet . self {
473
+ let orderedSet = NSOrderedSet ( )
474
+ orderedSet. _storage. _storage = self . _storage. _storage
475
+ orderedSet. _orderedStorage. _storage = self . _orderedStorage. _storage
476
+ return orderedSet
477
+ } else {
478
+ return NSMutableOrderedSet ( mutableStorage: NSMutableSet ( set: self . set) , mutableOrderedStorage: NSMutableArray ( array: self . array) )
479
+ }
480
+ }
481
+
423
482
fileprivate func _removeObject( _ object: Any ) {
424
483
guard contains ( object) else {
425
484
return
@@ -445,11 +504,7 @@ open class NSMutableOrderedSet : NSOrderedSet {
445
504
replaceObject ( at: idx, with: newValue)
446
505
}
447
506
}
448
-
449
- }
450
507
451
- extension NSMutableOrderedSet {
452
-
453
508
open func add( _ object: Any ) {
454
509
_insertObject ( object)
455
510
}
@@ -610,3 +665,23 @@ extension NSMutableOrderedSet {
610
665
_mutableOrderedStorage. replaceObjects ( in: range, withObjectsFrom: sortedSubrange)
611
666
}
612
667
}
668
+
669
+
670
+ extension NSOrderedSet : Sequence {
671
+
672
+ public typealias Iterator = NSEnumerator . Iterator
673
+
674
+ /// Return a *generator* over the elements of this *sequence*.
675
+ ///
676
+ /// - Complexity: O(1).
677
+ public func makeIterator( ) -> Iterator {
678
+ return self . objectEnumerator ( ) . makeIterator ( )
679
+ }
680
+ }
681
+
682
+
683
+ extension NSOrderedSet : CustomReflectable {
684
+ public var customMirror : Mirror {
685
+ return Mirror ( reflecting: _orderedStorage as Array )
686
+ }
687
+ }
0 commit comments