-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdtinybsearch_generic.pas
67 lines (59 loc) · 1.99 KB
/
dtinybsearch_generic.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
unit dtinybsearch_generic;
{$MODE FPC}
{$MODESWITCH DEFAULTPARAMETERS}
{$MODESWITCH OUT}
{$MODESWITCH RESULT}
{$MODESWITCH TYPEHELPERS}
{$IF FPC_FULLVERSION < 30101} {$ERROR Needs fpc version at least 3.2.0} {$ENDIF}
interface
generic function bsearch<TContainter, T>(const x: T; const V: TContainter): PtrUInt; overload;
generic function bsearch<T>(const x: T; const V: array of T): PtrUInt; overload;
implementation
generic function bsearch<TContainter, T>(const x: T; const V: TContainter): PtrUInt;
var
min, max, mid: PtrInt;
begin
min := 0;
max := V.Count;
while min <= max do begin
mid := min + (max - min) div 2;
{**} if x = v[mid] then Exit(mid)
else if x < v[mid] then max := mid - 1
else min := mid + 1;
end;
Exit(High(PtrUInt));
end;
generic function bsearch<T>(const x: T; const V: array of T): PtrUInt;
var
min, max, mid: PtrInt;
begin
min := 0;
max := Length(V);
while min <= max do begin
mid := min + (max - min) div 2;
{**} if x = v[mid] then Exit(mid)
else if x < v[mid] then max := mid - 1
else min := mid + 1;
end;
Exit(High(PtrUInt));
end;
// var
// v: array of PtrInt;
// i: PtrInt;
// begin
// // @ [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
// v := [0, 1, 2, 3, 5, 6, 7, 10, 11, 12, 13, 15, 16];
//
// Assert(specialize bsearch<PtrInt>( 0, v) = 0); // @ [ 0]
// Assert(specialize bsearch<PtrInt>(10, v) = 7); // @ [ 7]
// Assert(specialize bsearch<PtrInt>(11, v) = 8); // @ [ 8]
// Assert(specialize bsearch<PtrInt>(15, v) = 11); // @ [11]
// Assert(specialize bsearch<PtrInt>(16, v) = 12); // @ [12]
// Assert(specialize bsearch<PtrInt>(-3, v) = High(PtrUInt)); // not found
// Assert(specialize bsearch<PtrInt>(18, v) = High(PtrUInt)); // not found
// Assert(specialize bsearch<PtrInt>( 8, v) = High(PtrUInt)); // not found
// Assert(specialize bsearch<PtrInt>( 9, v) = High(PtrUInt)); // not found
// for i in v do
// Assert(v[specialize bsearch<PtrInt>(i, v)] = i);
// end.
end.