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

SCM Repository

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

Diff of /sml/trunk/src/system/Basis/Implementation/char-vector.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 11  Line 11 
11    
12      structure String = StringImp      structure String = StringImp
13    
14        (* fast add/subtract avoiding the overflow test *)
15        infix -- ++
16        fun x -- y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x -
17                                                 InlineT.Word31.copyf_int31 y)
18        fun x ++ y = InlineT.Word31.copyt_int31 (InlineT.Word31.copyf_int31 x +
19                                                 InlineT.Word31.copyf_int31 y)
20    
21    (*
22      val (op <)  = InlineT.DfltInt.<      val (op <)  = InlineT.DfltInt.<
23      val (op >=) = InlineT.DfltInt.>=      val (op >=) = InlineT.DfltInt.>=
24      val (op +)  = InlineT.DfltInt.+      val (op +)  = InlineT.DfltInt.+
25    *)
26    
27    (* unchecked access operations *)      val usub = InlineT.CharVector.sub
28      val unsafeUpdate = InlineT.CharVector.update      val uupd = InlineT.CharVector.update
     val unsafeSub = InlineT.CharVector.sub  
29    
30      type elem = char      type elem = char
31      type vector = string      type vector = string
# Line 28  Line 36 
36    
37      fun tabulate (0, _) = ""      fun tabulate (0, _) = ""
38        | tabulate (n, f) = let        | tabulate (n, f) = let
39            val _ = if (InlineT.DfltInt.ltu(maxLen, n)) then raise General.Size else ()            val _ = if (InlineT.DfltInt.ltu(maxLen, n)) then raise General.Size
40                      else ()
41            val ss = Assembly.A.create_s n            val ss = Assembly.A.create_s n
42            fun fill i = if (i < n)            fun fill i =
43                  then (unsafeUpdate(ss, i, f i); fill(i+1))                if i < n then (uupd (ss, i, f i); fill (i ++ 1))
44                  else ()                  else ()
45            in            in
46              fill 0; ss              fill 0; ss
# Line 39  Line 48 
48    
49      val length   = InlineT.CharVector.length      val length   = InlineT.CharVector.length
50      val sub      = InlineT.CharVector.chkSub      val sub      = InlineT.CharVector.chkSub
   
     val extract  = String.extract  
51      val concat   = String.concat      val concat   = String.concat
52    
53        fun update (v, i, x) = tabulate (length v,
54                                         fn i' => if i = i' then x
55                                                  else usub (v, i'))
56    
57        fun appi f vec = let
58            val len = length vec
59            fun app i =
60                if i >= len then () else (f (i, usub (vec, i)); app (i ++ 1))
61        in
62            app 0
63        end
64    
65      fun app f vec = let      fun app f vec = let
66            val len = length vec            val len = length vec
67            fun app i = if (i < len)          fun app i =
68                  then (f (unsafeSub(vec, i)); app(i+1))              if i >= len then () else (f (usub (vec, i)); app (i ++ 1))
                 else ()  
69            in            in
70              app 0              app 0
71            end            end
72    
73        fun mapi f vec = tabulate (length vec, fn i => f (i, usub (vec, i)))
74    
75      val map = String.map      val map = String.map
76    
77      fun foldl f init vec = let      fun foldli f init vec = let
78            val len = length vec            val len = length vec
79            fun fold (i, accum) = if (i < len)          fun fold (i, a) =
80                  then fold (i+1, f (unsafeSub(vec, i), accum))              if i >= len then a else fold (i ++ 1, f (i, usub (vec, i), a))
                 else accum  
81            in            in
82              fold (0, init)              fold (0, init)
83            end            end
84    
85      fun foldr f init vec = let      fun foldri f init vec = let
86            fun fold (i, accum) = if (i >= 0)          fun fold (i, a) =
87                  then fold (i-1, f (unsafeSub(vec, i), accum))              if i < 0 then a else fold (i -- 1, f (i, usub (vec, i), a))
                 else accum  
88            in            in
89              fold (length vec - 1, init)          fold (length vec -- 1, init)
90            end            end
91    
92      fun chkSlice (vec, i, NONE) = let val len = length vec      fun foldl f init vec = let
93            val len = length vec
94            fun fold (i, a) =
95                if i >= len then a else fold (i ++ 1, f (usub (vec, i), a))
96            in            in
97              if (InlineT.DfltInt.ltu(len, i))          fold (0, init)
               then raise Subscript  
               else (vec, i, len)  
98            end            end
99        | chkSlice (vec, i, SOME n) = let val len = length vec  
100        fun foldr f init vec = let
101            fun fold (i, a) =
102                if i < 0 then a else fold (i -- 1, f (usub (vec, i), a))
103            in            in
104              if ((0 <= i) andalso (0 <= n) andalso (i+n <= len))          fold (length vec -- 1, init)
               then (vec, i, i+n)  
               else raise Subscript  
105            end            end
106    
107      fun appi f slice = let      fun findi p vec = let
108            val (vec, start, stop) = chkSlice slice          val len = length vec
109            fun app i = if (i < stop)          fun fnd i =
110                  then (f (i, unsafeSub(vec, i)); app(i+1))              if i >= len then NONE
111                  else ()              else let val x = usub (vec, i)
112            in            in
113              app start                       if p (i, x) then SOME (i, x) else fnd (i ++ 1)
114            end            end
   
     fun mapi f slice = let  
           val (vec, start, stop) = chkSlice slice  
115            in            in
116              case (stop - start)          fnd 0
117               of 0 => ""      end
118                | len => let  
119                    val newVec = Assembly.A.create_s len      fun find p vec = let
120                    fun mapf (i, j) = if (i < len)          val len = length vec
121                          then (          fun fnd i =
122                            unsafeUpdate(newVec, i, f(j, unsafeSub(vec, j)));              if i >= len then NONE
123                            mapf(i+1, j+1))              else let val x = usub (vec, i)
                         else ()  
124                    in                    in
125                      mapf (0, start); newVec                       if p x then SOME x else fnd (i ++ 1)
126                    end                    end
127              (* end case *)      in
128            fnd 0
129            end            end
130    
131      fun foldli f init slice = let      fun exists p vec = let
132            val (vec, start, stop) = chkSlice slice          val len = length vec
133            fun fold (i, accum) = if (i < stop)          fun ex i = i < len andalso (p (usub (vec, i)) orelse ex (i ++ 1))
                 then fold (i+1, f (i, unsafeSub(vec, i), accum))  
                 else accum  
134            in            in
135              fold (start, init)          ex 0
136            end            end
137    
138      fun foldri f init slice = let      fun all p vec = let
139            val (vec, start, stop) = chkSlice slice          val len = length vec
140            fun fold (i, accum) = if (i >= start)          fun al i = i >= len orelse (p (usub (vec, i)) andalso al (i ++ 1))
                 then fold (i-1, f (i, unsafeSub(vec, i), accum))  
                 else accum  
141            in            in
142              fold (stop - 1, init)          al 0
143            end            end
144    
145        fun collate c (v1, v2) = let
146            val l1 = length v1
147            val l2 = length v2
148            val l12 = InlineT.Int31.min (l1, l2)
149            fun col i =
150                if i >= l12 then IntImp.compare (l1, l2)
151                else case c (usub (v1, i), usub (v2, i)) of
152                         EQUAL => col (i ++ 1)
153                       | unequal => unequal
154        in
155            col 0
156        end
157    end (* CharVector *)    end (* CharVector *)
   
   

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