mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 00:30:53 +00:00
Avoid some unnecessary work.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@26122 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
0c30cbd8c0
commit
425290fda5
2 changed files with 145 additions and 105 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2008-02-23 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Source/NSKeyValueObserving.m:
|
||||||
|
Don't calculate KVO info in cases where there is no observer.
|
||||||
|
|
||||||
2008-02-22 Richard Frith-Macdonald <rfm@gnu.org>
|
2008-02-22 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Source/mframe/mframe.head: Change function arguments
|
* Source/mframe/mframe.head: Change function arguments
|
||||||
|
|
|
@ -517,14 +517,16 @@ replacementForClass(Class c)
|
||||||
NSString *mainKey;
|
NSString *mainKey;
|
||||||
NSHashTable dependents;
|
NSHashTable dependents;
|
||||||
|
|
||||||
while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey), &dependents))
|
while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey),
|
||||||
|
&dependents))
|
||||||
{
|
{
|
||||||
NSHashEnumerator dependentKeyEnum;
|
NSHashEnumerator dependentKeyEnum;
|
||||||
NSString *dependentKey;
|
NSString *dependentKey;
|
||||||
|
|
||||||
if (!dependents) continue;
|
if (!dependents) continue;
|
||||||
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
||||||
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
while ((dependentKey
|
||||||
|
= NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
||||||
{
|
{
|
||||||
if ([dependentKey isEqual: aKey])
|
if ([dependentKey isEqual: aKey])
|
||||||
{
|
{
|
||||||
|
@ -1265,38 +1267,46 @@ replacementForClass(Class c)
|
||||||
- (void) willChangeValueForDependentsOfKey: (NSString *)aKey
|
- (void) willChangeValueForDependentsOfKey: (NSString *)aKey
|
||||||
{
|
{
|
||||||
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
|
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
|
||||||
|
|
||||||
if (keys)
|
if (keys)
|
||||||
{
|
{
|
||||||
NSHashTable dependents = NSMapGet(keys, aKey);
|
NSHashTable dependents = NSMapGet(keys, aKey);
|
||||||
NSString *dependentKey;
|
|
||||||
NSHashEnumerator dependentKeyEnum;
|
|
||||||
|
|
||||||
if (!dependents) return;
|
if (dependents != 0)
|
||||||
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
|
||||||
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
|
||||||
{
|
{
|
||||||
[self willChangeValueForKey:dependentKey];
|
NSString *dependentKey;
|
||||||
|
NSHashEnumerator dependentKeyEnum;
|
||||||
|
|
||||||
|
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
||||||
|
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
||||||
|
{
|
||||||
|
[self willChangeValueForKey: dependentKey];
|
||||||
|
}
|
||||||
|
NSEndHashTableEnumeration(&dependentKeyEnum);
|
||||||
}
|
}
|
||||||
NSEndHashTableEnumeration(&dependentKeyEnum);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) didChangeValueForDependentsOfKey: (NSString *)aKey
|
- (void) didChangeValueForDependentsOfKey: (NSString *)aKey
|
||||||
{
|
{
|
||||||
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
|
NSMapTable keys = NSMapGet(dependentKeyTable, [self class]);
|
||||||
|
|
||||||
if (keys)
|
if (keys)
|
||||||
{
|
{
|
||||||
NSHashTable dependents = NSMapGet(keys, aKey);
|
NSHashTable dependents = NSMapGet(keys, aKey);
|
||||||
NSString *dependentKey;
|
|
||||||
NSHashEnumerator dependentKeyEnum;
|
|
||||||
|
|
||||||
if (!dependents) return;
|
if (dependents != nil)
|
||||||
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
|
||||||
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
|
||||||
{
|
{
|
||||||
[self didChangeValueForKey:dependentKey];
|
NSString *dependentKey;
|
||||||
|
NSHashEnumerator dependentKeyEnum;
|
||||||
|
|
||||||
|
dependentKeyEnum = NSEnumerateHashTable(dependents);
|
||||||
|
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
|
||||||
|
{
|
||||||
|
[self didChangeValueForKey: dependentKey];
|
||||||
|
}
|
||||||
|
NSEndHashTableEnumeration(&dependentKeyEnum);
|
||||||
}
|
}
|
||||||
NSEndHashTableEnumeration(&dependentKeyEnum);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1307,32 +1317,43 @@ replacementForClass(Class c)
|
||||||
*/
|
*/
|
||||||
- (void) willChangeValueForKey: (NSString*)aKey
|
- (void) willChangeValueForKey: (NSString*)aKey
|
||||||
{
|
{
|
||||||
id old = [self valueForKey: aKey];
|
GSKVOInfo *info;
|
||||||
NSDictionary * change;
|
|
||||||
if (old != nil)
|
info = (GSKVOInfo *)[self observationInfo];
|
||||||
change = [NSMutableDictionary
|
if (info != nil)
|
||||||
dictionaryWithObject: [self valueForKey: aKey]
|
{
|
||||||
forKey: NSKeyValueChangeOldKey];
|
id old;
|
||||||
else
|
NSDictionary *change;
|
||||||
change = [NSMutableDictionary dictionary];
|
|
||||||
[(GSKVOInfo *)[self observationInfo] setChange: change forKey: aKey];
|
change = [NSMutableDictionary dictionary];
|
||||||
|
old = [self valueForKey: aKey];
|
||||||
|
if (old != nil)
|
||||||
|
{
|
||||||
|
[change setObject: old forKey: NSKeyValueChangeOldKey];
|
||||||
|
}
|
||||||
|
[info setChange: change forKey: aKey];
|
||||||
|
}
|
||||||
[self willChangeValueForDependentsOfKey: aKey];
|
[self willChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) didChangeValueForKey: (NSString*)aKey
|
- (void) didChangeValueForKey: (NSString*)aKey
|
||||||
{
|
{
|
||||||
GSKVOInfo *info;
|
GSKVOInfo *info;
|
||||||
NSMutableDictionary *change;
|
|
||||||
|
|
||||||
info = (GSKVOInfo *)[self observationInfo];
|
info = (GSKVOInfo *)[self observationInfo];
|
||||||
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
if (info != nil)
|
||||||
[change setValue: [self valueForKey: aKey]
|
{
|
||||||
forKey: NSKeyValueChangeNewKey];
|
NSMutableDictionary *change;
|
||||||
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeSetting]
|
|
||||||
forKey: NSKeyValueChangeKindKey];
|
|
||||||
|
|
||||||
[info notifyForKey: aKey ofChange: change];
|
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
||||||
[info setChange:nil forKey: aKey];
|
[change setValue: [self valueForKey: aKey]
|
||||||
|
forKey: NSKeyValueChangeNewKey];
|
||||||
|
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeSetting]
|
||||||
|
forKey: NSKeyValueChangeKindKey];
|
||||||
|
|
||||||
|
[info notifyForKey: aKey ofChange: change];
|
||||||
|
[info setChange: nil forKey: aKey];
|
||||||
|
}
|
||||||
[self didChangeValueForDependentsOfKey: aKey];
|
[self didChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1341,26 +1362,30 @@ replacementForClass(Class c)
|
||||||
forKey: (NSString*)aKey
|
forKey: (NSString*)aKey
|
||||||
{
|
{
|
||||||
GSKVOInfo *info;
|
GSKVOInfo *info;
|
||||||
NSMutableDictionary *change;
|
|
||||||
NSMutableArray *array;
|
|
||||||
|
|
||||||
info = [self observationInfo];
|
info = [self observationInfo];
|
||||||
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
if (info != nil)
|
||||||
array = [self valueForKey: aKey];
|
|
||||||
|
|
||||||
[change setValue: [NSNumber numberWithInt: changeKind] forKey:
|
|
||||||
NSKeyValueChangeKindKey];
|
|
||||||
[change setValue: indexes forKey: NSKeyValueChangeIndexesKey];
|
|
||||||
|
|
||||||
if (changeKind == NSKeyValueChangeInsertion
|
|
||||||
|| changeKind == NSKeyValueChangeReplacement)
|
|
||||||
{
|
{
|
||||||
[change setValue: [array objectsAtIndexes: indexes]
|
NSMutableDictionary *change;
|
||||||
forKey: NSKeyValueChangeNewKey];
|
NSMutableArray *array;
|
||||||
}
|
|
||||||
|
|
||||||
[info notifyForKey: aKey ofChange: change];
|
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
||||||
[info setChange:nil forKey: aKey];
|
array = [self valueForKey: aKey];
|
||||||
|
|
||||||
|
[change setValue: [NSNumber numberWithInt: changeKind] forKey:
|
||||||
|
NSKeyValueChangeKindKey];
|
||||||
|
[change setValue: indexes forKey: NSKeyValueChangeIndexesKey];
|
||||||
|
|
||||||
|
if (changeKind == NSKeyValueChangeInsertion
|
||||||
|
|| changeKind == NSKeyValueChangeReplacement)
|
||||||
|
{
|
||||||
|
[change setValue: [array objectsAtIndexes: indexes]
|
||||||
|
forKey: NSKeyValueChangeNewKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
[info notifyForKey: aKey ofChange: change];
|
||||||
|
[info setChange:nil forKey: aKey];
|
||||||
|
}
|
||||||
[self didChangeValueForDependentsOfKey: aKey];
|
[self didChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1369,21 +1394,24 @@ replacementForClass(Class c)
|
||||||
forKey: (NSString*)aKey
|
forKey: (NSString*)aKey
|
||||||
{
|
{
|
||||||
GSKVOInfo *info;
|
GSKVOInfo *info;
|
||||||
NSDictionary *change;
|
|
||||||
NSMutableArray *array;
|
|
||||||
|
|
||||||
info = [self observationInfo];
|
info = [self observationInfo];
|
||||||
change = [NSMutableDictionary dictionary];
|
|
||||||
array = [self valueForKey: aKey];
|
|
||||||
|
|
||||||
if (changeKind == NSKeyValueChangeRemoval
|
|
||||||
|| changeKind == NSKeyValueChangeReplacement)
|
|
||||||
{
|
{
|
||||||
[change setValue: [array objectsAtIndexes: indexes]
|
NSDictionary *change;
|
||||||
forKey: NSKeyValueChangeOldKey];
|
NSMutableArray *array;
|
||||||
}
|
|
||||||
|
|
||||||
[info setChange: change forKey: aKey];
|
change = [NSMutableDictionary dictionary];
|
||||||
|
array = [self valueForKey: aKey];
|
||||||
|
|
||||||
|
if (changeKind == NSKeyValueChangeRemoval
|
||||||
|
|| changeKind == NSKeyValueChangeReplacement)
|
||||||
|
{
|
||||||
|
[change setValue: [array objectsAtIndexes: indexes]
|
||||||
|
forKey: NSKeyValueChangeOldKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
[info setChange: change forKey: aKey];
|
||||||
|
}
|
||||||
[self willChangeValueForDependentsOfKey: aKey];
|
[self willChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1392,15 +1420,19 @@ replacementForClass(Class c)
|
||||||
usingObjects: (NSSet*)objects
|
usingObjects: (NSSet*)objects
|
||||||
{
|
{
|
||||||
GSKVOInfo *info;
|
GSKVOInfo *info;
|
||||||
NSDictionary *change;
|
|
||||||
NSMutableSet *set;
|
|
||||||
|
|
||||||
info = [self observationInfo];
|
info = [self observationInfo];
|
||||||
change = [NSMutableDictionary dictionary];
|
if (info != nil)
|
||||||
set = [self valueForKey: aKey];
|
{
|
||||||
|
NSDictionary *change;
|
||||||
|
NSMutableSet *set;
|
||||||
|
|
||||||
[change setValue: [set mutableCopy] forKey: @"oldSet"];
|
change = [NSMutableDictionary dictionary];
|
||||||
[info setChange: change forKey: aKey];
|
set = [self valueForKey: aKey];
|
||||||
|
|
||||||
|
[change setValue: [set mutableCopy] forKey: @"oldSet"];
|
||||||
|
[info setChange: change forKey: aKey];
|
||||||
|
}
|
||||||
[self willChangeValueForDependentsOfKey: aKey];
|
[self willChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1409,49 +1441,52 @@ replacementForClass(Class c)
|
||||||
usingObjects: (NSSet*)objects
|
usingObjects: (NSSet*)objects
|
||||||
{
|
{
|
||||||
GSKVOInfo *info;
|
GSKVOInfo *info;
|
||||||
NSMutableDictionary *change;
|
|
||||||
NSMutableSet *oldSet;
|
|
||||||
NSMutableSet *set;
|
|
||||||
|
|
||||||
info = (GSKVOInfo *)[self observationInfo];
|
info = (GSKVOInfo *)[self observationInfo];
|
||||||
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
if (info != nil)
|
||||||
oldSet = [change valueForKey: @"oldSet"];
|
|
||||||
set = [self valueForKey: aKey];
|
|
||||||
|
|
||||||
[change setValue: nil forKey: @"oldSet"];
|
|
||||||
|
|
||||||
if (mutationKind == NSKeyValueUnionSetMutation)
|
|
||||||
{
|
{
|
||||||
set = [set mutableCopy];
|
NSMutableDictionary *change;
|
||||||
[set minusSet: oldSet];
|
NSMutableSet *oldSet;
|
||||||
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeInsertion]
|
NSMutableSet *set;
|
||||||
forKey: NSKeyValueChangeKindKey];
|
|
||||||
[change setValue: set forKey: NSKeyValueChangeNewKey];
|
|
||||||
}
|
|
||||||
else if (mutationKind == NSKeyValueMinusSetMutation
|
|
||||||
|| mutationKind == NSKeyValueIntersectSetMutation)
|
|
||||||
{
|
|
||||||
[oldSet minusSet: set];
|
|
||||||
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeRemoval]
|
|
||||||
forKey: NSKeyValueChangeKindKey];
|
|
||||||
[change setValue: oldSet forKey: NSKeyValueChangeOldKey];
|
|
||||||
}
|
|
||||||
else if (mutationKind == NSKeyValueSetSetMutation)
|
|
||||||
{
|
|
||||||
NSMutableSet *old;
|
|
||||||
NSMutableSet *new;
|
|
||||||
|
|
||||||
old = [oldSet mutableCopy];
|
change = (NSMutableDictionary *)[info changeForKey: aKey];
|
||||||
[old minusSet: set];
|
oldSet = [change valueForKey: @"oldSet"];
|
||||||
new = [set mutableCopy];
|
set = [self valueForKey: aKey];
|
||||||
[new minusSet: oldSet];
|
[change setValue: nil forKey: @"oldSet"];
|
||||||
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeReplacement]
|
if (mutationKind == NSKeyValueUnionSetMutation)
|
||||||
forKey: NSKeyValueChangeKindKey];
|
{
|
||||||
[change setValue: old forKey: NSKeyValueChangeOldKey];
|
set = [set mutableCopy];
|
||||||
[change setValue: new forKey: NSKeyValueChangeNewKey];
|
[set minusSet: oldSet];
|
||||||
|
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeInsertion]
|
||||||
|
forKey: NSKeyValueChangeKindKey];
|
||||||
|
[change setValue: set forKey: NSKeyValueChangeNewKey];
|
||||||
|
}
|
||||||
|
else if (mutationKind == NSKeyValueMinusSetMutation
|
||||||
|
|| mutationKind == NSKeyValueIntersectSetMutation)
|
||||||
|
{
|
||||||
|
[oldSet minusSet: set];
|
||||||
|
[change setValue: [NSNumber numberWithInt: NSKeyValueChangeRemoval]
|
||||||
|
forKey: NSKeyValueChangeKindKey];
|
||||||
|
[change setValue: oldSet forKey: NSKeyValueChangeOldKey];
|
||||||
|
}
|
||||||
|
else if (mutationKind == NSKeyValueSetSetMutation)
|
||||||
|
{
|
||||||
|
NSMutableSet *old;
|
||||||
|
NSMutableSet *new;
|
||||||
|
|
||||||
|
old = [oldSet mutableCopy];
|
||||||
|
[old minusSet: set];
|
||||||
|
new = [set mutableCopy];
|
||||||
|
[new minusSet: oldSet];
|
||||||
|
[change setValue:
|
||||||
|
[NSNumber numberWithInt: NSKeyValueChangeReplacement]
|
||||||
|
forKey: NSKeyValueChangeKindKey];
|
||||||
|
[change setValue: old forKey: NSKeyValueChangeOldKey];
|
||||||
|
[change setValue: new forKey: NSKeyValueChangeNewKey];
|
||||||
|
}
|
||||||
|
[info notifyForKey: aKey ofChange: change];
|
||||||
|
[info setChange:nil forKey: aKey];
|
||||||
}
|
}
|
||||||
[info notifyForKey: aKey ofChange: change];
|
|
||||||
[info setChange:nil forKey: aKey];
|
|
||||||
[self didChangeValueForDependentsOfKey: aKey];
|
[self didChangeValueForDependentsOfKey: aKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue