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

SCM Repository

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

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

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

revision 651, Thu Jun 1 18:34:03 2000 UTC revision 1350, Fri Sep 5 21:34:27 2003 UTC
# Line 8  Line 8 
8    struct    struct
9      structure String = StringImp      structure String = StringImp
10      structure A = InlineT.CharArray      structure A = InlineT.CharArray
11      val (op <)  = InlineT.DfltInt.<  
12      val (op >=) = InlineT.DfltInt.>=      (* fast add/subtract avoiding the overflow test *)
13      val (op +)  = InlineT.DfltInt.+      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    (* unchecked access operations *)    (* unchecked access operations *)
21      val unsafeUpdate = A.update      val uupd = A.update
22      val unsafeSub = A.sub      val usub = A.sub
23      val vecUpdate = InlineT.CharVector.update      val vuupd = InlineT.CharVector.update
24      val vecSub = InlineT.CharVector.sub      val vusub = InlineT.CharVector.sub
25        val vlength = InlineT.CharVector.length
26    
27      type elem = char      type elem = char
28      type vector = string      type vector = string
# Line 30  Line 36 
36              else let              else let
37                val arr = A.create len                val arr = A.create len
38                fun init i = if (i < len)                fun init i = if (i < len)
39                      then (unsafeUpdate(arr, i, c); init(i+1))                      then (uupd(arr, i, c); init(i+1))
40                      else ()                      else ()
41                in                in
42                  init 0; arr                  init 0; arr
# Line 42  Line 48 
48              else let              else let
49                val arr = A.create len                val arr = A.create len
50                fun init i = if (i < len)                fun init i = if (i < len)
51                      then (unsafeUpdate(arr, i, f i); init(i+1))                      then (uupd(arr, i, f i); init(i+1))
52                      else ()                      else ()
53                in                in
54                  init 0; arr                  init 0; arr
# Line 56  Line 62 
62            val _ = if (maxLen < len) then raise General.Size else ()            val _ = if (maxLen < len) then raise General.Size else ()
63            val arr = A.create len            val arr = A.create len
64            fun init ([], _) = ()            fun init ([], _) = ()
65              | init (c::r, i) = (unsafeUpdate(arr, i, c); init(r, i+1))              | init (c::r, i) = (uupd(arr, i, c); init(r, i+1))
66            in            in
67              init (l, 0); arr              init (l, 0); arr
68            end            end
# Line 66  Line 72 
72      val update      : (array * int * elem) -> unit      val update      : (array * int * elem) -> unit
73                                                 = InlineT.CharArray.chkUpdate                                                 = InlineT.CharArray.chkUpdate
74    
75      fun extract (arr, base, optLen) = let      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    
88        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    
99        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    
110        fun appi f arr = let
111            val len = length arr            val len = length arr
112            fun newVec n = let          fun app i =
113                  val newV = Assembly.A.create_s n              if i >= len then () else (f (i, usub (arr, i)); app (i ++ 1))
                 fun fill i = if (i < n)  
                       then (vecUpdate(newV, i, unsafeSub(arr, base+i)); fill(i+1))  
                       else ()  
114                  in                  in
115                    fill 0; newV          app 0
116                  end                  end
117    
118        fun app f arr = let
119            val len = length arr
120            fun app i =
121                if i >= len then () else (f (usub (arr, i)); app (i ++ 1))
122            in            in
123              case (base, optLen)          app 0
124               of (0, NONE) => if (0 < len) then newVec len else ""      end
125                | (_, SOME 0) => if ((base < 0) orelse (len < base))  
126                    then raise General.Subscript      fun modifyi f arr = let
127                    else ""          val len = length arr
128                | (_, SOME 1) => String.str(sub(arr, base))          fun mdf i =
129                | (_, NONE) => if ((base < 0) orelse (len < base))              if i >= len then ()
130                      then raise General.Subscript              else (uupd (arr, i, f (i, usub (arr, i))); mdf (i ++ 1))
                   else if (len = base)  
                     then ""  
                     else newVec (len - base)  
               | (_, SOME n) =>  
                   if ((base < 0) orelse (n < 0) orelse (len < (base+n)))  
                     then raise General.Subscript  
                     else newVec n  
           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 ()  
131            in            in
132              if (di < 0) orelse (length dst < dstop)          mdf 0
               then raise Subscript  
             else if (si < di)  
               then copyDown (sstop-1, dstop-1)  
               else copyUp (si, di)  
           end  
   
     fun copyVec {src, si, len, dst, di} = let  
           val (sstop, dstop) = let  
                 val srcLen = String.size 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 *)  
133                  end                  end
134            fun copyUp (j, k) = if (j < sstop)  
135                  then (unsafeUpdate(dst, k, vecSub(src, j)); copyUp (j+1, k+1))      fun modify f arr = let
136                  else ()          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            in
141              if ((di < 0) orelse (length dst < dstop))          mdf 0
               then raise Subscript  
               else copyUp (si, di)  
142            end            end
143    
144      fun app f arr = let      fun foldli f init arr = let
145            val len = length arr            val len = length arr
146            fun app i = if (i < len)          fun fold (i, a) =
147                  then (f (unsafeSub(arr, i)); app(i+1))              if i >= len then a else fold (i ++ 1, f (i, usub (arr, i), a))
                 else ()  
148            in            in
149              app 0          fold (0, init)
150            end            end
151    
152      fun foldl f init arr = let      fun foldl f init arr = let
153            val len = length arr            val len = length arr
154            fun fold (i, accum) = if (i < len)          fun fold (i, a) =
155                  then fold (i+1, f (unsafeSub(arr, i), accum))              if i >= len then a else fold (i ++ 1, f (usub (arr, i), a))
                 else accum  
156            in            in
157              fold (0, init)              fold (0, init)
158            end            end
159    
160      fun foldr f init arr = let      fun foldri f init arr = let
161            fun fold (i, accum) = if (i >= 0)          fun fold (i, a) =
162                  then fold (i-1, f (unsafeSub(arr, i), accum))              if i < 0 then a else fold (i -- 1, f (i, usub (arr, i), a))
                 else accum  
163            in            in
164              fold (length arr - 1, init)          fold (length arr -- 1, init)
165            end            end
166    
167      fun modify f arr = let      fun foldr f init arr = let
168            val len = length arr          fun fold (i, a) =
169            fun modify' i = if (i < len)              if i < 0 then a else fold (i -- 1, f (usub (arr, i), a))
                 then (  
                   unsafeUpdate(arr, i, f (unsafeSub(arr, i)));  
                   modify'(i+1))  
                 else ()  
170            in            in
171              modify' 0          fold (length arr -- 1, init)
172            end            end
173    
174      fun chkSlice (arr, i, NONE) = let val len = length arr      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            in
180              if (InlineT.DfltInt.ltu(len, i))                       if p (i, x) then SOME (i, x) else fnd (i ++ 1)
               then raise Subscript  
               else (arr, i, len)  
181            end            end
       | chkSlice (arr, i, SOME n) = let val len = length arr  
182            in            in
183              if ((0 <= i) andalso (0 <= n) andalso (i+n <= len))          fnd 0
               then (arr, i, i+n)  
               else raise Subscript  
184            end            end
185    
186      fun appi f slice = let      fun find p arr = let
187            val (arr, start, stop) = chkSlice slice          val len = length arr
188            fun app i = if (i < stop)          fun fnd i =
189                  then (f (i, unsafeSub(arr, i)); app(i+1))              if i >= len then NONE
190                  else ()              else let val x = usub (arr, i)
191            in            in
192              app start                       if p x then SOME x else fnd (i ++ 1)
193            end            end
   
     fun foldli f init slice = let  
           val (arr, start, stop) = chkSlice slice  
           fun fold (i, accum) = if (i < stop)  
                 then fold (i+1, f (i, unsafeSub(arr, i), accum))  
                 else accum  
194            in            in
195              fold (start, init)          fnd 0
196            end            end
197    
198      fun foldri f init slice = let      fun exists p arr = let
199            val (arr, start, stop) = chkSlice slice          val len = length arr
200            fun fold (i, accum) = if (i >= start)          fun ex i = i < len andalso (p (usub (arr, i)) orelse ex (i ++ 1))
                 then fold (i-1, f (i, unsafeSub(arr, i), accum))  
                 else accum  
201            in            in
202              fold (stop - 1, init)          ex 0
203            end            end
204    
205      fun modifyi f slice = let      fun all p arr = let
206            val (arr, start, stop) = chkSlice slice          val len = length arr
207            fun modify' i = if (i < stop)          fun al i = i >= len orelse (p (usub (arr, i)) andalso al (i ++ 1))
                 then (  
                   unsafeUpdate(arr, i, f (i, unsafeSub(arr, i)));  
                   modify'(i+1))  
                 else ()  
208            in            in
209              modify' start          al 0
210            end            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 *)    end (* CharArray *)
   
   

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

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