source: project/release/4/flsim/trunk/sml-lib/tensor/DynArray.sml @ 29960

Last change on this file since 29960 was 29960, checked in by Ivan Raikov, 8 years ago

flsim: added tensor library to sml support files

File size: 2.9 KB
Line 
1(*
2 * Dynamic (dense) array.
3 *
4 * -- Allen
5 *)
6
7structure DynArray 
8(*  sig include ARRAY
9      val fromArray : 'a Array.array * 'a * int -> 'a array
10      val baseArray : 'a array -> 'a Array.array
11      val checkArray: 'a array * 'a Array.array -> unit
12      val clear     : 'a array * int -> unit
13      val expandTo  : 'a array * int -> unit
14  end*) =
15  struct
16     structure A        = Array
17     structure AS       = ArraySlice
18     type 'a vector     = 'a A.vector
19     datatype 'a array  = ARRAY of 'a A.array ref * 'a * int ref
20
21     exception Subscript = General.Subscript
22     exception Size      = General.Size
23     exception Unimplemented
24
25     infix 9 sub
26
27     val maxLen = A.maxLen
28
29     fun array (n,d) = ARRAY(ref(A.array (n,d)), d, ref 0) 
30     fun clear (ARRAY(a,def,cnt),n) = (a := A.array(n,def); cnt := n)
31     fun fromArray(a,d,n) = ARRAY(ref a, d, ref n)
32
33     fun baseArray(ARRAY(ref a,_,_)) = a
34     fun checkArray(ARRAY(ref a,_,_),a') = if a = a' then () else raise Match
35
36     fun length (ARRAY (ref a,_,ref n)) = n
37
38     fun (ARRAY(ref a, d, _)) sub i = A.sub(a,i) handle _ => d
39   
40     fun update (ARRAY(r as ref a, d, n), i, e) =
41        (A.update(a,i,e); n := Int.max(!n,i+1)) handle _ =>
42            let val new_size  = Int.max(i+1,!n*2)
43                val new_size  = if new_size < 10 then 10 else new_size
44                val new_array = A.array(new_size,d)
45            in  A.copy {src = a, dst = new_array, di = 0};
46                r := new_array;
47                n := i+1;
48                A.update(new_array, i, e)
49            end
50
51     fun expandTo(arr as ARRAY(_, d, _), N) = update(arr, N-1, d)
52
53     fun tabulate (n, f) = 
54         let val array   = A.tabulate(n, f)
55             val default = A.sub(array,0)
56         in
57             ARRAY(ref array, default, ref n)
58         end handle _ => raise Size
59
60     fun fromList l =
61         let val array   = A.fromList l
62             val default = A.sub(array,0)
63         in
64             ARRAY(ref array, default, ref (List.length l))
65         end handle _ => raise Size
66
67     fun slice (ARRAY (ref a, _, ref n)) = AS.slice (a, 0, SOME n)
68
69     fun appi f arr = AS.appi f (slice arr)
70     fun app f arr = AS.app f (slice arr)
71
72     fun copy { src, dst, di } =
73         appi (fn (i, x) => update (dst, i + di, x)) src
74
75     fun copyVec { src, dst, di } =
76         Vector.appi (fn (i, x) => update (dst, i + di, x)) src
77
78     fun foldli f init arr = AS.foldli f init (slice arr)
79     fun foldri f init arr = AS.foldri f init (slice arr)
80     fun foldl f init arr = AS.foldl f init (slice arr)
81     fun foldr f init arr = AS.foldr f init (slice arr)
82     fun modifyi f arr = AS.modifyi f (slice arr)
83     fun modify f arr = AS.modify f (slice arr)
84     fun findi p arr = AS.findi p (slice arr)
85     fun find p arr = AS.find p (slice arr)
86     fun exists p arr = AS.exists p (slice arr)
87     fun all p arr = AS.all p (slice arr)
88     fun collate c (a1, a2) = AS.collate c (slice a1, slice a2)
89     fun vector arr = AS.vector (slice arr)
90end
Note: See TracBrowser for help on using the repository browser.