forked from KolibriOS/kolibrios
add module "Vector"
git-svn-id: svn://kolibrios.org@6755 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ab4eef43af
commit
cca1343075
@ -60,7 +60,7 @@ BEGIN
|
||||
RETURN Res
|
||||
END strncmp;
|
||||
|
||||
PROCEDURE [stdcall] sysfunc1(arg1: INTEGER): INTEGER;
|
||||
PROCEDURE [stdcall] sysfunc1*(arg1: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *)
|
||||
sys.CODE("CD40"); (* int 40h *)
|
||||
@ -69,7 +69,7 @@ BEGIN
|
||||
RETURN 0
|
||||
END sysfunc1;
|
||||
|
||||
PROCEDURE [stdcall] sysfunc2(arg1, arg2: INTEGER): INTEGER;
|
||||
PROCEDURE [stdcall] sysfunc2*(arg1, arg2: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
sys.CODE("53"); (* push ebx *)
|
||||
sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *)
|
||||
@ -81,7 +81,7 @@ BEGIN
|
||||
RETURN 0
|
||||
END sysfunc2;
|
||||
|
||||
PROCEDURE [stdcall] sysfunc3(arg1, arg2, arg3: INTEGER): INTEGER;
|
||||
PROCEDURE [stdcall] sysfunc3*(arg1, arg2, arg3: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
sys.CODE("53"); (* push ebx *)
|
||||
sys.CODE("8B4508"); (* mov eax, [ebp + 08h] *)
|
||||
|
121
programs/develop/oberon07/Lib/KolibriOS/Vector.ob07
Normal file
121
programs/develop/oberon07/Lib/KolibriOS/Vector.ob07
Normal file
@ -0,0 +1,121 @@
|
||||
(*
|
||||
Copyright 2016 Anton Krotov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*)
|
||||
|
||||
MODULE Vector;
|
||||
|
||||
|
||||
IMPORT sys := SYSTEM, K := KOSAPI;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
DESC_VECTOR = RECORD
|
||||
|
||||
data : INTEGER;
|
||||
count : INTEGER;
|
||||
size : INTEGER
|
||||
|
||||
END;
|
||||
|
||||
VECTOR* = POINTER TO DESC_VECTOR;
|
||||
|
||||
ANYREC* = RECORD END;
|
||||
|
||||
ANYPTR* = POINTER TO ANYREC;
|
||||
|
||||
DESTRUCTOR* = PROCEDURE (VAR ptr: ANYPTR);
|
||||
|
||||
|
||||
PROCEDURE count* (vector: VECTOR): INTEGER;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL)
|
||||
RETURN vector.count
|
||||
END count;
|
||||
|
||||
|
||||
PROCEDURE push* (vector: VECTOR; value: ANYPTR);
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
IF vector.count = vector.size THEN
|
||||
vector.data := K.realloc(vector.data, (vector.size + 1024) * 4);
|
||||
ASSERT(vector.data # 0);
|
||||
vector.size := vector.size + 1024
|
||||
END;
|
||||
sys.PUT(vector.data + vector.count * 4, value);
|
||||
INC(vector.count)
|
||||
END push;
|
||||
|
||||
|
||||
PROCEDURE get* (vector: VECTOR; idx: INTEGER): ANYPTR;
|
||||
VAR res: ANYPTR;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
ASSERT( (0 <= idx) & (idx < vector.count) );
|
||||
sys.GET(vector.data + idx * 4, res)
|
||||
RETURN res
|
||||
END get;
|
||||
|
||||
|
||||
PROCEDURE put* (vector: VECTOR; idx: INTEGER; value: ANYPTR);
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
ASSERT( (0 <= idx) & (idx < vector.count) );
|
||||
sys.PUT(vector.data + idx * 4, value)
|
||||
END put;
|
||||
|
||||
|
||||
PROCEDURE create* (size: INTEGER): VECTOR;
|
||||
VAR vector: VECTOR;
|
||||
BEGIN
|
||||
NEW(vector);
|
||||
IF vector # NIL THEN
|
||||
vector.data := K.malloc(4 * size);
|
||||
IF vector.data # 0 THEN
|
||||
vector.size := size;
|
||||
vector.count := 0
|
||||
ELSE
|
||||
DISPOSE(vector)
|
||||
END
|
||||
END
|
||||
RETURN vector
|
||||
END create;
|
||||
|
||||
|
||||
PROCEDURE def_destructor (VAR any: ANYPTR);
|
||||
BEGIN
|
||||
DISPOSE(any)
|
||||
END def_destructor;
|
||||
|
||||
|
||||
PROCEDURE destroy* (VAR vector: VECTOR; destructor: DESTRUCTOR);
|
||||
VAR i: INTEGER;
|
||||
any: ANYPTR;
|
||||
BEGIN
|
||||
ASSERT(vector # NIL);
|
||||
IF destructor = NIL THEN
|
||||
destructor := def_destructor
|
||||
END;
|
||||
FOR i := 0 TO vector.count - 1 DO
|
||||
any := get(vector, i);
|
||||
destructor(any)
|
||||
END;
|
||||
vector.data := K.free(vector.data);
|
||||
DISPOSE(vector)
|
||||
END destroy;
|
||||
|
||||
|
||||
END Vector.
|
57
programs/develop/oberon07/Samples/vector_ex.ob07
Normal file
57
programs/develop/oberon07/Samples/vector_ex.ob07
Normal file
@ -0,0 +1,57 @@
|
||||
MODULE vector_ex;
|
||||
|
||||
IMPORT C := ConsoleLib, Out, V := Vector;
|
||||
|
||||
|
||||
TYPE
|
||||
|
||||
STRING = ARRAY 240 OF CHAR;
|
||||
|
||||
Item = POINTER TO RECORD (V.ANYREC) inf: STRING END;
|
||||
|
||||
|
||||
PROCEDURE add(v: V.VECTOR; s: STRING);
|
||||
VAR item: Item;
|
||||
BEGIN
|
||||
NEW(item);
|
||||
item.inf := s;
|
||||
V.push(v, item)
|
||||
END add;
|
||||
|
||||
|
||||
PROCEDURE print(v: V.VECTOR; first, last: INTEGER);
|
||||
VAR any : V.ANYPTR;
|
||||
i : INTEGER;
|
||||
BEGIN
|
||||
i := first;
|
||||
WHILE i <= last DO
|
||||
any := V.get(v, i);
|
||||
Out.String(any(Item).inf);
|
||||
Out.Ln;
|
||||
INC(i)
|
||||
END;
|
||||
END print;
|
||||
|
||||
|
||||
PROCEDURE main;
|
||||
VAR v: V.VECTOR;
|
||||
BEGIN
|
||||
C.open(-1, -1, -1, -1, "vector");
|
||||
|
||||
v := V.create(1024);
|
||||
|
||||
add(v, "abc");
|
||||
add(v, "def");
|
||||
add(v, "123");
|
||||
add(v, "qwerty");
|
||||
add(v, "hello");
|
||||
|
||||
print(v, 0, V.count(v) - 1);
|
||||
|
||||
C.exit(FALSE)
|
||||
END main;
|
||||
|
||||
|
||||
BEGIN
|
||||
main
|
||||
END vector_ex.
|
Loading…
Reference in New Issue
Block a user