Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Tracker SCM

SCM Repository

[smlnj] Diff of /sml/trunk/src/system/Basis/Implementation/word8-array.sml
ViewVC logotype

Diff of /sml/trunk/src/system/Basis/Implementation/word8-array.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1349, Wed Sep 3 22:22:18 2003 UTC revision 1350, Fri Sep 5 21:34:27 2003 UTC
# Line 10  Line 10 
10      structure A = InlineT.Word8Array      structure A = InlineT.Word8Array
11      structure V = InlineT.Word8Vector      structure V = InlineT.Word8Vector
12    
13        (* fast add/subtract avoiding the overflow test *)
14        infix -- ++
15        fun x -- y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x -
16                                                 InlineT.Word31.copyf_int31 y)
17        fun x ++ y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x +
18                                                 InlineT.Word31.copyf_int31 y)
19    
20    
21    (* unchecked access operations *)    (* unchecked access operations *)
22      val unsafeUpdate = A.update      val uupd = A.update
23      val unsafeSub = A.sub      val usub = A.sub
24      val vecUpdate = V.update      val vuupd = V.update
25      val vecSub = V.sub      val vusub = V.sub
26        val vlength = V.length
27    
28      type array = A.array      type array = A.array
29      type elem = Word8.word      type elem = Word8.word
# Line 30  Line 39 
39              else let              else let
40                val arr = Assembly.A.create_b len                val arr = Assembly.A.create_b len
41                fun init i = if (i < len)                fun init i = if (i < len)
42                      then (unsafeUpdate(arr, i, v); init(i+1))                      then (uupd(arr, i, v); init(i+1))
43                      else ()                      else ()
44                in                in
45                  init 0; arr                  init 0; arr
# Line 42  Line 51 
51              else let              else let
52                val arr = Assembly.A.create_b len                val arr = Assembly.A.create_b len
53                fun init i = if (i < len)                fun init i = if (i < len)
54                      then (unsafeUpdate(arr, i, f i); init(i+1))                      then (uupd(arr, i, f i); init(i+1))
55                      else ()                      else ()
56                in                in
57                  init 0; arr                  init 0; arr
# Line 56  Line 65 
65            val _ = if (maxLen < len) then raise General.Size else ()            val _ = if (maxLen < len) then raise General.Size else ()
66            val arr = Assembly.A.create_b len            val arr = Assembly.A.create_b len
67            fun init ([], _) = ()            fun init ([], _) = ()
68              | init (c::r, i) = (unsafeUpdate(arr, i, c); init(r, i+1))              | init (c::r, i) = (uupd(arr, i, c); init(r, i+1))
69            in            in
70              init (l, 0); arr              init (l, 0); arr
71            end            end
# Line 65  Line 74 
74      val sub    = A.chkSub      val sub    = A.chkSub
75      val update = A.chkUpdate      val update = A.chkUpdate
76    
77      fun extract (v, base, optLen) = let      fun vector a =
78            val len = length v          case length a of
79            fun newVec n = let              0 => emptyV
80                  val newV : vector = V.create n            | len => let val v : Word8Vector.vector =
81                  fun fill i = if (i < n)                             InlineT.cast (Assembly.A.create_s len)
82                        then (vecUpdate(newV, i, unsafeSub(v, base+i)); fill(i+1))                         fun fill i =
83                        else ()                             if i >= len then ()
84                               else (vuupd (v, i, usub (a, i)); fill (i ++ 1))
85                  in                  in
86                    fill 0; newV                         fill 0; v
87                  end                  end
88    
89        fun copy { src, dst, di } = let
90            val sl = length src
91            val de = sl + di
92            fun copyDn (s, d) =
93                if s < 0 then () else (uupd (dst, d, usub (src, s));
94                                       copyDn (s -- 1, d -- 1))
95            in            in
96              case (base, optLen)          if di < 0 orelse de > length dst then raise Subscript
97               of (0, NONE) => if (0 < len) then newVec len else emptyV          else copyDn (sl -- 1, de -- 1)
98                | (_, SOME 0) => if ((base < 0) orelse (len < base))      end
99                    then raise General.Subscript  
100                    else emptyV      fun copyVec { src, dst, di } = let
101                | (_, NONE) => if ((base < 0) orelse (len < base))          val sl = vlength src
102                      then raise General.Subscript          val de = sl + di
103                    else if (len = base)          fun copyDn (s, d) =
104                      then emptyV              if s < 0 then () else (uupd (dst, d, vusub (src, s));
105                      else newVec (len - base)                                     copyDn (s -- 1, d -- 1))
               | (_, SOME n) =>  
                   if ((base < 0) orelse (n < 0) orelse (len < (base+n)))  
                     then raise General.Subscript  
                     else newVec n  
             (* end case *)  
           end  
   
     fun copy {src, si, len, dst, di} = let  
           val (sstop, dstop) = let  
                 val srcLen = length src  
                 in  
                   case len  
                    of NONE => if ((si < 0) orelse (srcLen < si))  
                         then raise Subscript  
                         else (srcLen, di+srcLen-si)  
                     | (SOME n) => if ((n < 0) orelse (si < 0) orelse (srcLen < si+n))  
                         then raise Subscript  
                         else (si+n, di+n)  
                   (* end case *)  
                 end  
           fun copyUp (j, k) = if (j < sstop)  
                 then (  
                   unsafeUpdate(dst, k, unsafeSub(src, j));  
                   copyUp (j+1, k+1))  
                 else ()  
           fun copyDown (j, k) = if (si <= j)  
                 then (  
                   unsafeUpdate(dst, k, unsafeSub(src, j));  
                   copyDown (j-1, k-1))  
                 else ()  
106            in            in
107              if ((di < 0) orelse (length dst < dstop))          if di < 0 orelse de > length dst then raise Subscript
108                then raise Subscript          else copyDn (sl -- 1, de -- 1)
109              else if (si < di)      end
110                then copyDown (sstop-1, dstop-1)  
111                else copyUp (si, di)      fun appi f arr = let
112            end          val len = length arr
113            fun app i =
114      fun copyVec {src, si, len, dst, di} = let              if i >= len then () else (f (i, usub (arr, i)); app (i ++ 1))
           val (sstop, dstop) = let  
                 val srcLen = V.length src  
                 in  
                   case len  
                    of NONE => if ((si < 0) orelse (srcLen < si))  
                         then raise Subscript  
                         else (srcLen, di+srcLen-si)  
                     | (SOME n) => if ((n < 0) orelse (si < 0) orelse (srcLen < si+n))  
                         then raise Subscript  
                         else (si+n, di+n)  
                   (* end case *)  
                 end  
           fun copyUp (j, k) = if (j < sstop)  
                 then (  
                   unsafeUpdate(dst, k, vecSub(src, j));  
                   copyUp (j+1, k+1))  
                 else ()  
115            in            in
116              if ((di < 0) orelse (length dst < dstop))          app 0
               then raise Subscript  
               else copyUp (si, di)  
117            end            end
118    
119      fun app f arr = let      fun app f arr = let
120            val len = length arr            val len = length arr
121            fun app i = if (i < len)          fun app i =
122                  then (f (unsafeSub(arr, i)); app(i+1))              if i >= len then () else (f (usub (arr, i)); app (i ++ 1))
                 else ()  
123            in            in
124              app 0              app 0
125            end            end
126    
127      fun foldl f init arr = let      fun modifyi f arr = let
128            val len = length arr            val len = length arr
129            fun fold (i, accum) = if (i < len)          fun mdf i =
130                  then fold (i+1, f (unsafeSub(arr, i), accum))              if i >= len then ()
131                  else accum              else (uupd (arr, i, f (i, usub (arr, i))); mdf (i ++ 1))
132            in            in
133              fold (0, init)          mdf 0
134            end            end
135    
136      fun foldr f init arr = let      fun modify f arr = let
137            fun fold (i, accum) = if (i >= 0)          val len = length arr
138                  then fold (i-1, f (unsafeSub(arr, i), accum))          fun mdf i =
139                  else accum              if i >= len then ()
140                else (uupd (arr, i, f (usub (arr, i))); mdf (i ++ 1))
141            in            in
142              fold (length arr - 1, init)          mdf 0
143            end            end
144    
145     fun modify f arr = let      fun foldli f init arr = let
146            val len = length arr            val len = length arr
147            fun modify' i = if (i < len)          fun fold (i, a) =
148                  then (              if i >= len then a else fold (i ++ 1, f (i, usub (arr, i), a))
                   unsafeUpdate(arr, i, f (unsafeSub(arr, i)));  
                   modify'(i+1))  
                 else ()  
149            in            in
150              modify' 0          fold (0, init)
151            end            end
152    
153      fun chkSlice (arr, i, NONE) = let val len = length arr      fun foldl f init arr = let
154            val len = length arr
155            fun fold (i, a) =
156                if i >= len then a else fold (i ++ 1, f (usub (arr, i), a))
157            in            in
158              if (InlineT.DfltInt.ltu(len, i))          fold (0, init)
               then raise Subscript  
               else (arr, i, len)  
159            end            end
160        | chkSlice (arr, i, SOME n) = let val len = length arr  
161        fun foldri f init arr = let
162            fun fold (i, a) =
163                if i < 0 then a else fold (i -- 1, f (i, usub (arr, i), a))
164            in            in
165              if ((0 <= i) andalso (0 <= n) andalso (i+n <= len))          fold (length arr -- 1, init)
               then (arr, i, i+n)  
               else raise Subscript  
166            end            end
167    
168      fun appi f slice = let      fun foldr f init arr = let
169            val (arr, start, stop) = chkSlice slice          fun fold (i, a) =
170            fun app i = if (i < stop)              if i < 0 then a else fold (i -- 1, f (usub (arr, i), a))
                 then (f (i, unsafeSub(arr, i)); app(i+1))  
                 else ()  
171            in            in
172              app start          fold (length arr -- 1, init)
173            end            end
174    
175      fun foldli f init slice = let      fun findi p arr = let
176            val (arr, start, stop) = chkSlice slice          val len = length arr
177            fun fold (i, accum) = if (i < stop)          fun fnd i =
178                  then fold (i+1, f (i, unsafeSub(arr, i), accum))              if i >= len then NONE
179                  else accum              else let val x = usub (arr, i)
180            in            in
181              fold (start, init)                       if p (i, x) then SOME (i, x) else fnd (i ++ 1)
182                     end
183        in
184            fnd 0
185            end            end
186    
187      fun foldri f init slice = let      fun find p arr = let
188            val (arr, start, stop) = chkSlice slice          val len = length arr
189            fun fold (i, accum) = if (i >= start)          fun fnd i =
190                  then fold (i-1, f (i, unsafeSub(arr, i), accum))              if i >= len then NONE
191                  else accum              else let val x = usub (arr, i)
192            in            in
193              fold (stop - 1, init)                       if p x then SOME x else fnd (i ++ 1)
194                     end
195        in
196            fnd 0
197            end            end
198    
199      fun modifyi f slice = let      fun exists p arr = let
200            val (arr, start, stop) = chkSlice slice          val len = length arr
201            fun modify' i = if (i < stop)          fun ex i = i < len andalso (p (usub (arr, i)) orelse ex (i ++ 1))
202                  then (      in
203                    unsafeUpdate(arr, i, f (i, unsafeSub(arr, i)));          ex 0
204                    modify'(i+1))      end
205                  else ()  
206        fun all p arr = let
207            val len = length arr
208            fun al i = i >= len orelse (p (usub (arr, i)) andalso al (i ++ 1))
209            in            in
210              modify' start          al 0
211            end            end
212    
213        fun collate c (a1, a2) = let
214            val l1 = length a1
215            val l2 = length a2
216            val l12 = InlineT.Int31.min (l1, l2)
217            fun coll i =
218                if i >= l12 then IntImp.compare (l1, l2)
219                else case c (usub (a1, i), usub (a2, i)) of
220                         EQUAL => coll (i ++ 1)
221                       | unequal => unequal
222        in
223            coll 0
224        end
225    end (* structure Word8Array *)    end (* structure Word8Array *)
226    
227    

Legend:
Removed from v.1349  
changed lines
  Added in v.1350

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