亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jclasses.pas

?? M2原代碼 M2原代碼
?? PAS
字號:
unit JClasses;

interface
uses SysUtils;
const
  MaxListSize = Maxint div 16;
type
  EListError = class(Exception);
  PPointerList = ^TPointerList;
  TPointerList = array[0..MaxListSize - 1] of Pointer;
  TListSortCompare = function (Item1, Item2: Pointer): Integer;
  TListNotification = (lnAdded, lnExtracted, lnDeleted);

  TListAssignOp = (laCopy, laAnd, laOr, laXor, laSrcUnique, laDestUnique);

  CList = class(TObject)
  private
    FList: PPointerList;
    FCount: Integer;
    FCapacity: Integer;
  protected
    function Get(Index: Integer): Pointer;
    procedure Grow; virtual;
    procedure Put(Index: Integer; Item: Pointer);
    procedure Notify(Ptr: Pointer; Action: TListNotification); virtual;
    procedure SetCapacity(NewCapacity: Integer);
    procedure SetCount(NewCount: Integer);
  public
    destructor Destroy; override;
    function Add(Item: Pointer): Integer;
    procedure Clear; virtual;
    procedure Delete(Index: Integer);
    class procedure Error(const Msg: string; Data: Integer); overload; virtual;
    class procedure Error(Msg: PResStringRec; Data: Integer); overload;
    procedure Exchange(Index1, Index2: Integer);
    function Expand: CList;
    function Extract(Item: Pointer): Pointer;
    function First: Pointer;
    function IndexOf(Item: Pointer): Integer;
    procedure Insert(Index: Integer; Item: Pointer);
    function Last: Pointer;
    procedure Move(CurIndex, NewIndex: Integer);
    function Remove(Item: Pointer): Integer;
    procedure Pack;
    procedure Sort(Compare: TListSortCompare);
    procedure Assign(ListA: CList; AOperator: TListAssignOp = laCopy; ListB: CList = nil);
    property Capacity: Integer read FCapacity write SetCapacity;
    property Count: Integer read FCount write SetCount;
    property Items[Index: Integer]: Pointer read Get write Put; default;
    property List: PPointerList read FList;
  end;

implementation
uses RTLConsts, SysConst, Types;
{ TList }

destructor CList.Destroy;
begin
  Clear;
end;

function CList.Add(Item: Pointer): Integer;
begin
  Result := FCount;
  if Result = FCapacity then
    Grow;
  FList^[Result] := Item;
  Inc(FCount);
  if Item <> nil then
    Notify(Item, lnAdded);
end;

procedure CList.Clear;
begin
  SetCount(0);
  SetCapacity(0);
end;

procedure CList.Delete(Index: Integer);
var
  Temp: Pointer;
begin
  if (Index < 0) or (Index >= FCount) then
    Error(@SListIndexError, Index);
  Temp := Items[Index];
  Dec(FCount);
  if Index < FCount then
    System.Move(FList^[Index + 1], FList^[Index],
      (FCount - Index) * SizeOf(Pointer));
  if Temp <> nil then
    Notify(Temp, lnDeleted);
end;

class procedure CList.Error(const Msg: string; Data: Integer);

  function ReturnAddr: Pointer;
  asm
          MOV     EAX,[EBP+4]
  end;

begin
  raise EListError.CreateFmt(Msg, [Data]) at ReturnAddr;
end;

class procedure CList.Error(Msg: PResStringRec; Data: Integer);
begin
  CList.Error(LoadResString(Msg), Data);
end;

procedure CList.Exchange(Index1, Index2: Integer);
var
  Item: Pointer;
begin
  if (Index1 < 0) or (Index1 >= FCount) then
    Error(@SListIndexError, Index1);
  if (Index2 < 0) or (Index2 >= FCount) then
    Error(@SListIndexError, Index2);
  Item := FList^[Index1];
  FList^[Index1] := FList^[Index2];
  FList^[Index2] := Item;
end;

function CList.Expand: CList;
begin
  if FCount = FCapacity then
    Grow;
  Result := Self;
end;

function CList.First: Pointer;
begin
  Result := Get(0);
end;

function CList.Get(Index: Integer): Pointer;
begin
  if (Index < 0) or (Index >= FCount) then
    Error(@SListIndexError, Index);
  Result := FList^[Index];
end;

procedure CList.Grow;
var
  Delta: Integer;
begin
  if FCapacity > 64 then
    Delta := FCapacity div 4
  else
    if FCapacity > 8 then
      Delta := 16
    else
      Delta := 4;
  SetCapacity(FCapacity + Delta);
end;

function CList.IndexOf(Item: Pointer): Integer;
begin
  Result := 0;
  while (Result < FCount) and (FList^[Result] <> Item) do
    Inc(Result);
  if Result = FCount then
    Result := -1;
end;

procedure CList.Insert(Index: Integer; Item: Pointer);
begin
  if (Index < 0) or (Index > FCount) then
    Error(@SListIndexError, Index);
  if FCount = FCapacity then
    Grow;
  if Index < FCount then
    System.Move(FList^[Index], FList^[Index + 1],
      (FCount - Index) * SizeOf(Pointer));
  FList^[Index] := Item;
  Inc(FCount);
  if Item <> nil then
    Notify(Item, lnAdded);
end;

function CList.Last: Pointer;
begin
  Result := Get(FCount - 1);
end;

procedure CList.Move(CurIndex, NewIndex: Integer);
var
  Item: Pointer;
begin
  if CurIndex <> NewIndex then
  begin
    if (NewIndex < 0) or (NewIndex >= FCount) then
      Error(@SListIndexError, NewIndex);
    Item := Get(CurIndex);
    FList^[CurIndex] := nil;
    Delete(CurIndex);
    Insert(NewIndex, nil);
    FList^[NewIndex] := Item;
  end;
end;

procedure CList.Put(Index: Integer; Item: Pointer);
var
  Temp: Pointer;
begin
  if (Index < 0) or (Index >= FCount) then
    Error(@SListIndexError, Index);
  if Item <> FList^[Index] then
  begin
    Temp := FList^[Index];
    FList^[Index] := Item;
    if Temp <> nil then
      Notify(Temp, lnDeleted);
    if Item <> nil then
      Notify(Item, lnAdded);
  end;
end;

function CList.Remove(Item: Pointer): Integer;
begin
  Result := IndexOf(Item);
  if Result >= 0 then
    Delete(Result);
end;

procedure CList.Pack;
var
  I: Integer;
begin
  for I := FCount - 1 downto 0 do
    if Items[I] = nil then
      Delete(I);
end;

procedure CList.SetCapacity(NewCapacity: Integer);
begin
  if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then
    Error(@SListCapacityError, NewCapacity);
  if NewCapacity <> FCapacity then
  begin
    ReallocMem(FList, NewCapacity * SizeOf(Pointer));
    FCapacity := NewCapacity;
  end;
end;

procedure CList.SetCount(NewCount: Integer);
var
  I: Integer;
begin
  if (NewCount < 0) or (NewCount > MaxListSize) then
    Error(@SListCountError, NewCount);
  if NewCount > FCapacity then
    SetCapacity(NewCount);
  if NewCount > FCount then
    FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
  else
    for I := FCount - 1 downto NewCount do
      Delete(I);
  FCount := NewCount;
end;

procedure QuickSort(SortList: PPointerList; L, R: Integer;
  SCompare: TListSortCompare);
var
  I, J: Integer;
  P, T: Pointer;
begin
  repeat
    I := L;
    J := R;
    P := SortList^[(L + R) shr 1];
    repeat
      while SCompare(SortList^[I], P) < 0 do
        Inc(I);
      while SCompare(SortList^[J], P) > 0 do
        Dec(J);
      if I <= J then
      begin
        T := SortList^[I];
        SortList^[I] := SortList^[J];
        SortList^[J] := T;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(SortList, L, J, SCompare);
    L := I;
  until I >= R;
end;

procedure CList.Sort(Compare: TListSortCompare);
begin
  if (FList <> nil) and (Count > 0) then
    QuickSort(FList, 0, Count - 1, Compare);
end;

function CList.Extract(Item: Pointer): Pointer;
var
  I: Integer;
begin
  Result := nil;
  I := IndexOf(Item);
  if I >= 0 then
  begin
    Result := Item;
    FList^[I] := nil;
    Delete(I);
    Notify(Result, lnExtracted);
  end;
end;

procedure CList.Notify(Ptr: Pointer; Action: TListNotification);
begin
end;

procedure CList.Assign(ListA: CList; AOperator: TListAssignOp; ListB: CList);
var
  I: Integer;
  LTemp, LSource: CList;
begin
  // ListB given?
  if ListB <> nil then
  begin
    LSource := ListB;
    Assign(ListA);
  end
  else
    LSource := ListA;

  // on with the show
  case AOperator of

    // 12345, 346 = 346 : only those in the new list
    laCopy:
      begin
        Clear;
        Capacity := LSource.Capacity;
        for I := 0 to LSource.Count - 1 do
          Add(LSource[I]);
      end;

    // 12345, 346 = 34 : intersection of the two lists
    laAnd:
      for I := Count - 1 downto 0 do
        if LSource.IndexOf(Items[I]) = -1 then
          Delete(I);

    // 12345, 346 = 123456 : union of the two lists
    laOr:
      for I := 0 to LSource.Count - 1 do
        if IndexOf(LSource[I]) = -1 then
          Add(LSource[I]);

    // 12345, 346 = 1256 : only those not in both lists
    laXor:
      begin
        LTemp := CList.Create; // Temp holder of 4 byte values
        try
          LTemp.Capacity := LSource.Count;
          for I := 0 to LSource.Count - 1 do
            if IndexOf(LSource[I]) = -1 then
              LTemp.Add(LSource[I]);
          for I := Count - 1 downto 0 do
            if LSource.IndexOf(Items[I]) <> -1 then
              Delete(I);
          I := Count + LTemp.Count;
          if Capacity < I then
            Capacity := I;
          for I := 0 to LTemp.Count - 1 do
            Add(LTemp[I]);
        finally
          LTemp.Free;
        end;
      end;

    // 12345, 346 = 125 : only those unique to source
    laSrcUnique:
      for I := Count - 1 downto 0 do
        if LSource.IndexOf(Items[I]) <> -1 then
          Delete(I);

    // 12345, 346 = 6 : only those unique to dest
    laDestUnique:
      begin
        LTemp := CList.Create;
        try
          LTemp.Capacity := LSource.Count;
          for I := LSource.Count - 1 downto 0 do
            if IndexOf(LSource[I]) = -1 then
              LTemp.Add(LSource[I]);
          Assign(LTemp);
        finally
          LTemp.Free;
        end;
      end;
  end;
end;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人免费网站| 日韩一区二区在线免费观看| 欧美三片在线视频观看| 精品成人一区二区三区四区| 夜夜亚洲天天久久| 国产精品18久久久久久久久久久久| 在线亚洲精品福利网址导航| 久久精子c满五个校花| 五月激情综合网| 91网站在线播放| 亚洲国产精品成人久久综合一区| 日本sm残虐另类| 欧美高清一级片在线| 亚洲日本一区二区| 成人av午夜影院| 久久女同精品一区二区| 偷拍一区二区三区四区| 99热在这里有精品免费| 国产亚洲一本大道中文在线| 麻豆一区二区三| 欧美一区二区三区免费观看视频 | 2022国产精品视频| 午夜免费久久看| 精品视频在线看| 伊人婷婷欧美激情| 色综合久久99| 亚洲视频在线一区观看| 不卡免费追剧大全电视剧网站| 亚洲精品在线一区二区| 美国毛片一区二区三区| 日韩一区二区精品在线观看| 亚洲第一搞黄网站| 欧美片网站yy| 蜜芽一区二区三区| 日韩视频一区二区三区| 久久精品99久久久| 26uuu国产电影一区二区| 国产一区二区h| 欧美激情一区二区三区蜜桃视频| 成人免费黄色大片| 亚洲日本电影在线| 欧洲精品在线观看| 日韩成人精品在线观看| 日韩一区二区高清| 国产毛片一区二区| 国产精品视频第一区| 色哟哟一区二区| 午夜亚洲福利老司机| 日韩欧美成人一区二区| 国产精品白丝av| 亚洲精品乱码久久久久| 欧美日韩在线观看一区二区| 麻豆久久久久久久| 中文字幕乱码日本亚洲一区二区 | 亚洲精选在线视频| 欧美日本视频在线| 国产高清成人在线| 一区二区三区精密机械公司| 91精品欧美综合在线观看最新| 久久精品国产久精国产| 中文字幕成人av| 欧美日韩成人在线| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 久久一日本道色综合| 99国产麻豆精品| 日韩高清在线一区| 中文字幕av一区二区三区| 91视频免费看| 狠狠色综合日日| 一二三区精品视频| 国产亚洲福利社区一区| 欧美性大战久久久久久久| 国产乱码精品一品二品| 一卡二卡欧美日韩| 中文字幕精品—区二区四季| 69av一区二区三区| 91丨九色丨国产丨porny| 美腿丝袜一区二区三区| 一区二区欧美精品| 国产情人综合久久777777| 欧美日韩成人一区| 91丝袜高跟美女视频| 国产精品一区二区91| 五月天激情综合| 亚洲伦在线观看| 欧美国产激情二区三区| 日韩一区二区三区在线视频| 在线观看国产一区二区| 国产黑丝在线一区二区三区| 青青草国产精品97视觉盛宴| 亚洲九九爱视频| 欧美国产1区2区| 欧美大片在线观看| 91精品国产手机| 欧洲视频一区二区| 色天天综合久久久久综合片| 国产麻豆9l精品三级站| 精品中文字幕一区二区| 日韩在线观看一区二区| 亚洲天堂精品视频| 日本一二三不卡| 国产午夜精品久久| 久久久久国产成人精品亚洲午夜| 欧美精品久久久久久久久老牛影院| 色狠狠av一区二区三区| av一二三不卡影片| aaa亚洲精品一二三区| 国产福利一区在线| 国产精品资源在线看| 久久97超碰国产精品超碰| 日韩二区在线观看| 丝袜亚洲另类欧美| 蜜臀99久久精品久久久久久软件| 亚洲aaa精品| 日韩av一区二区三区四区| 日韩av高清在线观看| 三级精品在线观看| 奇米精品一区二区三区在线观看一 | 久久精品视频在线看| 久久先锋影音av鲁色资源网| 日韩欧美一区二区免费| 精品国产不卡一区二区三区| 欧美成人三级电影在线| 精品粉嫩aⅴ一区二区三区四区| 欧美va天堂va视频va在线| 精品va天堂亚洲国产| 久久毛片高清国产| 国产女主播一区| 亚洲人成电影网站色mp4| 亚洲精品自拍动漫在线| 亚洲最大成人综合| 视频一区国产视频| 国产在线精品一区二区| 福利一区福利二区| 91色视频在线| 91精品久久久久久久91蜜桃 | 欧美日韩在线电影| 日韩欧美一二区| 国产精品三级av| 亚洲激情av在线| 久久精品国产久精国产爱| 国产91富婆露脸刺激对白| a美女胸又www黄视频久久| 欧美日韩中文字幕一区| 精品美女一区二区三区| 中文字幕一区二区三区乱码在线| 一区二区三区精品| 国产一区二区视频在线| 色欧美片视频在线观看| 欧美一级免费观看| 国产精品美女视频| 三级亚洲高清视频| 成人在线综合网| 91麻豆精品国产综合久久久久久 | 一区二区三区中文字幕精品精品| 免费成人在线影院| 丁香亚洲综合激情啪啪综合| 欧美三级在线视频| 久久你懂得1024| 日韩国产欧美在线观看| 99久久综合99久久综合网站| 欧美老肥妇做.爰bbww视频| 欧美激情一区三区| 日韩av电影免费观看高清完整版在线观看| 国产精品系列在线播放| 5566中文字幕一区二区电影| 中文字幕一区二区视频| 青青草精品视频| 欧美日韩在线亚洲一区蜜芽| 日本一区二区三区dvd视频在线| 亚洲国产毛片aaaaa无费看| 国产99一区视频免费| 日韩美女在线视频| 性久久久久久久久久久久| 不卡电影一区二区三区| 久久久久九九视频| 捆绑调教美女网站视频一区| 欧美四级电影在线观看| 国产精品久久久一本精品| 国产在线精品免费av| 69堂国产成人免费视频| 一区二区三区中文字幕| 99久久精品国产观看| 久久久久久久久久久电影| 日本美女一区二区三区| 欧美亚洲综合一区| 一区二区激情视频| 91免费观看在线| 国产精品女人毛片| 国产成人精品免费一区二区| 精品国产乱码久久久久久蜜臀| 婷婷夜色潮精品综合在线| 欧美亚洲免费在线一区| 一片黄亚洲嫩模| 91成人在线精品| 亚洲一区二区三区在线| 在线中文字幕不卡| 亚洲成人动漫精品| 欧美一区二区成人6969| 午夜不卡av免费|