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-vector.sml
ViewVC logotype

Diff of /sml/trunk/src/system/Basis/Implementation/word8-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 9  Line 9 
9    
10      structure V = InlineT.Word8Vector      structure V = InlineT.Word8Vector
11    
12      val (op <)  = InlineT.DfltInt.<      (* fast add/subtract avoiding the overflow test *)
13      val (op >=) = InlineT.DfltInt.>=      infix -- ++
14      val (op +)  = InlineT.DfltInt.+      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    (* unchecked access operations *)    (* unchecked access operations *)
20      val unsafeUpdate = V.update      val usub = V.sub
21      val unsafeSub = V.sub      val uupd = V.update
22    
23      type vector = V.vector      type vector = V.vector
24      type elem = Word8.word      type elem = Word8.word
# Line 32  Line 35 
35    
36      val length   = V.length      val length   = V.length
37      val sub      = V.chkSub      val sub      = V.chkSub
     val extract : (vector * int * int option) -> vector  
           = InlineT.cast CharVector.extract  
38      val concat : vector list -> vector      val concat : vector list -> vector
39            = InlineT.cast CharVector.concat            = InlineT.cast CharVector.concat
40        val appi : (int * elem -> unit) -> vector -> unit
41              = InlineT.cast CharVector.appi
42        val app : (elem -> unit) -> vector -> unit
43              = InlineT.cast CharVector.app
44    
45        val update : (vector * int * elem -> vector)
46              = InlineT.cast CharVector.update
47    
48        val mapi : (int * elem -> elem) -> vector -> vector
49              = InlineT.cast CharVector.mapi
50        val map : (elem -> elem) -> vector -> vector
51              = InlineT.cast CharVector.map
52    
53      fun app f vec = let      val v2cv : vector -> CharVector.vector = InlineT.cast
           val len = length vec  
           fun app i = if (i < len)  
                 then (f (unsafeSub(vec, i)); app(i+1))  
                 else ()  
           in  
             app 0  
           end  
54    
55      fun map f vec = (case (length vec)      fun foldli f init vec = let
56             of 0 => vector0          val len = length vec
57              | len => let          fun fold (i, a) =
58                  val newVec = createVec len              if i >= len then a else fold (i ++ 1, f (i, usub (vec, i), a))
                 fun mapf i = if (i < len)  
                       then (unsafeUpdate(newVec, i, f(unsafeSub(vec, i))); mapf(i+1))  
                       else ()  
59                  in                  in
60                    mapf 0; newVec          fold (0, init)
61                  end                  end
           (* end case *))  
   
62    
63      fun foldl f init vec = let      fun foldl f init vec = let
64            val len = length vec            val len = length vec
65            fun fold (i, accum) = if (i < len)          fun fold (i, a) =
66                  then fold (i+1, f (unsafeSub(vec, i), accum))              if i >= len then a else fold (i ++ 1, f (usub (vec, i), a))
                 else accum  
67            in            in
68              fold (0, init)              fold (0, init)
69            end            end
70    
71      fun foldr f init vec = let      fun foldri f init vec = let
72            fun fold (i, accum) = if (i >= 0)          fun fold (i, a) =
73                  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  
           in  
             fold (length vec - 1, init)  
           end  
   
     fun chkSlice (vec, i, NONE) = let val len = length vec  
           in  
             if (InlineT.DfltInt.ltu(len, i))  
               then raise Subscript  
               else (vec, i, len)  
           end  
       | chkSlice (vec, i, SOME n) = let val len = length vec  
           in  
             if ((0 <= i) andalso (0 <= n) andalso (i+n <= len))  
               then (vec, i, i+n)  
               else raise Subscript  
           end  
   
     fun appi f slice = let  
           val (vec, start, stop) = chkSlice slice  
           fun app i = if (i < stop)  
                 then (f (i, unsafeSub(vec, i)); app(i+1))  
                 else ()  
74            in            in
75              app start          fold (length vec -- 1, init)
           end  
   
     fun mapi f slice = let  
           val (vec, start, stop) = chkSlice slice  
           in  
             case (stop - start)  
              of 0 => vector0  
               | len => let  
                   val newVec = createVec len  
                   fun mapf (i, j) = if (i < len)  
                         then (  
                           unsafeUpdate(newVec, i, f(j, unsafeSub(vec, j)));  
                           mapf(i+1, j+1))  
                         else ()  
                   in  
                     mapf (0, start); newVec  
                   end  
             (* end case *)  
76            end            end
77    
78      fun foldli f init slice = let      fun foldr f init vec = let
79            val (vec, start, stop) = chkSlice slice          fun fold (i, a) =
80            fun fold (i, accum) = if (i < stop)              if i < 0 then a else fold (i --1, f (usub (vec, i), a))
                 then fold (i+1, f (i, unsafeSub(vec, i), accum))  
                 else accum  
           in  
             fold (start, init)  
           end  
   
     fun foldri f init slice = let  
           val (vec, start, stop) = chkSlice slice  
           fun fold (i, accum) = if (i >= start)  
                 then fold (i-1, f (i, unsafeSub(vec, i), accum))  
                 else accum  
81            in            in
82              fold (stop - 1, init)          fold (length vec -- 1, init)
83            end            end
84    
85        val findi : (int * elem -> bool) -> vector -> (int * elem) option
86              = InlineT.cast CharVector.findi
87        val find : (elem -> bool) -> vector -> elem option
88              = InlineT.cast CharVector.find
89        val exists : (elem -> bool) -> vector -> bool
90              = InlineT.cast CharVector.exists
91        val all : (elem -> bool) -> vector -> bool
92              = InlineT.cast CharVector.all
93        val collate : (elem * elem -> order) -> vector * vector -> order
94              = InlineT.cast CharVector.collate
95    end    end
   
   

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