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/branches/idlbasis-devel/src/smlnj-lib/Util/bit-array.sml
ViewVC logotype

Diff of /sml/branches/idlbasis-devel/src/smlnj-lib/Util/bit-array.sml

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

revision 1232, Tue Jun 4 21:11:15 2002 UTC revision 1233, Wed Jun 5 21:47:29 2002 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 409  Line 409 
409                    then raise Subscript                    then raise Subscript
410                    else slice (ba,sbit,nbits-sbit)                    else slice (ba,sbit,nbits-sbit)
411    
412              fun vector ba = extract (ba, 0, NONE)
413    
414            fun rshift (ba as BA{nbits,bits},shft) =            fun rshift (ba as BA{nbits,bits},shft) =
415                  if shft < 0 then badArg("rshift","negative shift")                  if shft < 0 then badArg("rshift","negative shift")
416                  else if shft = 0 then mkCopy ba                  else if shft = 0 then mkCopy ba
# Line 556  Line 558 
558                         if i < last then loop (8,byte)                         if i < last then loop (8,byte)
559                         else loop (mask7 (nbits - 1) + 1, byte)                         else loop (mask7 (nbits - 1) + 1, byte)
560                  in                  in
561                    W8A.appi f' (bits,0,NONE)                    W8A.appi f' bits
562                  end                  end
563    
564              (* FIX: Reimplement using W8A.foldi *)              (* FIX: Reimplement using W8A.foldi *)
# Line 594  Line 596 
596                    else len                    else len
597    
598              (* FIX: Reimplement using W8A.appi *)              (* FIX: Reimplement using W8A.appi *)
599            fun appi f (BA{nbits=0,bits},_,_) = ()              (* FIX: obsolete interface, should go into separate module *)
600              | appi f (BA{nbits,bits},sbit,l) = let            fun appi_slice f (BA{nbits=0,bits},_,_) = ()
601                | appi_slice f (BA{nbits,bits},sbit,l) = let
602                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
603                  fun loop (_, 0) = ()                  fun loop (_, 0) = ()
604                    | loop (i, n) = let                    | loop (i, n) = let
# Line 608  Line 611 
611                    loop (sbit,len)                    loop (sbit,len)
612                  end                  end
613    
614               (* FIX: new interface, should get specialized implementation *)
615              fun appi f ba = appi_slice f (ba, 0, NONE)
616    
617              (* FIX: Reimplement using W8A.foldi *)              (* FIX: Reimplement using W8A.foldi *)
618            fun foldli f a (BA{nbits,bits},sbit,l) = let              (* FIX: obsolete interface, should go into separate module *)
619              fun foldli_slice f a (BA{nbits,bits},sbit,l) = let
620                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
621                  val last = sbit+len                  val last = sbit+len
622                  fun loop (i,a) =                  fun loop (i,a) =
# Line 623  Line 630 
630                    loop (sbit,a)                    loop (sbit,a)
631                  end                  end
632    
633               (* FIX: new interface, should get specialized implementation *)
634              fun foldli f a ba = foldli_slice f a (ba, 0, NONE)
635    
636              (* FIX: Reimplement using W8A.foldr *)              (* FIX: Reimplement using W8A.foldr *)
637            fun foldri f a (BA{nbits,bits},sbit,l) = let              (* FIX: obsolete interface, should go into separate module *)
638              fun foldri_slice f a (BA{nbits,bits},sbit,l) = let
639                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
640                  fun loop (i,a) =                  fun loop (i,a) =
641                        if i < sbit then a                        if i < sbit then a
# Line 637  Line 648 
648                    loop (sbit+len-1,a)                    loop (sbit+len-1,a)
649                  end                  end
650    
651               (* FIX: new interface, should get specialized implementation *)
652              fun foldri f a ba = foldri_slice f a (ba, 0, NONE)
653    
654              (* FIX: Reimplement using general-purpose copy *)              (* FIX: Reimplement using general-purpose copy *)
655            fun copy {src = src as BA{nbits,bits},si,len,dst,di} = let              (* FIX: obsolete interface, should go into separate module *)
656              fun copy_slice {src = src as BA{nbits,bits},si,len,dst,di} = let
657                  val l = valid (nbits, si, len)                  val l = valid (nbits, si, len)
658                  val BA{nbits=nbits',bits=bits'} = dst                  val BA{nbits=nbits',bits=bits'} = dst
659                  val _ = if di < 0 orelse nbits' - di < l then raise Subscript                  val _ = if di < 0 orelse nbits' - di < l then raise Subscript
# Line 654  Line 669 
669                    loop (si,di)                    loop (si,di)
670                  end                  end
671    
672               (* FIX: new interface, should get specialized implementation *)
673              fun copy { di, dst, src } =
674                  copy_slice { di = di, dst = dst, len = NONE, si = 0, src = src }
675    
676            fun modify f (BA{nbits=0,bits}) = ()            fun modify f (BA{nbits=0,bits}) = ()
677              | modify f (BA{nbits,bits}) = let              | modify f (BA{nbits,bits}) = let
678                  val last = byteOf (nbits-1)                  val last = byteOf (nbits-1)
# Line 666  Line 685 
685                         if i < last then loop (8,byte,0w0,0w1)                         if i < last then loop (8,byte,0w0,0w1)
686                         else loop (mask7 (nbits - 1) + 1, byte,0w0,0w1)                         else loop (mask7 (nbits - 1) + 1, byte,0w0,0w1)
687                  in                  in
688                    W8A.modifyi f' (bits,0,NONE)                    W8A.modifyi f' bits
689                  end                  end
690    
691              (* FIX: Reimplement using W8A.modifyi *)              (* FIX: Reimplement using W8A.modifyi *)
692            fun modifyi f (BA{nbits=0,bits},sbit,l) = ()              (* FIX: obsolete interface, should go into separate module *)
693              | modifyi f (BA{nbits,bits},sbit,l) = let            fun modifyi_slice f (BA{nbits=0,bits},sbit,l) = ()
694                | modifyi_slice f (BA{nbits,bits},sbit,l) = let
695                  val len = valid (nbits, sbit, l)                  val len = valid (nbits, sbit, l)
696                  val last = sbit+len                  val last = sbit+len
697                  fun loop i =                  fun loop i =
# Line 692  Line 712 
712                    loop sbit                    loop sbit
713                  end                  end
714    
715               (* FIX: new interface, should get specialized implementation *)
716              fun modifyi f ba = modifyi_slice f (ba, 0, NONE)
717    
718               (* FIX: should probably be expressed using unsafe subscript etc. *)
719              fun findi f ba = let
720                  val sz = length ba
721                  fun loop i =
722                      if i >= sz then NONE
723                      else let val x = (i, ba sub i)
724                           in if f x then SOME x else loop (i + 1)
725                           end
726              in
727                  loop 0
728              end
729    
730               (* FIX: might need specialized implementations... *)
731              fun find f = Option.map #2 o findi (f o #2)
732              fun exists p ba = isSome (find p ba)
733              fun all p ba = not (exists (not o p) ba)
734    
735              fun collate ecmp (a, b) = let
736                  val al = length a
737                  val bl = length b
738                  val l = if al < bl then al else bl
739                  fun loop i =
740                      if i >= l then Int31.compare (al, bl)
741                      else case ecmp (a sub i, b sub i) of
742                               EQUAL => loop (i + 1)
743                             | unequal => unequal
744              in
745                  loop 0
746              end
747    
748            end (* local *)            end (* local *)
749          end (* structure Vector *)          end (* structure Vector *)
750    

Legend:
Removed from v.1232  
changed lines
  Added in v.1233

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