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

SCM Repository

[smlnj] Diff of /sml/trunk/src/smlnj-lib/Util/bit-array.sml
ViewVC logotype

Diff of /sml/trunk/src/smlnj-lib/Util/bit-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 104  Line 104 
104                        end                        end
105                  in                  in
106                    (put(0,len-1)) handle _ => ();                    (put(0,len-1)) handle _ => ();
107                    Byte.bytesToString (W8A.extract(buf,0,NONE))                    Byte.bytesToString (W8A.vector buf)
108                  end                  end
109    
110            fun bits (len,l) = let            fun bits (len,l) = let
# Line 556  Line 556 
556                         if i < last then loop (8,byte)                         if i < last then loop (8,byte)
557                         else loop (mask7 (nbits - 1) + 1, byte)                         else loop (mask7 (nbits - 1) + 1, byte)
558                  in                  in
559                    W8A.appi f' (bits,0,NONE)                    W8A.appi f' bits
560                  end                  end
561    
562              (* FIX: Reimplement using W8A.foldi *)              (* FIX: Reimplement using W8A.foldi *)
# Line 594  Line 594 
594                    else len                    else len
595    
596              (* FIX: Reimplement using W8A.appi *)              (* FIX: Reimplement using W8A.appi *)
597            fun appi f (BA{nbits=0,bits},_,_) = ()            fun appi' f (BA{nbits=0,bits},_,_) = ()
598              | appi f (BA{nbits,bits},sbit,l) = let              | appi' f (BA{nbits,bits},sbit,l) = let
599                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
600                  fun loop (_, 0) = ()                  fun loop (_, 0) = ()
601                    | loop (i, n) = let                    | loop (i, n) = let
# Line 609  Line 609 
609                  end                  end
610    
611              (* FIX: Reimplement using W8A.foldi *)              (* FIX: Reimplement using W8A.foldi *)
612            fun foldli f a (BA{nbits,bits},sbit,l) = let            fun foldli' f a (BA{nbits,bits},sbit,l) = let
613                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
614                  val last = sbit+len                  val last = sbit+len
615                  fun loop (i,a) =                  fun loop (i,a) =
# Line 624  Line 624 
624                  end                  end
625    
626              (* FIX: Reimplement using W8A.foldr *)              (* FIX: Reimplement using W8A.foldr *)
627            fun foldri f a (BA{nbits,bits},sbit,l) = let            fun foldri' f a (BA{nbits,bits},sbit,l) = let
628                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
629                  fun loop (i,a) =                  fun loop (i,a) =
630                        if i < sbit then a                        if i < sbit then a
# Line 638  Line 638 
638                  end                  end
639    
640              (* FIX: Reimplement using general-purpose copy *)              (* FIX: Reimplement using general-purpose copy *)
641            fun copy {src = src as BA{nbits,bits},si,len,dst,di} = let            fun copy' {src = src as BA{nbits,bits},si,len,dst,di} = let
642                  val l = valid (nbits, si, len)                  val l = valid (nbits, si, len)
643                  val BA{nbits=nbits',bits=bits'} = dst                  val BA{nbits=nbits',bits=bits'} = dst
644                  val _ = if di < 0 orelse nbits' - di < l then raise Subscript                  val _ = if di < 0 orelse nbits' - di < l then raise Subscript
# Line 666  Line 666 
666                         if i < last then loop (8,byte,0w0,0w1)                         if i < last then loop (8,byte,0w0,0w1)
667                         else loop (mask7 (nbits - 1) + 1, byte,0w0,0w1)                         else loop (mask7 (nbits - 1) + 1, byte,0w0,0w1)
668                  in                  in
669                    W8A.modifyi f' (bits,0,NONE)                    W8A.modifyi f' bits
670                  end                  end
671    
672              (* FIX: Reimplement using W8A.modifyi *)              (* FIX: Reimplement using W8A.modifyi *)
673            fun modifyi f (BA{nbits=0,bits},sbit,l) = ()            fun modifyi' f (BA{nbits=0,bits},sbit,l) = ()
674              | modifyi f (BA{nbits,bits},sbit,l) = let              | modifyi' f (BA{nbits,bits},sbit,l) = let
675                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
676                  val last = sbit+len                  val last = sbit+len
677                  fun loop i =                  fun loop i =
# Line 697  Line 697 
697    
698      open Vector      open Vector
699      type array = vector      type array = vector
700    
701        fun vector a = a
702    
703        fun copy { src, dst, di } = copy' { src = src, dst = dst, di = di,
704                                            si = 0, len = NONE }
705    
706      val copyVec = copy      val copyVec = copy
707    
708        fun appi f a = appi' f (a, 0, NONE)
709        fun modifyi f a = modifyi' f (a, 0, NONE)
710        fun foldli f init a = foldli' f init (a, 0, NONE)
711        fun foldri f init a = foldri' f init (a, 0, NONE)
712    
713        (* These are slow, pedestrian implementations.... *)
714        fun findi p a = let
715            val len = length a
716            fun fnd i =
717                if i >= len then NONE
718                else let val x = sub (a, i)
719                     in
720                         if p (i, x) then SOME (i, x) else fnd (i + 1)
721                     end
722        in
723            fnd 0
724        end
725    
726        fun find p a = let
727            val len = length a
728            fun fnd i =
729                if i >= len then NONE
730                else let val x = sub (a, i)
731                     in
732                         if p x then SOME x else fnd (i + 1)
733                     end
734        in
735            fnd 0
736        end
737    
738        fun exists p a = let
739            val len = length a
740            fun ex i = i < len andalso (p (sub (a, i)) orelse ex (i + 1))
741        in
742            ex 0
743        end
744    
745        fun all p a = let
746            val len = length a
747            fun al i = i >= len orelse (p (sub (a, i)) andalso al (i + 1))
748        in
749            al 0
750        end
751    
752        fun collate c (a1, a2) = let
753            val l1 = length a1
754            val l2 = length a2
755            val l12 = Int.min (l1, l2)
756            fun col i =
757                if i >= l12 then Int.compare (l1, l2)
758                else case c (sub (a1, i), sub (a2, i)) of
759                         EQUAL => col (i + 1)
760                       | unequal => unequal
761        in
762            col 0
763        end
764    
765  end (* structure BitArray *)  end (* structure BitArray *)

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