224 lines
4.9 KiB
Plaintext
224 lines
4.9 KiB
Plaintext
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;
|