Skip to content

Instantly share code, notes, and snippets.

@dbrockman
Created April 4, 2013 15:02
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dbrockman/5311141 to your computer and use it in GitHub Desktop.
Save dbrockman/5311141 to your computer and use it in GitHub Desktop.
@interface NSIndexSet (Operations)
// http://en.wikipedia.org/wiki/Union_(set_theory)
- (NSIndexSet *)unionWith:(NSIndexSet *)other;
// http://en.wikipedia.org/wiki/Intersection_(set_theory)
- (NSIndexSet *)intersectionWith:(NSIndexSet *)other;
// http://en.wikipedia.org/wiki/Complement_(set_theory)#Relative_complement
- (NSIndexSet *)relativeComplementIn:(NSIndexSet *)universe;
// http://en.wikipedia.org/wiki/Symmetric_difference
- (NSIndexSet *)symmetricDifferenceWith:(NSIndexSet *)other;
@end
@interface NSIndexSet (RangeOperations)
- (NSIndexSet *)unionWithRange:(NSRange)range;
- (NSIndexSet *)intersectionWithRange:(NSRange)range;
- (NSIndexSet *)relativeComplementInRange:(NSRange)range;
- (NSIndexSet *)symmetricDifferenceWithRange:(NSRange)range;
@end
#import "NSIndexSet+Operations.h"
@implementation NSIndexSet (Operations)
- (NSIndexSet *)unionWith:(NSIndexSet *)other
{
NSMutableIndexSet *result = [self mutableCopy];
[result addIndexes:other];
return result;
}
- (NSIndexSet *)intersectionWith:(NSIndexSet *)other
{
// Create a union of A and B, then
// remove the symmetric difference
// of A and B in the union.
// Formally: (A ∪ B) \ (A ∆ B) = A ∩ B
NSMutableIndexSet *result = [self mutableCopy];
[result addIndexes:other];
[result removeIndexes:[self symmetricDifferenceWith:other]];
return result;
}
- (NSIndexSet *)relativeComplementIn:(NSIndexSet *)universe
{
NSMutableIndexSet *complement = [universe mutableCopy];
[complement removeIndexes:self];
return complement;
}
- (NSIndexSet *)symmetricDifferenceWith:(NSIndexSet *)other
{
NSMutableIndexSet *a = [self mutableCopy];
NSMutableIndexSet *b = [other mutableCopy];
[a removeIndexes:b];
[b removeIndexes:a];
[a addIndexes:b];
return a;
}
@end
@implementation NSIndexSet (RangeOperations)
- (NSIndexSet *)unionWithRange:(NSRange)range
{
NSMutableIndexSet *result = [self mutableCopy];
[result addIndexesInRange:range];
return result;
}
- (NSIndexSet *)intersectionWithRange:(NSRange)range
{
return [self intersectionWith:[NSIndexSet indexSetWithIndexesInRange:range]];
}
- (NSIndexSet *)relativeComplementInRange:(NSRange)range
{
NSMutableIndexSet *complement = [NSMutableIndexSet indexSetWithIndexesInRange:range];
[complement removeIndexes:self];
return complement;
}
- (NSIndexSet *)symmetricDifferenceWithRange:(NSRange)range
{
return [self symmetricDifferenceWith:[NSIndexSet indexSetWithIndexesInRange:range]];
}
@end
@gnachman
Copy link

I'd love to use this. What license is it under?

@AlexandrGraschenkov
Copy link

- (NSIndexSet *)symmetricDifferenceWith:(NSIndexSet *)other
{
    NSMutableIndexSet *a = [self mutableCopy];
    NSMutableIndexSet *b = [other mutableCopy];
    [a removeIndexes:other];
    [b removeIndexes:self];
    [a addIndexes:b];
    return a;
}

Correct implementation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment