DGL库中的接口(interface)的声明文件DGLIntf.inc_h:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/------------------------------------------------------------------------------
// Copyright (c) 2004
// Delhi泛型库--DGL(The Delphi Generic Library)
// Author: HouSisong
//------------------------------------------------------------------------------
// DGL库中的接口(interface)的声明
// Create by HouSisong, 2004.08.31
// LastUpdate by HouSisong, 2005.10.13
//------------------------------------------------------------------------------
//DGLIntf.inc_h
{$ifndef __DGLIntf_inc_h_}
{$define __DGLIntf_inc_h_}
type
//迭代器(iterator)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 用来遍历容器里面的元素
// 主要方法:Value属性:用来读写迭代器引用的值
// IsEqual方法:判断两个迭代器是否指向同一个位置
// Distance方法: 返回自身位置减去传入的迭代器指向位置的差值
// Assign方法:使自身与传入的迭代器指向同一个容器和引用位置
// Next方法:指向下一个位置
// Previous方法:指向上一个位置
// Clone方法:创建一个新的迭代器,与自己指向同一个位置
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// Items属性: 根据偏移量快速的访问值(对于随机迭代器才有常数时间)
// 使用方式:
// 注意事项: 如果实现了单向链表,则其迭代器不会实现Previous方法,会触发异常
// Distance方法在某些迭代器中的实现 时间复杂度可能为O(n);
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
//迭代器分成_IIterator结构和_DGL_TObjIterator类来实现是为了优化用纯接口(+类实现)实现迭代器的创建和销毁的开销
//实际测试中速度大幅提升! 2005.10.13
_DGL_TObjIterator = class;
_DGL_TObjIteratorClass = class of _DGL_TObjIterator;
_IIterator = object
private
_ObjIteratorClass : _DGL_TObjIteratorClass;
_Data0 : integer;
_Data1 : integer;
_Data2 : integer;
//如果库有需要可以继续扩展
//_InfData : IInterface;
//_DataArray : array[0..2] of integer;
public
procedure SetIteratorNil();
procedure SetValue(const aValue: _ValueType);
function GetValue(): _ValueType;
function GetNextValue(const Step:integer): _ValueType;
procedure SetNextValue(const Step:integer;const aValue:_ValueType);
property Value: _ValueType read GetValue write SetValue;
property NextValue[const Index:integer]: _ValueType read GetNextValue write SetNextValue;
function IsEqual(const Iterator:_IIterator):boolean;
function Distance(const Iterator:_IIterator):integer;
procedure Assign (const Iterator:_IIterator);
procedure Next();overload;
procedure Next(const Step:integer);overload;
procedure Previous();
function Clone():_IIterator; overload;
function Clone(const NextStep:integer):_IIterator;overload;
end;
_DGL_TObjIterator = class(TObject)
public
class procedure SetValue(const SelfItData:_IIterator;const Value: _ValueType); virtual; abstract;
class function GetValue(const SelfItData:_IIterator): _ValueType; virtual; abstract;
class function GetNextValue(const SelfItData:_IIterator;const Step:integer): _ValueType; virtual; abstract;
class procedure SetNextValue(const SelfItData:_IIterator;const Step:integer;const Value:_ValueType); virtual; abstract;
class function IsEqual(const SelfItData:_IIterator;const Iterator:_IIterator):boolean; virtual; abstract;
class function Distance(const SelfItData:_IIterator;const Iterator:_IIterator):integer; virtual; abstract;
class procedure Assign (var SelfItData:_IIterator;const Iterator:_IIterator); virtual; abstract;
class procedure Next(var SelfItData:_IIterator);overload; virtual; abstract;
class procedure Next(var SelfItData:_IIterator;const Step:integer);overload; virtual; abstract;
class procedure Previous(var SelfItData:_IIterator); virtual; abstract;
class function Clone(const SelfItData:_IIterator):_IIterator;overload; virtual; abstract;
class function Clone(const SelfItData:_IIterator;const NextStep:integer):_IIterator;overload; virtual; abstract;
class function map_GetKey(const SelfItData:_IIterator): _KeyType; virtual; abstract;
end;
//容器(Container)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 用来保存和组织多个数据,是抽象出的存储概念,和实现无关
// 主要方法:ItBegin方法:返回指向容器里第一个元素的 迭代器
// ItEnd方法:返回指向容器里最后一个元素的后面一个位置的 迭代器
// Clear方法:清空容器中的所有数据
// Size方法:容器中的元素个数
// IsEmpty方法:容器是否为空,返回值等价于(0=Size());
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// Erase方法: 删除容器中值等于参数Value的元素,返回删除的元素个数
// Erase方法: 从容器中删除迭代器指向的元素
// Insert方法: 在容器指定位置插入一个或多个元素
// Assign方法: 整个容器清空重新赋值
// Clone方法:创建一个新的容器,并拥有和自身一样的元素
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IContainer = interface
function GetSelfObj():TObject;
function ItBegin(): _IIterator;
function ItEnd(): _IIterator;
procedure Clear();
function Size(): Integer;
function IsEmpty(): Boolean;
function EraseValue(const Value:_ValueType):integer; overload;
procedure Erase(const ItPos:_IIterator); overload;
procedure Erase(const ItBegin,ItEnd: _IIterator); overload;
procedure Insert(const Value:_ValueType); overload;
procedure Insert(const ItPos:_IIterator;const Value:_ValueType); overload;
procedure Insert(const ItPos:_IIterator;const num:integer;const Value:_ValueType); overload;
procedure Insert(const ItPos:_IIterator;const ItBegin,ItEnd:_IIterator);overload;
procedure Assign(const num:integer;const Value: _ValueType);overload;
procedure Assign(const ItBegin,ItEnd:_IIterator);overload;
function Clone():_IContainer;
end;
//序列容器(SerialContainer)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 元素按顺序储存的容器
// 主要方法:(参见_IContainer)
// PushBack方法:在容器后部插入一个或多个元素
// PopBack方法: 弹出最后一个元素
// Back方法: 返回最后一个元素
// PushFront方法:在容器的最前面插入一个元素
// PopFront方法: 弹出第一个元素
// Front方法: 返回第一个元素
// IsEquals方法:判断两个容器中的元素是否完全相等
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.09.09
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_ISerialContainer = interface(_IContainer)
procedure PushBack(const Value: _ValueType); overload;
procedure PushBack(const num:integer;Value: _ValueType); overload;
procedure PushBack(const ItBegin,ItEnd: _IIterator); overload;
procedure PopBack();
function Back():_ValueType;
procedure PushFront(const Value: _ValueType);overload ;
procedure PushFront(const num:integer;Value: _ValueType); overload;
procedure PushFront(const ItBegin,ItEnd: _IIterator); overload;
procedure PopFront();
function Front():_ValueType;
function IsEquals(const AContainer: _IContainer): Boolean;
procedure Resize(const num:integer); overload;
procedure Resize(const num:integer;const Value:_ValueType); overload;
end;
//向量(Vector)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 用线性的内存空间(数组)来组织数据,容器的一个具体实现
// 主要方法:IndexOf方法:返回元素在容器中的位置
// Items属性:以序号的方式快速的访问容器中的元素,时间复杂度O(1)
// Reserve方法: 容器预留一些空间(减少动态分配)
// Resize方法: 改变容器大小
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IVector = interface(_ISerialContainer)
function GetItemValue(const Index: Integer): _ValueType;
procedure SetItemValue(const Index: Integer;const Value: _ValueType);
function IndexOf(const Value: _ValueType): Integer;
procedure InsertByIndex(const Index: Integer;const Value: _ValueType);
function NewIterator(const Index: Integer):_IIterator;
property Items[const Index: Integer]: _ValueType read GetItemValue write SetItemValue;
procedure Reserve(const ReserveSize: integer);
procedure EraseByIndex(const Index: integer); overload;
end;
//链表(List)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 数据以数据接点串连的方式组织,容器的一个具体实现
// 主要方法:Unique方法:若相邻元素相同,只留下一个
// Splice方法:将AContainer内的元素转移到自己的Pos处
// Merge方法: 将AContainer内的已序元素转移到已序的自己,并且自己仍保持有序
// Reverse方法: 将元素反序
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IList = interface(_ISerialContainer)
procedure Unique();
procedure Splice(const ItPos:_IIterator; AContainer:_IList); overload; //全部转移
procedure Splice(const ItPos:_IIterator; AContainer:_IList;const ACItPos:_IIterator); overload;//转移ACItPos一个
procedure Splice(const ItPos:_IIterator; AContainer:_IList;const ACItBegin,ACItEnd:_IIterator); overload;
//procedure Merge(AContainer:_IList);
procedure Reverse();
//todo: procedure Unique(const Op:TBoolOP1);
//todo: procedure Sort();
//todo: procedure Sort(const Op:TBoolOP1);
//todo: procedure Merge(AContainer:_IList;const Op:TBoolOP1);
end;
//队列(Deque)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 与Vector相仿并能够在前端也快速插入和删除元素,容器的一个具体实现
// 主要方法:
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IDeque = interface(_IVector)
end;
//对堆栈(Stack)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 容器配接器的一种,一端开口,先进后出队列
// 主要方法:Push方法:压入一个元素
// Pop方法:弹出元素
// Top方法:返回开口处的当前值
// Clear方法:清空容器中的数据
// Size方法:返回容器中的元素个数
// IsEmpty方法:判断容器是否为空
// IsEquals方法:判断两个容器中的元素是否完全相等
// Clone方法:创建一个新的容器,并拥有和自身一样的元素
// Assign方法: 整个容器清空重新赋值
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IStack = interface
function GetSelfObj():TObject;
procedure Push(const Value: _ValueType);
procedure Pop();
function Top(): _ValueType;
procedure Clear();
function Size(): Integer;
function IsEmpty(): Boolean;
function IsEquals(const AContainer: _IStack): Boolean;
function Clone():_IStack;
procedure Assign(const num:integer;const Value: _ValueType);overload;
procedure Assign(const ItBegin,ItEnd:_IIterator);overload;
end;
//双端队列(Queue)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 容器配接器的一种,两端开口
// 主要方法:Push方法:在容器后边压入一个元素
// Pop方法:弹出最前面一个元素
// Back方法:返回最后面元素的当前值
// Front方法:返回最前面元素的当前值
// Clear方法:清空容器中的数据
// Size方法:返回容器中的元素个数
// IsEmpty方法:判断容器是否为空
// IsEquals方法:判断两个容器中的元素是否完全相等
// Clone方法:创建一个新的容器,并拥有和自身一样的元素
// Assign方法: 整个容器清空重新赋值
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.08.31
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IQueue = interface
function GetSelfObj():TObject;
procedure Push(const Value: _ValueType);
procedure Pop();
function Front(): _ValueType;
function Back(): _ValueType;
procedure Clear();
function Size(): Integer;
function IsEmpty(): Boolean;
function IsEquals(const AContainer: _IQueue): Boolean;
function Clone():_IQueue;
procedure Assign(const num:integer;const Value: _ValueType);overload;
procedure Assign(const ItBegin,ItEnd:_IIterator);overload;
end;
//优先级队列(PriorityQueue)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 容器配接器的一种
// 主要方法:Push方法:向容器中压入一个元素
// Pop方法:弹出最优先的一个元素
// Top方法:返回最优先的值
// Clear方法:清空容器中的数据
// Size方法:返回容器中的元素个数
// IsEmpty方法:判断容器是否为空
// IsEquals方法:判断两个容器中的元素是否完全相等
// Clone方法:创建一个新的容器,并拥有和自身一样的元素
// Assign方法: 整个容器清空重新赋值
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2005.03.26
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
_IPriorityQueue = interface
function GetSelfObj():TObject;
procedure Push(const Value: _ValueType);
procedure Pop();
function Top(): _ValueType;
procedure Clear();
function Size(): Integer;
function IsEmpty(): Boolean;
function IsEquals(const AContainer: _IPriorityQueue): Boolean;
function Clone():_IPriorityQueue;
procedure Assign(const num:integer;const Value: _ValueType);overload;
procedure Assign(const ItBegin,ItEnd:_IIterator);overload;
end;
//Set,MultiSet的统一说明
//----------------------------------------------------------------------------
// 作用描述: 元素集合 (Set不允许有重复元素,MultiSet允许有重复元素)
// 主要方法:(参见_IContainer的说明)
// Count方法: 统计某元素的个数
// Find方法: 查找某个元素的第一次出现位置
// LowerBound方法: 返回某值的第一个可安插位置
// UpperBound方法: 返回某值的最后一个可安插位置
// EqualRange方法: 返回某值的可安插的第一个和最后一个位置
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.09.08
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_ISet = interface(_IContainer)
function Count(const Value:_ValueType):integer;
function Find(const Value:_ValueType):_IIterator;
function LowerBound(const Value:_ValueType):_IIterator;
function UpperBound(const Value:_ValueType):_IIterator;
procedure EqualRange(const Value:_ValueType;out ItBegin,ItEnd:_IIterator);
end;
_IMultiSet = interface(_ISet)
end;
//Map迭代器(Map Iterator)的统一说明
//----------------------------------------------------------------------------
// 作用描述: 用来遍历map容器里面的元素
// 主要方法:(参见对迭代器的统一说明)
// Key属性:用来访问(只读)迭代器引用的键值
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.09.09
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IMapIterator =object(_IIterator)
function GetKey(): _KeyType;
property Key: _KeyType read GetKey;
end;
//Map,MultiMap的统一说明
//----------------------------------------------------------------------------
// 作用描述: 键值/实值 映射 (Map不允许有键值重复,MultiMap允许有键值重复)
// 主要方法:ItBegin方法:返回指向容器里第一个元素的 迭代器
// ItEnd方法:返回指向容器里最后一个元素的后面一个位置的 迭代器
// Clear方法:清空容器中的所有数据
// Size方法:容器中的元素个数
// IsEmpty方法:容器是否为空,返回值等价于(0=Size());
// IsEquals方法:判断两个容器中的元素是否完全相等
// GetSelfObj方法:返回接口存在的原始对象(self指针),内部使用
// Erase方法: 删除容器中值等于参数Value的元素,返回删除的元素个数
// Erase方法: 从容器中删除迭代器指向的元素
// Insert方法: 在容器指定位置插入一个或多个元素
// Assign方法: 整个容器清空重新赋值
// Clone方法:创建一个新的容器,并拥有和自身一样的元素
// Count方法: 统计某键值的个数
// Find方法: 查找某键值的第一次出现位置
// LowerBound方法: 返回某键值的第一个可安插位置
// UpperBound方法: 返回某键值的最后一个可安插位置
// EqualRange方法: 返回某键值的可安插的第一个和最后一个位置
// Items属性:以Key为序号的方式访问容器中的元素
// 使用方式:
// 注意事项:
// 作 者: HouSisong ,2004.09.09
// [相关资料]: (如果有的话)
// [维护记录]: (类发布后,其修改需要记录下来:修改人、时间、主要原因内容)
//----------------------------------------------------------------------------
_IMap = interface
function GetSelfObj():TObject;
function GetItemValue(const Key: _KeyType): _ValueType;
procedure SetItemValue(const Key: _KeyType;const Value: _ValueType);
function ItBegin(): _IMapIterator;
function ItEnd(): _IMapIterator;
procedure Clear();
function Size(): Integer;
function IsEmpty(): Boolean;
function EraseValue(const Value:_ValueType):integer; overload;
function EraseValue(const Key:_KeyType;const Value:_ValueType):integer; overload;
function EraseKey(const Key:_KeyType):integer; overload;
procedure Erase(const ItPos:_IMapIterator); overload;
procedure Erase(const ItBegin,ItEnd: _IMapIterator); overload;
procedure Insert(const Key:_KeyType;const Value:_ValueType); overload;
procedure Insert(const ItPos:_IMapIterator;const Key:_KeyType;const Value:_ValueType); overload;
procedure Insert(const ItPos:_IMapIterator;const ItBegin,ItEnd:_IMapIterator);overload;
procedure Insert(const ItPos:_IMapIterator;const num:integer;const Key:_KeyType;const Value:_ValueType); overload;
procedure Assign(const ItBegin,ItEnd:_IMapIterator);overload;
procedure Assign(const num:integer;const Key:_KeyType;const Value: _ValueType);overload;
function Count(const Key:_KeyType):integer;
function Find(const Key:_KeyType):_IMapIterator;
function LowerBound(const Key:_KeyType):_IMapIterator;
function UpperBound(const Key:_KeyType):_IMapIterator;
procedure EqualRange(const Key:_KeyType;out ItBegin,ItEnd:_IMapIterator);
function Clone():_IMap;
property Items[const Key:_KeyType]: _ValueType read GetItemValue write SetItemValue;
end;
_IMultiMap = interface(_IMap)
end;
{$endif } // __DGLIntf_inc_h_