123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139type'aiter=('a->unit)->unittypet={mutablebs:bytes;mutablelen:int;}letcreate?(cap=0)():t=letbs=ifcap=0thenBytes.unsafe_of_string""elseBytes.createcapin{len=0;bs}let[@inline]capacityself:int=Bytes.lengthself.bslet[@inline]bytesself=self.bslet[@inline]lengthself=self.lenlet[@inline]is_emptyself=self.len=0let[@inline]clearself=self.len<-0letgrow_cap_self=minSys.max_string_length(letn=capacityselfinn+(nlsl1)+5)letgrow_to_selfnewcap=ifnewcap=capacityselftheninvalid_arg"byte_buf: cannot grow further";letnewbytes=Bytes.createnewcapinBytes.blitself.bs0newbytes0self.len;self.bs<-newbyteslet[@inlinenever]grow_self=letnewcap=grow_cap_selfingrow_to_selfnewcaplet[@inlinenever]ensure_cap_grow_selfn=(* new capacity, make sure it's at least [grow_cap_] so
that repeated calls to [ensure_cap] have the amortized complexity *)letnewcap=maxn(grow_cap_self)ingrow_to_selfnewcaplet[@inline]ensure_capselfn=ifn>capacityselfthenensure_cap_grow_selfnlet[@inline]ensure_freeselfn=ifn>capacityself-self.lenthenensure_cap_grow_self(self.len+n)let[@inline]shrink_toselfn=ifself.len>nthenself.len<-nletappend_buf(self:t)buf:unit=letn=Buffer.lengthbufinensure_capself(lengthself+n);Buffer.blitbuf0self.bsself.lenn;self.len<-self.len+nletappend_subbytesselfbofflen=ensure_capself(lengthself+len);Bytes.blitboffself.bsself.lenlen;self.len<-self.len+lenlet[@inline]append_bytesselfb=append_subbytesselfb0(Bytes.lengthb)let[@inline]append_stringselfs=append_bytesself(Bytes.unsafe_of_strings)let[@inline]append_substringselfsofflen=append_subbytesself(Bytes.unsafe_of_strings)offlenlet[@inline]add_char_unsafe_selfc=Bytes.unsafe_setself.bsself.lenc;self.len<-self.len+1let[@inline]add_charselfc=ifself.len=capacityselfthengrow_self;add_char_unsafe_selfclet[@inline]unsafe_getselfi=Bytes.unsafe_getself.bsilet[@inline]unsafe_setselfic=Bytes.unsafe_setself.bsiclet[@inline]getselfi=ifi<0||i>=self.lentheninvalid_arg"Byte_buf.get";unsafe_getselfilet[@inline]setselfic=ifi<0||i>=self.lentheninvalid_arg"Byte_buf.set";unsafe_setselficlet[@inline]contentsself=Bytes.sub_stringself.bs0self.lenlet[@inline]contents_bytesself=Bytes.subself.bs0self.lenlet[@inline]append_iterselfi=i(add_charself)let[@inline]append_seqselfseq=Seq.iter(add_charself)seqlet[@inline]to_sliceself=CCByte_slice.create~len:self.lenself.bsletfold_leftfaccself=let{bs;len}=selfin(* capture current content *)letacc=refaccinfori=0tolendoacc:=f!acc(Bytes.unsafe_getbsi)done;!acclet[@inline]iterfself=(* capture current content *)let{bs;len}=selfinfori=0tolendof(Bytes.unsafe_getbsi)donelet[@inline]iterifself=let{bs;len}=selfinfori=0tolendofi(Bytes.unsafe_getbsi)doneletof_seqseq=letself=create~cap:32()inappend_seqselfseq;selfletof_iteriter=letself=create~cap:32()inappend_iterselfiter;selfletto_iterselfyield=iteryieldselfletto_seqself=let{bs;len}=selfinletrecsi()=ifi=lenthenSeq.NilelseSeq.Cons(Bytes.unsafe_getbsi,s(i+1))ins0(* TODO: unicode operators.*)