Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/system/Basis/Implementation/char-array.sml
ViewVC logotype

Annotation of /sml/trunk/system/Basis/Implementation/char-array.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1350 - (view) (download)
Original Path: sml/trunk/src/system/Basis/Implementation/char-array.sml

1 : monnier 416 (* char-array.sml
2 :     *
3 :     * COPYRIGHT (c) 1994 AT&T Bell Labs.
4 :     *
5 :     *)
6 :    
7 :     structure CharArray : MONO_ARRAY =
8 :     struct
9 :     structure String = StringImp
10 :     structure A = InlineT.CharArray
11 :    
12 : mblume 1350 (* fast add/subtract avoiding the overflow test *)
13 :     infix -- ++
14 :     fun x -- y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x -
15 :     InlineT.Word31.copyf_int31 y)
16 :     fun x ++ y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x +
17 :     InlineT.Word31.copyf_int31 y)
18 :    
19 :    
20 : monnier 416 (* unchecked access operations *)
21 : mblume 1350 val uupd = A.update
22 :     val usub = A.sub
23 :     val vuupd = InlineT.CharVector.update
24 :     val vusub = InlineT.CharVector.sub
25 :     val vlength = InlineT.CharVector.length
26 : monnier 416
27 :     type elem = char
28 :     type vector = string
29 :     type array = A.array
30 :    
31 :     val maxLen = Core.max_length
32 :    
33 :     fun array (0, c) = A.newArray0()
34 :     | array (len, c) = if (InlineT.DfltInt.ltu(maxLen, len))
35 :     then raise General.Size
36 :     else let
37 :     val arr = A.create len
38 :     fun init i = if (i < len)
39 : mblume 1350 then (uupd(arr, i, c); init(i+1))
40 : monnier 416 else ()
41 :     in
42 :     init 0; arr
43 :     end
44 :    
45 :     fun tabulate (0, _) = A.newArray0()
46 :     | tabulate (len, f) = if (InlineT.DfltInt.ltu(maxLen, len))
47 :     then raise General.Size
48 :     else let
49 :     val arr = A.create len
50 :     fun init i = if (i < len)
51 : mblume 1350 then (uupd(arr, i, f i); init(i+1))
52 : monnier 416 else ()
53 :     in
54 :     init 0; arr
55 :     end
56 :    
57 :     fun fromList [] = A.newArray0()
58 :     | fromList l = let
59 :     fun length ([], n) = n
60 :     | length (_::r, n) = length (r, n+1)
61 :     val len = length (l, 0)
62 :     val _ = if (maxLen < len) then raise General.Size else ()
63 :     val arr = A.create len
64 :     fun init ([], _) = ()
65 : mblume 1350 | init (c::r, i) = (uupd(arr, i, c); init(r, i+1))
66 : monnier 416 in
67 :     init (l, 0); arr
68 :     end
69 :    
70 :     val length : array -> int = InlineT.CharArray.length
71 :     val sub : (array * int) -> elem = InlineT.CharArray.chkSub
72 :     val update : (array * int * elem) -> unit
73 :     = InlineT.CharArray.chkUpdate
74 :    
75 : mblume 1350 fun vector a =
76 :     case length a of
77 :     0 => ""
78 :     | len => let
79 :     val s = Assembly.A.create_s len
80 :     fun fill i =
81 :     if i >= len then ()
82 :     else (vuupd (s, i, usub (a, i)); fill (i ++ 1))
83 :     in
84 :     fill 0;
85 :     s
86 :     end
87 : monnier 416
88 : mblume 1350 fun copy { src, dst, di } = let
89 :     val sl = length src
90 :     val de = sl + di
91 :     fun copyDn (s, d) =
92 :     if s < 0 then () else (uupd (dst, d, usub (src, s));
93 :     copyDn (s -- 1, d -- 1))
94 :     in
95 :     if di < 0 orelse de > length dst then raise Subscript
96 :     else copyDn (sl -- 1, de -- 1)
97 :     end
98 : monnier 416
99 : mblume 1350 fun copyVec { src, dst, di } = let
100 :     val sl = vlength src
101 :     val de = sl + di
102 :     fun copyDn (s, d) =
103 :     if s < 0 then () else (uupd (dst, d, vusub (src, s));
104 :     copyDn (s -- 1, d -- 1))
105 :     in
106 :     if di < 0 orelse de > length dst then raise Subscript
107 :     else copyDn (sl -- 1, de -- 1)
108 :     end
109 : monnier 416
110 : mblume 1350 fun appi f arr = let
111 :     val len = length arr
112 :     fun app i =
113 :     if i >= len then () else (f (i, usub (arr, i)); app (i ++ 1))
114 :     in
115 :     app 0
116 :     end
117 :    
118 : monnier 416 fun app f arr = let
119 : mblume 1350 val len = length arr
120 :     fun app i =
121 :     if i >= len then () else (f (usub (arr, i)); app (i ++ 1))
122 :     in
123 :     app 0
124 :     end
125 : monnier 416
126 : mblume 1350 fun modifyi f arr = let
127 :     val len = length arr
128 :     fun mdf i =
129 :     if i >= len then ()
130 :     else (uupd (arr, i, f (i, usub (arr, i))); mdf (i ++ 1))
131 :     in
132 :     mdf 0
133 :     end
134 : monnier 416
135 :     fun modify f arr = let
136 : mblume 1350 val len = length arr
137 :     fun mdf i =
138 :     if i >= len then ()
139 :     else (uupd (arr, i, f (usub (arr, i))); mdf (i ++ 1))
140 :     in
141 :     mdf 0
142 :     end
143 : monnier 416
144 : mblume 1350 fun foldli f init arr = let
145 :     val len = length arr
146 :     fun fold (i, a) =
147 :     if i >= len then a else fold (i ++ 1, f (i, usub (arr, i), a))
148 :     in
149 :     fold (0, init)
150 :     end
151 : monnier 416
152 : mblume 1350 fun foldl f init arr = let
153 :     val len = length arr
154 :     fun fold (i, a) =
155 :     if i >= len then a else fold (i ++ 1, f (usub (arr, i), a))
156 :     in
157 :     fold (0, init)
158 :     end
159 : monnier 416
160 : mblume 1350 fun foldri f init arr = let
161 :     fun fold (i, a) =
162 :     if i < 0 then a else fold (i -- 1, f (i, usub (arr, i), a))
163 :     in
164 :     fold (length arr -- 1, init)
165 :     end
166 : monnier 416
167 : mblume 1350 fun foldr f init arr = let
168 :     fun fold (i, a) =
169 :     if i < 0 then a else fold (i -- 1, f (usub (arr, i), a))
170 :     in
171 :     fold (length arr -- 1, init)
172 :     end
173 : monnier 416
174 : mblume 1350 fun findi p arr = let
175 :     val len = length arr
176 :     fun fnd i =
177 :     if i >= len then NONE
178 :     else let val x = usub (arr, i)
179 :     in
180 :     if p (i, x) then SOME (i, x) else fnd (i ++ 1)
181 :     end
182 :     in
183 :     fnd 0
184 :     end
185 : monnier 416
186 : mblume 1350 fun find p arr = let
187 :     val len = length arr
188 :     fun fnd i =
189 :     if i >= len then NONE
190 :     else let val x = usub (arr, i)
191 :     in
192 :     if p x then SOME x else fnd (i ++ 1)
193 :     end
194 :     in
195 :     fnd 0
196 :     end
197 : monnier 416
198 : mblume 1350 fun exists p arr = let
199 :     val len = length arr
200 :     fun ex i = i < len andalso (p (usub (arr, i)) orelse ex (i ++ 1))
201 :     in
202 :     ex 0
203 :     end
204 : monnier 416
205 : mblume 1350 fun all p arr = let
206 :     val len = length arr
207 :     fun al i = i >= len orelse (p (usub (arr, i)) andalso al (i ++ 1))
208 :     in
209 :     al 0
210 :     end
211 :    
212 :     fun collate c (a1, a2) = let
213 :     val l1 = length a1
214 :     val l2 = length a2
215 :     val l12 = InlineT.Int31.min (l1, l2)
216 :     fun coll i =
217 :     if i >= l12 then IntImp.compare (l1, l2)
218 :     else case c (usub (a1, i), usub (a2, i)) of
219 :     EQUAL => coll (i ++ 1)
220 :     | unequal => unequal
221 :     in
222 :     coll 0
223 :     end
224 :     end (* CharArray *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0