123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124# 1 "Camomile/internal/bitsvect.ml"(** bits vector *)(* Copyright (C) 2002 Yamagata Yoriyuki. *)(* This library is free software; you can redistribute it and/or *)(* modify it under the terms of the GNU Lesser General Public License *)(* as published by the Free Software Foundation; either version 2 of *)(* the License, or (at your option) any later version. *)(* As a special exception to the GNU Library General Public License, you *)(* may link, statically or dynamically, a "work that uses this library" *)(* with a publicly distributed version of this library to produce an *)(* executable file containing portions of this library, and distribute *)(* that executable file under terms of your choice, without any of the *)(* additional requirements listed in clause 6 of the GNU Library General *)(* Public License. By "a publicly distributed version of this library", *)(* we mean either the unmodified Library as distributed by the authors, *)(* or a modified version of this library that is distributed under the *)(* conditions defined in clause 3 of the GNU Library General Public *)(* License. This exception does not however invalidate any other reasons *)(* why the executable file might be covered by the GNU Library General *)(* Public License . *)(* This library is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *)(* Lesser General Public License for more details. *)(* You should have received a copy of the GNU Lesser General Public *)(* License along with this library; if not, write to the Free Software *)(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *)(* USA *)(* You can contact the authour by sending email to *)(* yoriyuki.y@gmail.com *)letrecbitsn=ifn=0then0else1+bits(nlsr1)typet={len:int;mutablebits:int;mutablecontents:Bytes.t;mutableid:int}(* get v i : read the i-th element of v *)(* b < 8 *)letgetvecti=letb=vect.bitsinletv=vect.contentsinletk=b*iinletm0=((Char.code(Bytes.getv(klsr3)))lsr(kland0b111))inletm=((Char.code(Bytes.getv((klsr3)+1)))lsl(8-(kland0b111)))lorm0inmland((1lslb)-1)letunsafe_getvecti=letb=vect.bitsinletv=vect.contentsinletk=b*iinletj=klsr3inletv1=Char.code(Bytes.unsafe_getvj)inletv2=Char.code(Bytes.unsafe_getv(j+1))inletj'=kland0b111in(v2lsl(8-j'))lor(v1lsrj')land((1lslb)-1)letset_rawvectin=letb=vect.bitsinletv=vect.contentsinleti0=(i*b)lsr3inleti1=(i*b)land7inletmasq1=(1lslb-1)inletc0=(Char.code(Bytes.getvi0))land(lnot(masq1lsli1))inletc0'=c0lor((nlsli1)land255)inBytes.setvi0(Char.chrc0');ifb+i1<=8then()elseletmasq2=(1lsl(b+i1-8))-1inletc1=(Char.code(Bytes.getv(i0+1)))land(lnotmasq2)inletc1'=c1lor(nlsr(8-i1))inBytes.setv(i0+1)(Char.chrc1')letbits_to_bytesb=b/8+2letsetvectin=letb=bitsninifvect.bits<bthenletsave={len=vect.len;bits=vect.bits;contents=vect.contents;id=0}inletlen=vect.leninvect.contents<-Bytes.make(bits_to_bytes(b*len))(Char.chr0);vect.bits<-b;fori=0tolen-1doset_rawvecti(getsavei)done;else();set_rawvectinletmakei0df=letb=max(bitsdf)1inletv={len=i0;bits=b;contents=Bytes.make(bits_to_bytes(b*i0))(Char.chr0);id=0}infori=0toi0-1dosetvidfdone;vletcopyv={len=v.len;bits=v.bits;contents=Bytes.copyv.contents;id=0}letiteriprocv=fori=0tov.len-1doproci(getvi)doneletlengthv=v.lenletset_idvid=v.id<-idletidv=v.id