利用nil新特性进行性能优化
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
type TSOfficeContainer = class
|
||||
public
|
||||
function Create(arr: array of string);
|
||||
function Set(data: any): boolean; // 设置data数据
|
||||
function Add(data: any): boolean;
|
||||
function Append(data: any): boolean;
|
||||
function Insert(data: any): boolean;
|
||||
function Get(name: string; index: integer);overload;
|
||||
function Get(): array of tslobj;overload;
|
||||
|
||||
private
|
||||
function GetBucketObj(str: string): LinkList;
|
||||
|
||||
private
|
||||
bucket_: array of LinkList;
|
||||
child_: array of string;
|
||||
current_index_: integer;
|
||||
last_index_: integer;
|
||||
end;
|
||||
|
||||
type LinkList = class
|
||||
public
|
||||
function Create(name: string);
|
||||
function Set(data: any);
|
||||
function Add(data: any);
|
||||
function Name(): string;
|
||||
function Size(): integer;
|
||||
function First(): Node;
|
||||
|
||||
private
|
||||
head_: Node;
|
||||
tail_: Node;
|
||||
size_: integer;
|
||||
name_: string;
|
||||
end;
|
||||
|
||||
type Node = class
|
||||
public
|
||||
data;
|
||||
next;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Create(arr: array of string);
|
||||
begin
|
||||
bucket_ := array();
|
||||
child_ := array();
|
||||
for str,v in arr do
|
||||
begin
|
||||
child_[str] := v[0];
|
||||
last_index_ := v[0];
|
||||
end
|
||||
current_index_ := -1;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Set(data: any): boolean;
|
||||
begin
|
||||
obj := {self.}GetBucketObj(data.ElementName);
|
||||
if ifnil(obj) then return false;
|
||||
obj.Set(data);
|
||||
return true;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Add(data: any): boolean;
|
||||
begin
|
||||
obj := {self.}GetBucketObj(data.ElementName);
|
||||
if ifnil(obj) then return false;
|
||||
obj.Add(data);
|
||||
return true;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Append(data: any): boolean;
|
||||
begin
|
||||
ind := child_[data.ElementName];
|
||||
if ifnil(ind) or ind < current_index_ then
|
||||
begin
|
||||
obj := bucket_[current_index_];
|
||||
if ifObj(obj) and obj.Name() = data.ElementName then obj.Add(data);
|
||||
else begin
|
||||
obj := new LinkList(data.ElementName);
|
||||
current_index_ := current_index_ > last_index_ ? current_index_ + 1 : last_index_ + 1;
|
||||
bucket_[current_index_] := obj;
|
||||
obj.Add(data);
|
||||
end
|
||||
end
|
||||
else if ind > current_index_ then
|
||||
begin
|
||||
obj := new LinkList(data.ElementName);
|
||||
bucket_[ind] := obj;
|
||||
obj.Add(data);
|
||||
current_index_ := ind;
|
||||
end
|
||||
else if ind = current_index_ then
|
||||
begin
|
||||
obj := bucket_[ind];
|
||||
obj.Add(data);
|
||||
end
|
||||
return true;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Insert(data: any): boolean;
|
||||
begin
|
||||
i := last_index_ + 1;
|
||||
while i <= current_index_ do
|
||||
begin
|
||||
obj := bucket_[i];
|
||||
if ifObj(obj) and obj.Name() = data.ElementName then
|
||||
begin
|
||||
obj.Add(data);
|
||||
return;
|
||||
end
|
||||
i++;
|
||||
end
|
||||
return ifnil(child_[data.ElementName]) ? {self.}Append(data) : {self.}Add(data);
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Get(): array of tslobj;overload;
|
||||
begin
|
||||
arr := array();
|
||||
for i:=0 to current_index_ do
|
||||
begin
|
||||
obj := bucket_[i];
|
||||
if ifObj(obj) then
|
||||
begin
|
||||
node := obj.First();
|
||||
while ifObj(node) do
|
||||
begin
|
||||
arr[length(arr)] := node.data;
|
||||
node := node.next;
|
||||
end
|
||||
end
|
||||
end
|
||||
return arr;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.Get(name: string; index: integer);overload;
|
||||
begin
|
||||
ind := child_[name];
|
||||
arr := array();
|
||||
obj := bucket_[ind];
|
||||
if ifObj(obj) then
|
||||
begin
|
||||
node := obj.First();
|
||||
while ifObj(node) do
|
||||
begin
|
||||
arr[length(arr)] := node.data;
|
||||
index--;
|
||||
if index = -1 then return node.data;
|
||||
node := node.next;
|
||||
end
|
||||
end
|
||||
i := last_index_ + 1;
|
||||
while i <= current_index_ do
|
||||
begin
|
||||
obj := bucket_[i];
|
||||
if ifObj(obj) and obj.Name() = name then
|
||||
begin
|
||||
node := obj.First();
|
||||
while ifObj(node) do
|
||||
begin
|
||||
arr[length(arr)] := node.data;
|
||||
index--;
|
||||
if index = -1 then return node.data;
|
||||
node := node.next;
|
||||
end
|
||||
end
|
||||
i++;
|
||||
end
|
||||
return arr;
|
||||
end;
|
||||
|
||||
function TSOfficeContainer.GetBucketObj(str: string): LinkList;
|
||||
begin
|
||||
ind := child_[str];
|
||||
if ifnil(ind) then return nil;
|
||||
obj := bucket_[ind];
|
||||
if not ifObj(obj) then
|
||||
begin
|
||||
obj := new LinkList(str);
|
||||
bucket_[ind] := obj;
|
||||
if ind > current_index_ then current_index_ := ind;
|
||||
end
|
||||
return obj;
|
||||
end;
|
||||
|
||||
function LinkList.Create(name: string);
|
||||
begin
|
||||
head_ := new Node();
|
||||
tail_ := head_;
|
||||
size_ := 0;
|
||||
name_ := name;
|
||||
end;
|
||||
|
||||
function LinkList.Set(data: any)
|
||||
begin
|
||||
node := new Node();
|
||||
node.data := data;
|
||||
head_.next := node;
|
||||
tail_ := node;
|
||||
end;
|
||||
|
||||
function LinkList.Add(data: any)
|
||||
begin
|
||||
node := new Node();
|
||||
node.data := data;
|
||||
tail_.next := node;
|
||||
tail_ := node;
|
||||
size_++;
|
||||
end;
|
||||
|
||||
function LinkList.Name(): string;
|
||||
begin
|
||||
return name_;
|
||||
end;
|
||||
|
||||
function LinkList.Size(): integer;
|
||||
begin
|
||||
return size_;
|
||||
end;
|
||||
|
||||
function LinkList.First(): Node;
|
||||
begin
|
||||
return head_ = tail_ ? nil : head_.next;
|
||||
end;
|
||||
Reference in New Issue
Block a user