OfficeVba/utils/collection_delete.tsf

75 lines
1.7 KiB
Plaintext

Type Collection = class
public
Function Create();
Function AddCollection(obj, name);
Function RemoveCollection(index);
Function SetIgnoreCase(value);
Function GetCount();
Function CalNewName(prefix);
Function Operator[](index);
private
name_collection_;
index_collection_;
name_index_;
ignorecase_; // 是否启用大小写无关
End;
// ============== 实现 ================= //
Function Collection.Create();
Begin
name_collection_ := array();
index_collection_ := array();
name_index_ := array();
ignorecase_ := false;
End;
Function Collection.AddCollection(obj, name);
Begin
name_collection_[ignorecase_ ? lowercase(name) : name] := obj;
index := length(index_collection_) + 1;
index_collection_[index] := obj;
name_index_[index] := name;
name_index_[name] := index;
End;
Function Collection.RemoveCollection(index);
Begin
arr1 := array(index : nil);
arr2 := array(name_index_[index] : nil);
reindex(index_collection_, arr1);
reindex(name_collection_, arr2);
reindex(name_index_, arr1);
reindex(name_index_, arr2);
if ifnumber(index) then
for k, v in index_collection_ do
if k > index then reindex(index_collection_, array(k : k - 1));
End;
Function Collection.SetIgnoreCase(value);
Begin
ignorecase_ := value;
End;
Function Collection.GetCount();
Begin
return length(name_collection_);
End;
Function Collection.CalNewName(prefix);
Begin
len := length(name_collection_) + 1;
name := prefix $ len;
while name in name_collection_ do
name := prefix $ ++len;
return name;
End;
Function Operator Collection.[](index);
Begin
if ifnumber(index) then return index_collection_[index];
return name_collection_[ignorecase_ ? lowercase(index) : index];
End;