Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  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 <http://www.gnu.org/licenses/>.
  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.  
  121. END Vector.