26 - (id)mutableSetValueForKey:(
id)aKey
28 return [[_CPKVCSet alloc] initWithKey:aKey forProxyObject:self];
31 - (id)mutableSetValueForKeyPath:(
id)aKeyPath
33 var dotIndex = aKeyPath.indexOf(
".");
38 var firstPart = aKeyPath.substring(0, dotIndex),
39 lastPart = aKeyPath.substring(dotIndex + 1);
41 return [[
self valueForKeyPath:firstPart] mutableSetValueForKeyPath:lastPart];
89 var ivars = class_copyIvarList(
self),
93 set[ivar_getName(ivars[count])] = nil;
98 - (id)initWithKey:(
id)aKey forProxyObject:(
id)anObject
103 _proxyObject = anObject;
105 var capitalizedKey = _key.charAt(0).toUpperCase() + _key.substring(1);
107 _accessSEL = sel_getName(_key);
108 if ([_proxyObject respondsToSelector:_accessSEL])
109 _access = [_proxyObject methodForSelector:_accessSEL];
111 _setSEL = sel_getName(
@"set"+capitalizedKey+
":");
112 if ([_proxyObject respondsToSelector:_setSEL])
113 _set = [_proxyObject methodForSelector:_setSEL];
115 _countSEL = sel_getName(
@"countOf"+capitalizedKey);
116 if ([_proxyObject respondsToSelector:_countSEL])
117 _count = [_proxyObject methodForSelector:_countSEL];
119 _enumeratorSEL = sel_getName(
@"enumeratorOf"+capitalizedKey);
120 if ([_proxyObject respondsToSelector:_enumeratorSEL])
121 _enumerator = [_proxyObject methodForSelector:_enumeratorSEL];
123 _memberSEL = sel_getName(
@"memberOf"+capitalizedKey+
":");
124 if ([_proxyObject respondsToSelector:_memberSEL])
125 _member = [_proxyObject methodForSelector:_memberSEL];
127 _addSEL = sel_getName(
@"add"+capitalizedKey+
"Object:");
128 if ([_proxyObject respondsToSelector:_addSEL])
129 _add = [_proxyObject methodForSelector:_addSEL];
131 _addManySEL = sel_getName(
@"add"+capitalizedKey+
":");
132 if ([_proxyObject respondsToSelector:_addManySEL])
133 _addMany = [_proxyObject methodForSelector:_addManySEL];
135 _removeSEL = sel_getName(
@"remove"+capitalizedKey+
"Object:");
136 if ([_proxyObject respondsToSelector:_removeSEL])
137 _remove = [_proxyObject methodForSelector:_removeSEL];
139 _removeManySEL = sel_getName(
@"remove"+capitalizedKey+
":");
140 if ([_proxyObject respondsToSelector:_removeManySEL])
141 _removeMany = [_proxyObject methodForSelector:_removeManySEL];
143 _intersectSEL = sel_getName(
@"intersect"+capitalizedKey+
":");
144 if ([_proxyObject respondsToSelector:_intersectSEL])
145 _intersect = [_proxyObject methodForSelector:_intersectSEL];
150 - (id)_representedObject
153 return _access(_proxyObject, _accessSEL);
155 return [_proxyObject valueForKey:_key];
158 - (void)_setRepresentedObject:(
id)anObject
161 return _set(_proxyObject, _setSEL, anObject);
163 [_proxyObject setValue:anObject forKey:_key];
169 return _count(_proxyObject, _countSEL);
171 return [[
self _representedObject] count];
177 return _enumerator(_proxyObject, _enumeratorSEL);
179 return [[
self _representedObject] objectEnumerator];
182 - (id)member:(
id)anObject
185 return _member(_proxyObject, _memberSEL, anObject);
187 return [[
self _representedObject] member:anObject];
190 - (void)addObject:(
id)anObject
193 _add(_proxyObject, _addSEL, anObject);
196 var objectSet = [CPSet setWithObject: anObject];
197 _addMany(_proxyObject, _addManySEL, objectSet);
201 var target = [[
self _representedObject] copy];
202 [target addObject:anObject];
203 [
self _setRepresentedObject:target];
207 - (void)addObjectsFromArray:(CPArray)objects
211 var objectSet = [CPSet setWithArray: objects];
212 _addMany(_proxyObject, _addManySEL, objectSet);
217 objectEnumerator = [objects objectEnumerator];
219 while ((
object = [objectEnumerator nextObject]) !== nil)
220 _add(_proxyObject, _addSEL,
object);
224 var target = [[
self _representedObject] copy];
225 [target addObjectsFromArray:objects];
226 [
self _setRepresentedObject:target];
230 - (void)unionSet:(CPSet)aSet
233 _addMany(_proxyObject, _addManySEL, aSet);
237 objectEnumerator = [aSet objectEnumerator];
239 while ((
object = [objectEnumerator nextObject]) !== nil)
240 _add(_proxyObject, _addSEL,
object);
244 var target = [[
self _representedObject] copy];
245 [target unionSet:aSet];
246 [
self _setRepresentedObject:target];
250 - (void)removeObject:(
id)anObject
253 _remove(_proxyObject, _removeSEL, anObject);
254 else if (_removeMany)
256 var objectSet = [CPSet setWithObject: anObject];
257 _removeMany(_proxyObject, _removeManySEL, objectSet);
261 var target = [[
self _representedObject] copy];
262 [target removeObject:anObject];
263 [
self _setRepresentedObject:target];
267 - (void)minusSet:(CPSet)aSet
270 _removeMany(_proxyObject, _removeManySEL, aSet);
274 objectEnumerator = [aSet objectEnumerator];
276 while ((
object = [objectEnumerator nextObject]) !== nil)
277 _remove(_proxyObject, _removeSEL,
object);
281 var target = [[
self _representedObject] copy];
282 [target minusSet:aSet];
283 [
self _setRepresentedObject:target];
287 - (void)removeObjectsInArray:(CPArray)objects
291 var objectSet = [CPSet setWithArray:objects];
292 _removeMany(_proxyObject, _removeManySEL, objectSet);
297 objectEnumerator = [objects objectEnumerator];
299 while ((
object = [objectEnumerator nextObject]) !== nil)
300 _remove(_proxyObject, _removeSEL,
object);
304 var target = [[
self _representedObject] copy];
305 [target removeObjectsInArray:objects];
306 [
self _setRepresentedObject:target];
310 - (void)removeAllObjects
314 var allObjectsSet = [[
self _representedObject] copy];
315 _removeMany(_proxyObject, _removeManySEL, allObjectsSet);
320 objectEnumerator = [[[
self _representedObject] copy] objectEnumerator];
322 while ((
object = [objectEnumerator nextObject]) !== nil)
323 _remove(_proxyObject, _removeSEL,
object);
327 var target = [[
self _representedObject] copy];
328 [target removeAllObjects];
329 [
self _setRepresentedObject:target];
333 - (void)intersectSet:(CPSet)aSet
336 _intersect(_proxyObject, _intersectSEL, aSet);
339 var target = [[
self _representedObject] copy];
340 [target intersectSet:aSet];
341 [
self _setRepresentedObject:target];
345 - (void)setSet:(CPSet)set
347 [
self _setRepresentedObject: set];
350 - (CPArray)allObjects
352 return [[
self _representedObject] allObjects];
357 return [[
self _representedObject] anyObject];
360 - (BOOL)containsObject:(
id)anObject
362 return [[
self _representedObject] containsObject: anObject];
365 - (BOOL)intersectsSet:(CPSet)aSet
367 return [[
self _representedObject] intersectsSet: aSet];
370 - (BOOL)isEqualToSet:(CPSet)aSet
372 return [[
self _representedObject] isEqualToSet: aSet];
377 return [[
self _representedObject] copy];
387 [
self valueForUndefinedKey:@"<empty path>"];
389 if (aKeyPath.charAt(0) ===
"@")
391 var dotIndex = aKeyPath.indexOf(
"."),
397 operator = aKeyPath.substring(1, dotIndex);
398 parameter = aKeyPath.substring(dotIndex + 1);
401 operator = aKeyPath.substring(1);
403 return [_CPCollectionKVCOperator performOperation:operator withCollection:self propertyPath:parameter];
407 var valuesForKeySet = [CPSet set],
409 containedObjectValue,
410 containedObjectEnumerator = [
self objectEnumerator];
412 while ((containedObject = [containedObjectEnumerator nextObject]) !== nil)
414 containedObjectValue = [containedObject valueForKeyPath:aKeyPath];
416 if (containedObjectValue === nil || containedObjectValue === undefined)
419 [valuesForKeySet addObject:containedObjectValue];
422 return valuesForKeySet;
429 containedObjectEnumerator = [
self objectEnumerator];
431 while ((containedObject = [containedObjectEnumerator nextObject]) !== nil)
432 [containedObject setValue:aValue forKey:aKey];
An object representation of nil.
An immutable string (collection of characters).
Defines an interface for enumerators.
id mutableSetValueForKey:(id aKey)
id valueForKeyPath:(CPString aKeyPath)