Delphi泛型库DGL中的接口的声明

来源:互联网 发布:手机数据.修复器 编辑:程序博客网 时间:2024/05/16 05:04

                                                 Delphi泛型库DGL中的接口的声明
                                                        HouSisong@GMail.com

tag:delphi泛型库,DGL,泛型,接口声明

DGL库下载  安装方法:将库解压到一个目录,然后在Delphi中添加搜索路径

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_