-
Notifications
You must be signed in to change notification settings - Fork 7
/
_DGL_Point.pas
115 lines (92 loc) · 2.96 KB
/
_DGL_Point.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(*
* DGL(The Delphi Generic Library)
*
* Copyright (c) 2004
* HouSisong@gmail.com
*
* This material is provided "as is", with absolutely no warranty expressed
* or implied. Any use is at your own risk.
*
* Permission to use or copy this software for any purpose is hereby granted
* without fee, provided the above notices are retained on all copies.
* Permission to modify the code and to distribute modified code is granted,
* provided the above notices are retained, and a notice that the code was
* modified is included with the above copyright notice.
*
*)
//------------------------------------------------------------------------------
// 例子 :值语义的TPoint结构(Record)的容器
// 具现化的TPoint类型的声明
// Create by HouSisong, 2004.09.04
//------------------------------------------------------------------------------
unit _DGL_Point;
interface
uses
SysUtils;
//结构的容器的声明模版
{$I DGLCfg.inc_h}
type
TPoint = record // object
x : integer;
y : integer;
end;
_ValueType = TPoint;
const
_NULL_Value:_ValueType=(x:(0);y:(0));
function _HashValue(const Value:_ValueType) : Cardinal;{$ifdef _DGL_Inline} inline; {$endif}//Hash函数
{$define _DGL_Compare} //是否需要比较函数,可选
function _IsEqual(const a,b :_ValueType):boolean;{$ifdef _DGL_Inline} inline; {$endif} //result:=(a=b);
function _IsLess(const a,b :_ValueType):boolean;{$ifdef _DGL_Inline} inline; {$endif} //result:=(a<b); 默认排序准则
{$I DGL.inc_h}
type
IPointIterator = _IIterator;
IPointContainer = _IContainer;
IPointSerialContainer = _ISerialContainer;
IPointVector = _IVector;
IPointList = _IList;
IPointDeque = _IDeque;
IPointStack = _IStack;
IPointQueue = _IQueue;
IPointPriorityQueue = _IPriorityQueue;
IPointSet = _ISet;
IPointMultiSet = _IMultiSet;
TPointPointerItBox = _TPointerItBox_Obj;
TPointVector = _TVector;
IPointVectorIterator = _IVectorIterator; //速度比_IIterator稍快一点:)
TPointDeque = _TDeque;
TPointList = _TList;
TPointStack = _TStack;
TPointQueue = _TQueue;
TPointPriorityQueue = _TPriorityQueue;
TPointHashSet = _THashSet;
TPointHashMuitiSet = _THashMultiSet;
//
IPointMapIterator = _IMapIterator;
IPointMap = _IMap;
IPointMultiMap = _IMultiMap;
TPointHashMap = _THashMap;
TPointHashMultiMap = _THashMultiMap;
function Point(a,b:integer):TPoint;
implementation
{$I DGL.inc_pas}
function _HashValue(const Value :_ValueType):Cardinal;
begin
result:=Cardinal(Value.x)*37+Cardinal(Value.y)*9;
end;
function Point(a,b:integer):TPoint;
begin
result.x:=a;
result.y:=b;
end;
function _IsEqual(const a,b :_ValueType):boolean;
begin
result:=(a.x=b.x) and (a.y=b.y);
end;
function _IsLess(const a,b :_ValueType):boolean;
begin
if (a.x=b.x) then
result:=a.y<b.y
else
result:=a.x<b.x;
end;
end.