diff --git a/.gitattributes b/.gitattributes index 28d0290101..fd39d0ffe9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1767,6 +1767,7 @@ components/lazutils/laz_xmlwrite.pas svneol=native#text/pascal components/lazutils/lazdbglog.pas svneol=native#text/plain components/lazutils/lazfilecache.pas svneol=native#text/plain components/lazutils/lazfileutils.pas svneol=native#text/plain +components/lazutils/lazmethodlist.pas svneol=native#text/plain components/lazutils/lazutf16.pas svneol=native#text/pascal components/lazutils/lazutf8.pas svneol=native#text/plain components/lazutils/lazutf8classes.pas svneol=native#text/pascal diff --git a/components/lazutils/lazmethodlist.pas b/components/lazutils/lazmethodlist.pas new file mode 100644 index 0000000000..5823c6ddfa --- /dev/null +++ b/components/lazutils/lazmethodlist.pas @@ -0,0 +1,167 @@ +unit LazMethodList; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils; + +type + { TMethodList - array of TMethod } + + TMethodList = class + private + FItems: ^TMethod; + FCount: integer; + function GetItems(Index: integer): TMethod; + procedure SetItems(Index: integer; const AValue: TMethod); + public + destructor Destroy; override; + function Count: integer; + function NextDownIndex(var Index: integer): boolean; + function IndexOf(const AMethod: TMethod): integer; + procedure Delete(Index: integer); + procedure Remove(const AMethod: TMethod); + procedure Add(const AMethod: TMethod); + procedure Add(const AMethod: TMethod; AsLast: boolean); + procedure Insert(Index: integer; const AMethod: TMethod); + procedure Move(OldIndex, NewIndex: integer); + procedure RemoveAllMethodsOfObject(const AnObject: TObject); + procedure CallNotifyEvents(Sender: TObject); + public + property Items[Index: integer]: TMethod read GetItems write SetItems; default; + end; + +implementation + +{ TMethodList } + +function TMethodList.GetItems(Index: integer): TMethod; +begin + Result:=FItems[Index]; +end; + +procedure TMethodList.SetItems(Index: integer; const AValue: TMethod); +begin + FItems[Index]:=AValue; +end; + +destructor TMethodList.Destroy; +begin + ReAllocMem(FItems,0); + inherited Destroy; +end; + +function TMethodList.Count: integer; +begin + if Self<>nil then + Result:=FCount + else + Result:=0; +end; + +function TMethodList.NextDownIndex(var Index: integer): boolean; +begin + if Self<>nil then begin + dec(Index); + if (Index>=FCount) then + Index:=FCount-1; + end else + Index:=-1; + Result:=(Index>=0); +end; + +function TMethodList.IndexOf(const AMethod: TMethod): integer; +begin + if Self<>nil then begin + Result:=FCount-1; + while Result>=0 do begin + if (FItems[Result].Code=AMethod.Code) + and (FItems[Result].Data=AMethod.Data) then exit; + dec(Result); + end; + end else + Result:=-1; +end; + +procedure TMethodList.Delete(Index: integer); +begin + dec(FCount); + if FCount>Index then + System.Move(FItems[Index+1],FItems[Index],(FCount-Index)*SizeOf(TMethod)); + ReAllocMem(FItems,FCount*SizeOf(TMethod)); +end; + +procedure TMethodList.Remove(const AMethod: TMethod); +var + i: integer; +begin + if Self<>nil then begin + i:=IndexOf(AMethod); + if i>=0 then Delete(i); + end; +end; + +procedure TMethodList.Add(const AMethod: TMethod); +begin + inc(FCount); + ReAllocMem(FItems,FCount*SizeOf(TMethod)); + FItems[FCount-1]:=AMethod; +end; + +procedure TMethodList.Add(const AMethod: TMethod; AsLast: boolean); +begin + if AsLast then + Add(AMethod) + else + Insert(0,AMethod); +end; + +procedure TMethodList.Insert(Index: integer; const AMethod: TMethod); +begin + inc(FCount); + ReAllocMem(FItems,FCount*SizeOf(TMethod)); + if IndexNewIndex then + System.Move(FItems[NewIndex],FItems[NewIndex+1], + SizeOf(TMethod)*(OldIndex-NewIndex)) + else + System.Move(FItems[NewIndex+1],FItems[NewIndex], + SizeOf(TMethod)*(NewIndex-OldIndex)); + FItems[NewIndex]:=MovingMethod; +end; + +procedure TMethodList.RemoveAllMethodsOfObject(const AnObject: TObject); +var + i: Integer; +begin + if Self=nil then exit; + i:=FCount-1; + while i>=0 do begin + if TObject(FItems[i].Data)=AnObject then Delete(i); + dec(i); + end; +end; + +procedure TMethodList.CallNotifyEvents(Sender: TObject); +var + i: LongInt; +begin + i:=Count; + while NextDownIndex(i) do + TNotifyEvent(Items[i])(Sender); +end; + +end. + diff --git a/components/lazutils/lazutils.lpk b/components/lazutils/lazutils.lpk index 617e467dae..33ea8a68fd 100644 --- a/components/lazutils/lazutils.lpk +++ b/components/lazutils/lazutils.lpk @@ -19,7 +19,7 @@ - + @@ -136,6 +136,10 @@ + + + + diff --git a/components/lazutils/lazutils.pas b/components/lazutils/lazutils.pas index edc896dc9b..ae175d6b57 100644 --- a/components/lazutils/lazutils.pas +++ b/components/lazutils/lazutils.pas @@ -11,7 +11,7 @@ uses Laz_XMLCfg, Laz_XMLRead, Laz_XMLStreaming, Laz_XMLWrite, LazFileUtils, LazFileCache, LUResStrings, LazUTF8, LazDbgLog, paswstring, FileUtil, lazutf8classes, Masks, LazUtilsStrConsts, LConvEncoding, lazutf16, - lazutf8sysutils, LazarusPackageIntf; + lazutf8sysutils, LazMethodList, LazarusPackageIntf; implementation diff --git a/lcl/lclproc.pas b/lcl/lclproc.pas index 434d10db4c..1bd1cfdb5e 100644 --- a/lcl/lclproc.pas +++ b/lcl/lclproc.pas @@ -33,38 +33,14 @@ interface uses {$IFDEF Darwin}MacOSAll, {$ENDIF} Classes, SysUtils, Math, TypInfo, Types, FPCAdds, AvgLvlTree, FileUtil, - LCLStrConsts, LCLType, WSReferences, LazUTF8 + LCLStrConsts, LCLType, WSReferences, LazMethodList, LazUTF8 {$IFDEF EnablePasWString}, paswstring{$ENDIF} {$IFNDEF DisableCWString}{$ifdef unix}{$ifndef DisableIconv}, cwstring{$endif}{$endif}{$ENDIF} ; type - { TMethodList - array of TMethod } + TMethodList = LazMethodList.TMethodList; - TMethodList = class - private - FItems: ^TMethod; - FCount: integer; - function GetItems(Index: integer): TMethod; - procedure SetItems(Index: integer; const AValue: TMethod); - public - destructor Destroy; override; - function Count: integer; - function NextDownIndex(var Index: integer): boolean; - function IndexOf(const AMethod: TMethod): integer; - procedure Delete(Index: integer); - procedure Remove(const AMethod: TMethod); - procedure Add(const AMethod: TMethod); - procedure Add(const AMethod: TMethod; AsLast: boolean); - procedure Insert(Index: integer; const AMethod: TMethod); - procedure Move(OldIndex, NewIndex: integer); - procedure RemoveAllMethodsOfObject(const AnObject: TObject); - procedure CallNotifyEvents(Sender: TObject); - public - property Items[Index: integer]: TMethod read GetItems write SetItems; default; - end; - -type TStackTracePointers = array of Pointer; { TDebugLCLItemInfo } @@ -814,134 +790,6 @@ begin TProcedure(InterfaceFinalizationHandlers[i])(); end; -{ TMethodList } - -function TMethodList.GetItems(Index: integer): TMethod; -begin - Result:=FItems[Index]; -end; - -procedure TMethodList.SetItems(Index: integer; const AValue: TMethod); -begin - FItems[Index]:=AValue; -end; - -destructor TMethodList.Destroy; -begin - ReAllocMem(FItems,0); - inherited Destroy; -end; - -function TMethodList.Count: integer; -begin - if Self<>nil then - Result:=FCount - else - Result:=0; -end; - -function TMethodList.NextDownIndex(var Index: integer): boolean; -begin - if Self<>nil then begin - dec(Index); - if (Index>=FCount) then - Index:=FCount-1; - end else - Index:=-1; - Result:=(Index>=0); -end; - -function TMethodList.IndexOf(const AMethod: TMethod): integer; -begin - if Self<>nil then begin - Result:=FCount-1; - while Result>=0 do begin - if (FItems[Result].Code=AMethod.Code) - and (FItems[Result].Data=AMethod.Data) then exit; - dec(Result); - end; - end else - Result:=-1; -end; - -procedure TMethodList.Delete(Index: integer); -begin - dec(FCount); - if FCount>Index then - System.Move(FItems[Index+1],FItems[Index],(FCount-Index)*SizeOf(TMethod)); - ReAllocMem(FItems,FCount*SizeOf(TMethod)); -end; - -procedure TMethodList.Remove(const AMethod: TMethod); -var - i: integer; -begin - if Self<>nil then begin - i:=IndexOf(AMethod); - if i>=0 then Delete(i); - end; -end; - -procedure TMethodList.Add(const AMethod: TMethod); -begin - inc(FCount); - ReAllocMem(FItems,FCount*SizeOf(TMethod)); - FItems[FCount-1]:=AMethod; -end; - -procedure TMethodList.Add(const AMethod: TMethod; AsLast: boolean); -begin - if AsLast then - Add(AMethod) - else - Insert(0,AMethod); -end; - -procedure TMethodList.Insert(Index: integer; const AMethod: TMethod); -begin - inc(FCount); - ReAllocMem(FItems,FCount*SizeOf(TMethod)); - if IndexNewIndex then - System.Move(FItems[NewIndex],FItems[NewIndex+1], - SizeOf(TMethod)*(OldIndex-NewIndex)) - else - System.Move(FItems[NewIndex+1],FItems[NewIndex], - SizeOf(TMethod)*(NewIndex-OldIndex)); - FItems[NewIndex]:=MovingMethod; -end; - -procedure TMethodList.RemoveAllMethodsOfObject(const AnObject: TObject); -var - i: Integer; -begin - if Self=nil then exit; - i:=FCount-1; - while i>=0 do begin - if TObject(FItems[i].Data)=AnObject then Delete(i); - dec(i); - end; -end; - -procedure TMethodList.CallNotifyEvents(Sender: TObject); -var - i: LongInt; -begin - i:=Count; - while NextDownIndex(i) do - TNotifyEvent(Items[i])(Sender); -end; - {------------------------------------------------------------------------------ procedure RaiseGDBException(const Msg: string);