Skip to content

Commit 1c0abe2

Browse files
committed
reduced overhead in observable lists
1 parent bf52061 commit 1c0abe2

File tree

1 file changed

+16
-21
lines changed

1 file changed

+16
-21
lines changed

Source/Base/Collections/Spring.Collections.Lists.pas

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2252,15 +2252,14 @@ procedure TObservableObjectList.BeforeDestruction;
22522252
procedure TObservableObjectList.Changed(const value: TObject;
22532253
action: TCollectionChangedAction);
22542254
var
2255-
notifyPropertyChanged: INotifyPropertyChanged;
2256-
propertyChanged: IEvent<TPropertyChangedEvent>;
2255+
intf: IInterface;
22572256
begin
2258-
if Supports(value, INotifyPropertyChanged, notifyPropertyChanged) then
2257+
if value.GetInterface(INotifyPropertyChanged, Pointer(intf)) then
22592258
begin
2260-
propertyChanged := notifyPropertyChanged.OnPropertyChanged;
2259+
intf := INotifyPropertyChanged(intf).OnPropertyChanged;
22612260
case Action of
2262-
caAdded: propertyChanged.Add(DoItemPropertyChanged);
2263-
caRemoved, caExtracted: propertyChanged.Remove(DoItemPropertyChanged);
2261+
caAdded: IEvent<TPropertyChangedEvent>(intf).Add(DoItemPropertyChanged);
2262+
caRemoved, caExtracted: IEvent<TPropertyChangedEvent>(intf).Remove(DoItemPropertyChanged);
22642263
end;
22652264
end;
22662265

@@ -2276,9 +2275,8 @@ procedure TObservableObjectList.DoItemPropertyChanged(sender: TObject;
22762275

22772276
procedure TObservableObjectList.DoPropertyChanged(const propertyName: string);
22782277
begin
2279-
if fOnPropertyChanged.CanInvoke then
2280-
fOnPropertyChanged.Invoke(Self,
2281-
TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
2278+
with fOnPropertyChanged do if CanInvoke then
2279+
Invoke(Self, TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
22822280
end;
22832281

22842282
function TObservableObjectList.GetOnPropertyChanged: IEvent<TPropertyChangedEvent>;
@@ -2308,15 +2306,14 @@ procedure TObservableInterfaceList.BeforeDestruction;
23082306
procedure TObservableInterfaceList.Changed(const value: IInterface;
23092307
action: TCollectionChangedAction);
23102308
var
2311-
notifyPropertyChanged: INotifyPropertyChanged;
2312-
propertyChanged: IEvent<TPropertyChangedEvent>;
2309+
intf: IInterface;
23132310
begin
2314-
if Supports(value, INotifyPropertyChanged, notifyPropertyChanged) then
2311+
if value.QueryInterface(INotifyPropertyChanged, Pointer(intf)) = S_OK then
23152312
begin
2316-
propertyChanged := notifyPropertyChanged.OnPropertyChanged;
2313+
intf := INotifyPropertyChanged(intf).OnPropertyChanged;
23172314
case Action of
2318-
caAdded: propertyChanged.Add(DoItemPropertyChanged);
2319-
caRemoved, caExtracted: propertyChanged.Remove(DoItemPropertyChanged);
2315+
caAdded: IEvent<TPropertyChangedEvent>(intf).Add(DoItemPropertyChanged);
2316+
caRemoved, caExtracted: IEvent<TPropertyChangedEvent>(intf).Remove(DoItemPropertyChanged);
23202317
end;
23212318
end;
23222319

@@ -2329,16 +2326,14 @@ procedure TObservableInterfaceList.DoItemPropertyChanged(sender: TObject;
23292326
var
23302327
item: IInterface;
23312328
begin
2332-
Supports(sender, fElementType.TypeData.Guid, item);
2329+
sender.GetInterface(fElementType.TypeData.Guid, Pointer(item));
23332330
inherited Changed(item, caChanged);
23342331
end;
23352332

2336-
procedure TObservableInterfaceList.DoPropertyChanged(
2337-
const propertyName: string);
2333+
procedure TObservableInterfaceList.DoPropertyChanged(const propertyName: string);
23382334
begin
2339-
if fOnPropertyChanged.CanInvoke then
2340-
fOnPropertyChanged.Invoke(Self,
2341-
TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
2335+
with fOnPropertyChanged do if CanInvoke then
2336+
Invoke(Self, TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
23422337
end;
23432338

23442339
function TObservableInterfaceList.GetOnPropertyChanged: IEvent<TPropertyChangedEvent>;

0 commit comments

Comments
 (0)