Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7696 akron1 1
(*
6755 akron1 2
    Copyright 2016 Anton Krotov
3
 
4
    This program is free software: you can redistribute it and/or modify
5
    it under the terms of the GNU Lesser General Public License as published by
6
    the Free Software Foundation, either version 3 of the License, or
7
    (at your option) any later version.
8
 
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU Lesser General Public License for more details.
13
 
14
    You should have received a copy of the GNU Lesser General Public License
15
    along with this program.  If not, see .
16
*)
17
 
18
MODULE Vector;
19
 
20
 
21
IMPORT sys := SYSTEM, K := KOSAPI;
22
 
23
 
24
TYPE
25
 
26
  DESC_VECTOR = RECORD
27
 
28
    data   : INTEGER;
29
    count  : INTEGER;
30
    size   : INTEGER
31
 
32
  END;
33
 
34
  VECTOR* = POINTER TO DESC_VECTOR;
35
 
36
  ANYREC* = RECORD END;
37
 
38
  ANYPTR* = POINTER TO ANYREC;
39
 
40
  DESTRUCTOR* = PROCEDURE (VAR ptr: ANYPTR);
41
 
42
 
43
PROCEDURE count* (vector: VECTOR): INTEGER;
44
BEGIN
45
  ASSERT(vector # NIL)
46
  RETURN vector.count
47
END count;
48
 
49
 
50
PROCEDURE push* (vector: VECTOR; value: ANYPTR);
51
BEGIN
52
  ASSERT(vector # NIL);
53
  IF vector.count = vector.size THEN
54
    vector.data := K.realloc(vector.data, (vector.size + 1024) * 4);
55
    ASSERT(vector.data # 0);
56
    vector.size := vector.size + 1024
57
  END;
58
  sys.PUT(vector.data + vector.count * 4, value);
59
  INC(vector.count)
60
END push;
61
 
62
 
63
PROCEDURE get* (vector: VECTOR; idx: INTEGER): ANYPTR;
64
VAR res: ANYPTR;
65
BEGIN
66
  ASSERT(vector # NIL);
67
  ASSERT( (0 <= idx) & (idx < vector.count) );
68
  sys.GET(vector.data + idx * 4, res)
69
  RETURN res
70
END get;
71
 
72
 
73
PROCEDURE put* (vector: VECTOR; idx: INTEGER; value: ANYPTR);
74
BEGIN
75
  ASSERT(vector # NIL);
76
  ASSERT( (0 <= idx) & (idx < vector.count) );
77
  sys.PUT(vector.data + idx * 4, value)
78
END put;
79
 
80
 
81
PROCEDURE create* (size: INTEGER): VECTOR;
82
VAR vector: VECTOR;
83
BEGIN
84
  NEW(vector);
85
  IF vector # NIL THEN
86
    vector.data  := K.malloc(4 * size);
87
    IF vector.data # 0 THEN
88
      vector.size  := size;
89
      vector.count := 0
90
    ELSE
91
      DISPOSE(vector)
92
    END
93
  END
94
  RETURN vector
95
END create;
96
 
97
 
98
PROCEDURE def_destructor (VAR any: ANYPTR);
99
BEGIN
100
  DISPOSE(any)
101
END def_destructor;
102
 
103
 
104
PROCEDURE destroy* (VAR vector: VECTOR; destructor: DESTRUCTOR);
105
VAR i: INTEGER;
106
    any: ANYPTR;
107
BEGIN
108
  ASSERT(vector # NIL);
109
  IF destructor = NIL THEN
110
    destructor := def_destructor
111
  END;
112
  FOR i := 0 TO vector.count - 1 DO
113
    any := get(vector, i);
114
    destructor(any)
115
  END;
116
  vector.data := K.free(vector.data);
117
  DISPOSE(vector)
118
END destroy;
119
 
120
 
7696 akron1 121
END Vector.