在Delphi中實現類型安全的容器
Delhi泛型庫--DGL(The Delphi Generic Library)簡介
by HouSisong@263.net,2004.09.12
最近都在使用Delphi,但Delphi中的容器和算法實在太缺乏了,又存在很多不一致,使用也很不方便。
在構造一些容器和算法的時候,總是懷念C++的泛型和STL;所以就嘗試在Delphi中編寫泛型代碼;
其它現有的Deplhi容器和算法庫實現中,主要的實現途徑有利用Delphi中的array of const(相當于弱類型,然後做case);或者建立一套類體系作爲容器中的元素(主要使用虛函數機制,如:左輕侯有篇文章也談到過; 一般簡單類型需要做打包拆包);還有的實現是針對TObject、IInterface、String等做多套代碼實現(如:DCL庫); 但他們相對于C++的STL來說缺陷也很明顯,類型不安全,速度慢,代碼重複;
經過一些嘗試,我有了一個部分實現的途徑;
實現原型舉例:
「模版」類的聲明文件:UnitClassT.inc_h
//<template:_T,_T_IsEqual>
type TTest = class (TObject ) private a : _T ;
public function GetA ():_T ;
fucntion IsEqual (ATest :TTest ):bool ;
end ;
「模版」類的實現文件:UnitClassT.inc_pas
function TTest.GetA (): _T ;
begin result :=a ;
end ;
fucntion IsEqual (ATest :TTest ):bool ;
begin result :=_T_IsEqual (a ,ATest.a );
end ;
使用的時候對「模版」類做pointer的特化
unit UnitTestPointer ;
interface type _T = Pointer ;
function _T_IsEqual (cosnt a ,b :_T );
{
$I UnitClassT.inc_h
}type TTestPointer = TTest ;
// TTestPointer定義給外部使用
implementation
{
$I UnitClassT.inc_pas
}function _T_IsEqual (cosnt a ,b :_T );
begin result :=(a =b );
end ;
end.
使用的時候對「模版」類做double的特化
unit UnitTestDouble ;
interface type _T = double ;
{
$I UnitClassT.inc_h
}type TTestFloat = TTest ;
// TTestFloat定義給外部使用
function _T_IsEqual (cosnt a ,b :_T );
implementation function _T_IsEqual (cosnt a ,b :_T );
begin result :=(a =b );
end ;
{
$I UnitClassT.inc_pas
}end.
(將類分成兩個部分的原因是這樣可以$Include更多的文件,形成組合;感覺象C++ )
這裏只對一個_T類型做了參數化,當然還可以對多個類型做特化;甚至參數化一些常量和其他函數(比如Hash值函數),利用$define\$ifdef進行條件編譯(主要用來優化或特殊處理);
用這種方法再加上接口(Interface,不是必須);在Delphi中就可以實現通用的容器和算法庫了,而且類型安全,沒有重複代碼;
我已經有了一個簡版的Delphi通用容器庫了
(庫的組件還很少,一個人的力量有限; 庫已經有vector\list\queue等,能夠支持基本類型(包括類的引用語義)、類(class)的值語義(一般Delphi中不習慣使用類的值語義,所以不建議使用),結構(record)等其它類型,並且類型安全, 沒有重複代碼)
感覺就是STL的翻版,哈哈
庫現在包括以下組件:
<object>
_IIterator 容器叠代器
_IMapIterator Map叠代器
(PointerBox函數可以將原生指針包裝成一個與庫兼容的叠代器)
<接口interface>
_ICollection 容器接口
_ISerialContainer 序列容器的接口
_IVector 向量接口(容器的一種)
_IList 鏈表接口(容器的一種)
_IDeque 隊列接口(容器的一種)
_IStack 堆棧接口(一種容器配接器)
_IQueue 雙端隊列接口(一種容器配接器)
_IPriorityQueue 優先級隊列
_ISet Set接口
_IMultiSet MultiSet接口
_IMap Map接口
_IMultiMap MultiMap接口
<類class>
_TAlgorithms 算法類(包括:拷貝、替換、刪除、排序、搜索等算法)
_TAbstractContainer 容器虛基類
_TAbstractSerialContainer 序列容器類的虛基類
_TAbstractSet Set(MultiSet)的抽象虛基類
_TAbstractMap Map(MultiMap)的抽象虛基類
_TVector 向量實現類
_TList 鏈表List的一個實現
_TDeque 隊列Deque的一個實現
_TStack 堆棧Stack
_TQueue 雙端隊列Queue
(_THashTableBase Hash表(庫內部使用))
_THashSet 用Hash表實現的Set
_THashMultiSet 用Hash表實現的MultiSet
_THashMap 用Hash表實現的Map
_THashMultiMap 用Hash表實現的MultiMap