Skip to content

Commit

Permalink
CPIndexSet enumerateIndexesWithOptions:usingBlock:.
Browse files Browse the repository at this point in the history
  • Loading branch information
aljungberg committed Mar 17, 2012
1 parent 872b446 commit a26bca5
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 10 deletions.
55 changes: 46 additions & 9 deletions Foundation/CPIndexSet.j
Original file line number Diff line number Diff line change
Expand Up @@ -483,28 +483,65 @@
return description;
}

- (void)enumerateIndexesUsingBlock:(Function /*(int idx, @ref BOOL) */)aFunction
- (void)enumerateIndexesUsingBlock:(Function /*(int idx, @ref BOOL stop) */)aFunction
{
[self enumerateIndexesWithOptions:CPEnumerationNormal usingBlock:aFunction];
}

- (void)enumerateIndexesWithOptions:(CPEnumerationOptions)options usingBlock:(Function /*(int idx, @ref BOOL stop)*/)aFunction
{
if (!_count)
return;

var index = 0,
stop = NO;
var shouldStop = NO,
index,
stop,
increment;

for (var i = 0, count = _ranges.length; i < count; i++)
if (options & CPEnumerationReverse)
{
var range = _ranges[i],
maximum = CPMaxRange(range);
index = _ranges.length - 1,
stop = -1,
increment = -1;
}
else
{
index = 0;
stop = _ranges.length;
increment = 1;
}

for (var j = range.location; j < maximum; j++)
for (; index !== stop; index += increment)
{
var range = _ranges[index];

var rangeIndex,
rangeStop,
rangeIncrement;

if (options & CPEnumerationReverse)
{
rangeIndex = CPMaxRange(range) - 1;
rangeStop = range.location - 1;
rangeIncrement = -1;
}
else
{
aFunction(j, AT_REF(stop));
if (stop)
rangeIndex = range.location;
rangeStop = CPMaxRange(range);
rangeIncrement = 1;
}

for (; rangeIndex !== rangeStop; rangeIndex += rangeIncrement)
{
aFunction(rangeIndex, AT_REF(shouldStop));
if (shouldStop)
return;
}
}
}


@end

@implementation CPIndexSet(CPMutableIndexSet)
Expand Down
46 changes: 45 additions & 1 deletion Tests/Foundation/CPIndexSetTest.j
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ function descriptionWithoutEntity(aString)
};

[set0 enumerateIndexesUsingBlock:aBlock];
[self assert:0 equals:[visitedIndexes count] message:"enumerate empty set"];
[self assert:[] equals:visitedIndexes message:"enumerate empty set"];

[set1 enumerateIndexesUsingBlock:aBlock];
[self assert:[3, 4] equals:visitedIndexes message:"enumerate " + [set1 description]];
Expand All @@ -443,6 +443,50 @@ function descriptionWithoutEntity(aString)
[self assert:[0, 3, 4] equals:visitedIndexes message:"enumerate " + [set2 description]];
}

- (void)testEnumerateIndexesWithOptions_usingBlock_
{
var set0 = [CPIndexSet indexSet],
set1 = [CPMutableIndexSet indexSet],
set2 = [CPMutableIndexSet indexSet];

[set1 addIndexesInRange:CPMakeRange(3, 2)];

[set2 addIndexesInRange:CPMakeRange(3, 2)];
[set2 addIndexesInRange:CPMakeRange(0, 1)];

var visitedIndexes = [],
aBlock;

aBlock = function(idx)
{
visitedIndexes.push(idx);
};

[set0 enumerateIndexesWithOptions:CPEnumerationNormal usingBlock:aBlock];
[self assert:[] equals:visitedIndexes message:"enumerate empty set"];

[set1 enumerateIndexesWithOptions:CPEnumerationNormal usingBlock:aBlock];
[self assert:[3, 4] equals:visitedIndexes message:"enumerate " + [set1 description]];

visitedIndexes = [];
[set2 enumerateIndexesWithOptions:CPEnumerationNormal usingBlock:aBlock];
[self assert:[0, 3, 4] equals:visitedIndexes message:"enumerate " + [set2 description]];

visitedIndexes = [];
[set0 enumerateIndexesWithOptions:CPEnumerationReverse usingBlock:aBlock];
[self assert:[] equals:visitedIndexes message:"reverse enumerate empty set"];

visitedIndexes = [];
[set1 enumerateIndexesWithOptions:CPEnumerationReverse usingBlock:aBlock];
[self assert:[4, 3] equals:visitedIndexes message:"reverse enumerate " + [set1 description]];

visitedIndexes = [];
[set2 enumerateIndexesWithOptions:CPEnumerationReverse usingBlock:aBlock];
[self assert:[4, 3, 0] equals:visitedIndexes message:"reverse enumerate " + [set2 description]];

}


- (void)tearDown
{
_set = nil;
Expand Down

0 comments on commit a26bca5

Please sign in to comment.