mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 21:20:28 +02:00
lazutils: lazlistclasses: sorted unit
git-svn-id: trunk@49083 -
This commit is contained in:
parent
85f0a2993f
commit
3de4e18d3f
@ -70,9 +70,8 @@ type
|
||||
CNT_OFFS = SizeOf(Pointer);
|
||||
DATA_OFFS = CNT_OFFS + (2 * SizeOf(Integer));
|
||||
private
|
||||
(* Keep the size small, if no entries exist
|
||||
FMem: FLowElemPointer: PByte; FCount, FCapacity: Integer; Array of <FItemSize
|
||||
*)
|
||||
// Keep the size small, if no entries exist
|
||||
// FMem: FLowElemPointer: PByte; FCount, FCapacity: Integer; Array of <FItemSize
|
||||
FMem: PByte;
|
||||
|
||||
function GetDataPointer: PByte; inline;
|
||||
@ -164,9 +163,8 @@ type
|
||||
|
||||
generic TLazRoundBufferListMemBase<TPItemT, TSizeT> = object
|
||||
private
|
||||
(* Keep the size small, if no entries exist
|
||||
FMem: FLowElemPointer: PByte; FCount, FCapacity_in_bytes: Integer; Array of <FItemSize
|
||||
*)
|
||||
// Keep the size small, if no entries exist
|
||||
// FMem: FLowElemPointer: PByte; FCount, FCapacity_in_bytes: Integer; Array of <FItemSize
|
||||
FMem: TLazListClassesInternalMem;
|
||||
FItemSize: TSizeT; // May be zero size
|
||||
|
||||
@ -229,7 +227,6 @@ type
|
||||
property ItemPointer[Index: Integer]: PT read GetItemPointer;
|
||||
end;
|
||||
|
||||
|
||||
{ TLazFixedRoundBufferListMemBase }
|
||||
|
||||
generic TLazFixedRoundBufferListMemBase<TPItemT, TSizeT> = object(specialize TLazRoundBufferListMemBase<TPItemT, TSizeT>)
|
||||
@ -364,17 +361,8 @@ type
|
||||
property Items[Index: Integer]: T read Get write Put; default;
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
{ TLazPagedListMem }
|
||||
|
||||
procedure TLazPagedListMem.Create(AnPageSiteExp: Integer; AnItemSize: Integer);
|
||||
begin
|
||||
FItemSize.ItemSize := AnItemSize;
|
||||
inherited Create(AnPageSiteExp);
|
||||
end;
|
||||
|
||||
{ TLazListClassesInternalMem }
|
||||
|
||||
function TLazListClassesInternalMem.GetDataPointer: PByte;
|
||||
@ -1656,14 +1644,14 @@ begin
|
||||
|
||||
if ACount > PCapHalf then begin
|
||||
// insert new page, then "delete-bubble"
|
||||
(* * insert 900 into: [][] [0..700|701..999] [][][][]
|
||||
{ * insert 900 into: [][] [0..700|701..999] [][][][]
|
||||
1) SPLIT+add: [][] [0..700|+200] [+700|701..999] [][][][]
|
||||
2) bubble 100: [>][>] [+100/100..800|+200] [+700|701..999] [][][][]
|
||||
|
||||
* insert 1900 into: [][] [0..700|701..999] [][][][]
|
||||
1) SPLIT+add: [][] [0..700|+200] [+1000] [+700|701..999] [][][][]
|
||||
2) bubble 100: [>][>] [+100/100..800|+200] [+700|701..999] [][][][]
|
||||
*)
|
||||
}
|
||||
n2 := Min(SubIndex, ACount);
|
||||
n1 := Min(PCap-SubIndex, ACount - n2);
|
||||
if ExtraPagesNeeded = 0 then begin
|
||||
@ -1684,7 +1672,7 @@ begin
|
||||
end
|
||||
else begin
|
||||
// normal insert
|
||||
(* * insert 100 into: [] [1000] [0..50|51..999] [][][][]
|
||||
{ * insert 100 into: [] [1000] [0..50|51..999] [][][][]
|
||||
1) bubble 100(prev) [<] [0..900] [0..50|51..899] [][][][]
|
||||
2) move 50 [<] [0..950] [51..899] [][][][]
|
||||
3) add: [] [0.950,+50] [+50,51..999] [][][][]
|
||||
@ -1698,8 +1686,7 @@ begin
|
||||
2) move 50 [<] [0..950] [51..899] [][][][]
|
||||
3) INS(SPLIT at 0) [<] [0..950] [+1000] [51..899] [][][][]
|
||||
3) add: [] [0.950,+50] [+1000] [+50,51..999] [][][][]
|
||||
|
||||
*)
|
||||
}
|
||||
if ACount > SubIndex then begin
|
||||
if InsertPageIdx = 0 then begin
|
||||
InsertPages(0, 1);
|
||||
@ -1733,7 +1720,7 @@ begin
|
||||
InvSubIndex := PCap - SubIndex;
|
||||
if ACount > PCapHalf then begin
|
||||
// insert new page, then "delete-bubble"
|
||||
(* Same as above, but bubble to end *)
|
||||
// Same as above, but bubble to end
|
||||
n1 := Min(InvSubIndex, ACount);
|
||||
n2 := Min(SubIndex, ACount - n1);
|
||||
if ExtraPagesNeeded = 0 then begin
|
||||
@ -1753,7 +1740,7 @@ begin
|
||||
BubbleEntriesFromEnd(InsertPageIdx+ExtraPagesNeeded+1, PCap - ACount);
|
||||
end
|
||||
else begin
|
||||
(* Same as above, but bubble to end *)
|
||||
// Same as above, but bubble to end
|
||||
// normal insert
|
||||
if ACount > InvSubIndex then begin
|
||||
c := PageCount;
|
||||
@ -1971,6 +1958,14 @@ begin
|
||||
else debugln(['PAGED .Dump NONE']);
|
||||
end;
|
||||
|
||||
{ TLazPagedListMem }
|
||||
|
||||
procedure TLazPagedListMem.Create(AnPageSiteExp: Integer; AnItemSize: Integer);
|
||||
begin
|
||||
FItemSize.ItemSize := AnItemSize;
|
||||
inherited Create(AnPageSiteExp);
|
||||
end;
|
||||
|
||||
{ TLazDualCapacityList }
|
||||
|
||||
function TLazDualCapacityList.GetCapacity: Integer;
|
||||
|
Loading…
Reference in New Issue
Block a user