635
- (void) intersectSet: (NSSet*) other
631
- (void) intersectSet: (NSSet*)other
639
GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map);
640
GSIMapBucket bucket = GSIMapEnumeratorBucket(&enumerator);
641
GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator);
646
if ([other containsObject: node->key.obj] == NO)
648
GSIMapRemoveNodeFromMap(&map, bucket, node);
649
GSIMapFreeNode(&map, node);
651
bucket = GSIMapEnumeratorBucket(&enumerator);
652
node = GSIMapEnumeratorNextNode(&enumerator);
654
GSIMapEndEnumerator(&enumerator);
635
GSIMapCleanMap(&map);
637
else if (other != self && map.nodeCount > 0)
639
GSIMapEnumerator_t enumerator;
644
if (NO == [other isKindOfClass: [NSSet class]])
646
[NSException raise: NSInvalidArgumentException
647
format: @"-intersectSet: other object is not a set"];
649
if (0 == map.nodeCount)
651
return; // Already empty ... nothing to do
653
if (0 == [other count])
655
GSIMapCleanMap(&map); // Other empty ... no intersection
659
c = object_getClass(other);
660
if (c == setClass || c == mutableSetClass)
662
GSSet *o = (GSSet*)other;
664
enumerator = GSIMapEnumeratorForMap(&map);
665
bucket = GSIMapEnumeratorBucket(&enumerator);
666
node = GSIMapEnumeratorNextNode(&enumerator);
670
if (0 == GSIMapNodeForKey(&o->map, node->key))
672
GSIMapRemoveNodeFromMap(&map, bucket, node);
673
GSIMapFreeNode(&map, node);
675
bucket = GSIMapEnumeratorBucket(&enumerator);
676
node = GSIMapEnumeratorNextNode(&enumerator);
678
GSIMapEndEnumerator(&enumerator);
682
SEL sel = @selector(member:);
683
IMP imp = [other methodForSelector: sel];
685
enumerator = GSIMapEnumeratorForMap(&map);
686
bucket = GSIMapEnumeratorBucket(&enumerator);
687
node = GSIMapEnumeratorNextNode(&enumerator);
691
if (nil == (*imp)(other, sel, node->key.obj))
693
GSIMapRemoveNodeFromMap(&map, bucket, node);
694
GSIMapFreeNode(&map, node);
696
bucket = GSIMapEnumeratorBucket(&enumerator);
697
node = GSIMapEnumeratorNextNode(&enumerator);
699
GSIMapEndEnumerator(&enumerator);