Skip to content

Commit d1643b5

Browse files
committed
Merge pull request #298 from pushkarnk/nsorderedset
Implementing reversedObjectEnumeration() and reversedOrderedSet in NSOrderedSet
2 parents 5eebcc8 + cef5366 commit d1643b5

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

Foundation/NSOrderedSet.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,18 @@ extension NSOrderedSet {
224224
}
225225
}
226226

227-
public func reverseObjectEnumerator() -> NSEnumerator { NSUnimplemented() }
227+
public func reverseObjectEnumerator() -> NSEnumerator {
228+
if self.dynamicType === NSOrderedSet.self || self.dynamicType === NSMutableOrderedSet.self {
229+
return NSGeneratorEnumerator(_orderedStorage.reversed().makeIterator())
230+
} else {
231+
NSRequiresConcreteImplementation()
232+
}
233+
}
228234

229-
/*@NSCopying*/ public var reversedOrderedSet: NSOrderedSet { NSUnimplemented() }
235+
/*@NSCopying*/
236+
public var reversedOrderedSet: NSOrderedSet {
237+
return NSOrderedSet(array: _orderedStorage.reversed().bridge().bridge())
238+
}
230239

231240
// These two methods return a facade object for the receiving ordered set,
232241
// which acts like an immutable array or set (respectively). Note that

TestFoundation/TestNSOrderedSet.swift

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class TestNSOrderedSet : XCTestCase {
2626
("test_BasicConstruction", test_BasicConstruction),
2727
("test_Enumeration", test_Enumeration),
2828
("test_Uniqueness", test_Uniqueness),
29+
("test_reversedEnumeration", test_reversedEnumeration),
30+
("test_reversedOrderedSet", test_reversedOrderedSet),
31+
("test_reversedEmpty", test_reversedEmpty),
2932
("test_ObjectAtIndex", test_ObjectAtIndex),
3033
("test_ObjectsAtIndexes", test_ObjectsAtIndexes),
3134
("test_GetObjects", test_GetObjects),
@@ -49,6 +52,8 @@ class TestNSOrderedSet : XCTestCase {
4952
("test_Union", test_Union),
5053
("test_Initializers", test_Initializers),
5154
("test_Sorting", test_Sorting),
55+
("test_reversedEnumerationMutable", test_reversedEnumerationMutable),
56+
("test_reversedOrderedSetMutable", test_reversedOrderedSetMutable),
5257
]
5358
}
5459

@@ -76,6 +81,36 @@ class TestNSOrderedSet : XCTestCase {
7681
XCTAssertEqual(set.objectAtIndex(1) as? NSString, "bar")
7782
}
7883

84+
func test_reversedEnumeration() {
85+
let arr = ["foo", "bar", "baz"]
86+
let set = NSOrderedSet(array: arr.bridge().bridge())
87+
var index = set.count - 1
88+
let revSet = set.reverseObjectEnumerator()
89+
for item in revSet {
90+
XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
91+
index -= 1
92+
}
93+
}
94+
95+
func test_reversedOrderedSet() {
96+
let days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
97+
let work = NSOrderedSet(array: days.bridge().bridge())
98+
let krow = work.reversedOrderedSet
99+
var index = work.count - 1
100+
for item in krow {
101+
XCTAssertEqual(work.objectAtIndex(index) as? NSString, item as? NSString)
102+
index -= 1
103+
}
104+
}
105+
106+
func test_reversedEmpty() {
107+
let set = NSOrderedSet(array: [])
108+
let reversedEnum = set.reverseObjectEnumerator()
109+
XCTAssertNil(reversedEnum.nextObject())
110+
let reversedSet = set.reversedOrderedSet
111+
XCTAssertNil(reversedSet.firstObject)
112+
}
113+
79114
func test_ObjectAtIndex() {
80115
let set = NSOrderedSet(array: ["foo", "bar", "baz"].bridge().bridge())
81116
XCTAssertEqual(set.objectAtIndex(0) as? NSString, "foo")
@@ -330,4 +365,43 @@ class TestNSOrderedSet : XCTestCase {
330365
XCTAssertEqual(set[2] as? NSString, "b")
331366
XCTAssertEqual(set[3] as? NSString, "d")
332367
}
368+
369+
func test_reversedEnumerationMutable() {
370+
let arr = ["foo", "bar", "baz"]
371+
let set = NSMutableOrderedSet()
372+
set.addObjectsFromArray(arr.bridge().bridge())
373+
374+
set.addObject("jazz".bridge())
375+
var index = set.count - 1
376+
var revSet = set.reverseObjectEnumerator()
377+
for item in revSet {
378+
XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
379+
index -= 1
380+
}
381+
382+
set.removeObject("jazz".bridge())
383+
index = set.count - 1
384+
revSet = set.reverseObjectEnumerator()
385+
for item in revSet {
386+
XCTAssertEqual(set.objectAtIndex(index) as? NSString, item as? NSString)
387+
index -= 1
388+
}
389+
390+
391+
}
392+
393+
func test_reversedOrderedSetMutable() {
394+
let days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
395+
let work = NSMutableOrderedSet()
396+
work.addObjectsFromArray(days.bridge().bridge())
397+
var krow = work.reversedOrderedSet
398+
XCTAssertEqual(work.firstObject as? NSString, krow.lastObject as? NSString)
399+
XCTAssertEqual(work.lastObject as? NSString, krow.firstObject as? NSString)
400+
401+
work.addObject("saturday".bridge())
402+
krow = work.reversedOrderedSet
403+
XCTAssertEqual(work.firstObject as? NSString, krow.lastObject as? NSString)
404+
XCTAssertEqual(work.lastObject as? NSString, krow.firstObject as? NSString)
405+
}
406+
333407
}

0 commit comments

Comments
 (0)