@ file : Suppress (" Red undant Modal ity Modifier ") Ċ Ċ package Ġio . ktor . utils . io . core Ċ Ċ import Ġio . ktor . utils . io . bits .* Ċ import Ġio . ktor . utils . io . core . internal .* Ċ import Ġio . ktor . utils . io . core . internal . require Ċ import Ġio . ktor . utils . io . pool .* Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault Ġabstract Ġbase Ġclass Ġimplementing Ġ[ Input ] Ġinterface . Ċ Ġ* Ġ@ see Ġ[ Abstract Input . fill ] Ġand Ġ[ Abstract Input . close Source ]. Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠAbstract Input ( ĊĠĠĠ Ġhead : ĠChunk Buffer Ġ= ĠChunk Buffer . Empty , ĊĠĠĠ Ġremaining : ĠLong Ġ= Ġhead . remaining All (), ĊĠĠĠ Ġpublic Ġval Ġpool : ĠObject Pool < Chunk Buffer > Ġ= ĠChunk Buffer . Pool Ċ ) Ġ: ĠInput Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstate Ġ= ĠAbstract Input Shared State ( head , Ġremaining ) ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġhead : ĠIo Buffer Ġ= ĠIo Buffer . Empty , ĊĠĠĠĠĠĠĠ Ġremaining : ĠLong Ġ= Ġhead . remaining All (), ĊĠĠĠĠĠĠĠ Ġpool : ĠObject Pool < Chunk Buffer > Ġ= ĠChunk Buffer . Pool ĊĠĠĠ Ġ) Ġ: Ġthis ( head Ġas ĠChunk Buffer , Ġremaining , Ġpool ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġthe Ġnext Ġbytes Ġinto Ġthe Ġ[ destination ] Ġstarting Ġat Ġ[ offset ] Ġat Ġmost Ġ[ length ] Ġbytes . ĊĠĠĠĠ Ġ* ĠMay Ġblock Ġuntil Ġat Ġleast Ġone Ġbyte Ġis Ġavailable . ĊĠĠĠĠ Ġ* ĠUsually Ġbypass Ġall Ġexceptions Ġfrom Ġthe Ġunderlying Ġsource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset Ġin Ġbytes Ġwhere Ġresult Ġshould Ġbe Ġwritten ĊĠĠĠĠ Ġ* Ġ@ param Ġlength Ġshould Ġbe Ġat Ġleast Ġone Ġbyte ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġbytes Ġwere Ġcopied Ġor Ġ` 0 ` Ġif ĠEOF Ġencountered ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġfill ( destination : ĠMemory , Ġoffset : ĠInt , Ġlength : ĠInt ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShould Ġclose Ġthe Ġunderlying Ġbytes Ġsource . ĠCould Ġdo Ġnothing Ġor Ġthrow Ġexceptions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġclose Source () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġhead Ġchunk Ġreference ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfinal Ġvar Ġ_ head : ĠChunk Buffer ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . head ĊĠĠĠĠĠĠĠ Ġset ( new Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head Ġ= Ġnew Head ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head Memory Ġ= Ġnew Head . memory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head Position Ġ= Ġnew Head . read Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head End Exclusive Ġ= Ġnew Head . write Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġ@ Suppress (" Can Be Primary Constructor Property ") ĊĠĠĠ Ġinternal Ġvar Ġhead : ĠChunk Buffer ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ head . also Ġ{ Ġit . discard Until Index ( head Position ) Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . ERROR ) ĊĠĠĠĠĠĠĠ Ġset ( new Head ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head Ġ= Ġnew Head ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfinal Ġvar Ġhead Memory : ĠMemory ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . head Memory ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head Memory Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfinal Ġvar Ġhead Position : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . head Position ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head Position Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfinal Ġvar Ġhead End Exclusive : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . head End Exclusive ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . head End Exclusive Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġ@ Suppress (" DE PREC ATION _ ERROR ") ĊĠĠĠ Ġinternal Ġfinal Ġvar Ġhead Remaining : ĠInt ĊĠĠĠĠĠĠĠ Ġinline Ġget () Ġ= Ġhead End Exclusive Ġ- Ġhead Position ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠĠĠĠĠ Ġset ( new Remaining ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Head Remaining ( new Remaining ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtail Remaining : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate . tail Remaining ĊĠĠĠĠĠĠĠ Ġset ( newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( newValue Ġ>= Ġ 0 ) Ġ{ Ġ" tail Remaining Ġshouldn 't Ġbe Ġnegative : Ġ$ newValue " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . tail Remaining Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Not Ġsupported Ġanymore . ĠAll Ġoperations Ġare Ġbig Ġendian Ġby Ġdefault .", ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ĊĠĠĠ Ġ) ĊĠĠĠ Ġfinal Ġoverride Ġvar Ġbyte Order : ĠByte Order ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠByte Order . BIG _ ENDIAN ĊĠĠĠĠĠĠĠ Ġset ( new Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Order Ġ!= ĠByte Order . BIG _ ENDIAN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Only ĠBIG _ ENDIAN Ġis Ġsupported .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġprefetch ( min : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ<= Ġ 0 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġhead Remaining Ġ= Ġhead Remaining ĊĠĠĠĠĠĠĠ Ġif Ġ( head Remaining Ġ>= Ġmin Ġ|| Ġhead Remaining Ġ+ Ġtail Remaining Ġ>= Ġmin ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdo Pref etch ( min ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġpeek To ( destination : ĠMemory , Ġdestination Offset : ĠLong , Ġoffset : ĠLong , Ġmin : ĠLong , Ġmax : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġprefetch ( min Ġ+ Ġoffset ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠChunk Buffer Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġvar Ġcopied Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġskip Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġvar Ġwrite Position Ġ= Ġdestination Offset ĊĠĠĠĠĠĠĠ Ġval Ġmax Copy Size Ġ= Ġmin Of ( max , Ġdestination . size Ġ- Ġdestination Offset ) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( copied Ġ< Ġmin Ġ&& Ġcopied Ġ< Ġmax Copy Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Size Ġ= Ġcurrent . read Remaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chunk Size Ġ> Ġskip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( chunk Size Ġ- Ġskip , Ġmax Copy Size Ġ- Ġcopied ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . memory . copy To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . read Position Ġ+ Ġskip , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Ġ-= Ġchunk Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . next Ġ?: Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcopied ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġdo Fill Ġfor Ġsimilar Ġlogic ĊĠĠĠĠ Ġ* Ġ@ see Ġappend View Ġfor Ġsimilar Ġlogic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdo Pref etch ( min : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtail Ġ= Ġ_ head . find Tail () ĊĠĠĠĠĠĠĠ Ġvar Ġavailable Ġ= Ġhead Remaining Ġ+ Ġtail Remaining ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġfill () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno More Chunks Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Size Ġ= Ġnext . read Remaining ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ=== ĠChunk Buffer . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail . next Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ+= Ġchunk Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ+= Ġchunk Size ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( available Ġ< Ġmin ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġbytes Ġavailable Ġfor Ġread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġval Ġremaining : ĠLong Ġget () Ġ= Ġhead Remaining . to Long () Ġ+ Ġtail Remaining ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthere Ġis Ġat Ġleast Ġone Ġbyte Ġto Ġread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġfun Ġcan Read (): ĠBoolean Ġ= Ġhead Position Ġ!= Ġhead End Exclusive Ġ|| Ġtail Remaining Ġ!= Ġ 0 L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthere Ġare Ġat Ġleast Ġ[ n ] Ġbytes Ġto Ġread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġfun Ġhas Bytes ( n : ĠInt ): ĠBoolean Ġ= Ġhead Remaining Ġ+ Ġtail Remaining Ġ>= Ġn ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ` true ` Ġif Ġno Ġbytes Ġavailable Ġfor Ġread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġpublic Ġfinal Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġend Of Input ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġpublic Ġfinal Ġval Ġis NotEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis NotEmpty ĊĊĠĠĠ Ġprivate Ġvar Ġno More Chunks Available Ġ= Ġfalse ĊĊĠĠĠ Ġfinal Ġoverride Ġval Ġend Of Input : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhead Remaining Ġ== Ġ 0 Ġ&& Ġtail Remaining Ġ== Ġ 0 L Ġ&& Ġ( no More Chunks Available Ġ|| Ġdo Fill () Ġ== Ġnull ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease Ġpacket . ĠAfter Ġthis Ġfunction Ġinvocation Ġthe Ġpacket Ġbecomes Ġempty . ĊĠĠĠĠ Ġ* ĠIf Ġit Ġhas Ġbeen Ġcopied Ġvia Ġ[ Byte Read Packet . copy ] ĊĠĠĠĠ Ġ* Ġthen Ġthe Ġcopy Ġshould Ġbe Ġreleased Ġas Ġwell . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠChunk Buffer . Empty ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ!== Ġempty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . release All ( pool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠ Ġif Ġ(! no More Chunks Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno More Chunks Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclose Source () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġste al All (): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠChunk Buffer . Empty ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ=== Ġempty ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġempty ĊĠĠĠĠĠĠĠ Ġtail Remaining Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġhead ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġste al (): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠChunk Buffer . Empty ĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ=== Ġempty ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ-= Ġnext . read Remaining ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhead . next Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġhead ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġappend ( chain : ĠChunk Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( chain Ġ=== ĠChunk Buffer . Empty ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġchain . remaining All () ĊĠĠĠĠĠĠĠ Ġif Ġ(_ head Ġ=== ĠChunk Buffer . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head Ġ= Ġchain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ= Ġsize Ġ- Ġhead Remaining ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head . find Tail (). next Ġ= Ġchain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġtry Write Append ( chain : ĠChunk Buffer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġhead . find Tail () ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġchain . read Remaining ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 Ġ|| Ġtail . write Remaining Ġ< Ġsize ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġtail . write Buffer Append ( chain , Ġsize ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ=== Ġtail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead End Exclusive Ġ= Ġtail . write Position ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Byte (): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġhead Position ĊĠĠĠĠĠĠĠ Ġval Ġnext Index Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( next Index Ġ< Ġhead End Exclusive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfast - path Ġwhen Ġwe Ġare Ġnot Ġreading Ġthe Ġlast Ġbyte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Position Ġ= Ġnext Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhead Memory [ index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Byte Slow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Byte Slow (): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġhead Position ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġhead End Exclusive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġhead Memory [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Position Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġ_ head ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . discard Until Index ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Next ( head ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġprepare Read ( 1 ) Ġ?: Ġprem ature EndOf Stream ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbyte Ġ= Ġhead . read Byte () ĊĠĠĠĠĠĠĠ Ġcomplete Read Head ( head ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Short (): ĠShort Ġ= Ġread Short () ĊĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Float (): ĠFloat Ġ= Ġread Float () ĊĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Double (): ĠDouble Ġ= Ġread Double () ĊĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Int () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġexactly Ġ[ length ] Ġbytes Ġto Ġ[ dst ] Ġarray Ġat Ġspecified Ġ[ offset ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġread Fully ( dst : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġread Available ( dst , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠ Ġif Ġ( rc Ġ!= Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" Not Ġenough Ġdata Ġin Ġpacket Ġto Ġfill Ġbuffer : Ġ${ length Ġ- Ġrc } Ġmore Ġbytes Ġrequired ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis cards Ġat Ġmost Ġ[ n ] Ġbytes ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġbytes Ġhas Ġbeen Ġdiscarded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġfun Ġdiscard ( n : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ>= Ġ 0 ) Ġ{ Ġ" Negative Ġdiscard Ġis Ġnot Ġallowed : Ġ$ n " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdiscard As M uch As Possible ( n , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis cards Ġexactly Ġ[ n ] Ġbytes Ġor Ġfails Ġwith Ġ[ EOF Exception ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġfun Ġdiscard Exact ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( discard ( n ) Ġ!= Ġn ) Ġthrow ĠEOF Exception (" Unable Ġto Ġdiscard Ġ$ n Ġbytes Ġdue Ġto Ġend Ġof Ġpacket ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġinternal Ġinline Ġfun Ġread ( block : Ġ( Buffer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread ( block Ġ= Ġblock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġinternal Ġinline Ġfun Ġread ( n : ĠInt , Ġblock : Ġ( Buffer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread ( n , Ġblock ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġnext Ġbyte Ġ( unsigned ) Ġor Ġ`- 1 ` Ġif Ġno Ġmore Ġbytes Ġavailable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġtry Peek (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( head Remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhead . try Peek Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tail Remaining Ġ== Ġ 0 L Ġ&& Ġno More Chunks Available ) Ġreturn Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Read Loop ( 1 , Ġhead )?. try Peek Byte () Ġ?: Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Deprecated (" Binary Ġcompatibility .", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġpeek To ( buffer : ĠIo Buffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġprepare Read Head ( 1 ) Ġ?: Ġreturn Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( buffer . write Remaining , Ġhead . read Remaining ) ĊĠĠĠĠĠĠĠ Ġ( buffer Ġas ĠBuffer ). write Fully ( head , Ġsize ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġdiscard ( n : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ<= Ġ 0 ) Ġreturn Ġ 0 L ĊĠĠĠĠĠĠĠ Ġreturn Ġdiscard As M uch As Possible ( n , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġread Available Characters ( destination : ĠChar Array , Ġoff : ĠInt , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( end Of Input ) Ġreturn Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġobject Ġ: ĠAppend able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġidx Ġ= Ġoff ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġappend ( c : ĠChar ): ĠAppend able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination [ idx ++] Ġ= Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġappend ( cs q : ĠCharSequence ?): ĠAppend able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cs q Ġis ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc sq . get Chars Internal ( destination , Ġidx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ+= Ġc sq . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cs q Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġc sq . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination [ idx ++] Ġ= Ġc sq [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġappend ( cs q : ĠCharSequence ?, Ġstart : ĠInt , Ġend : ĠInt ): ĠAppend able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread Text ( out , Ġ 0 , Ġlen ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġat Ġleast Ġ[ min ] Ġand Ġat Ġmost Ġ[ max ] Ġcharacters Ġand Ġappend Ġthem Ġto Ġ[ out ] ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġcharacters Ġappended ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Text ( out : ĠAppend able , Ġmin : ĠInt Ġ= Ġ 0 , Ġmax : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( max . to Long () Ġ>= Ġremaining ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġread Text Exact Bytes ( bytes Count Ġ= Ġremaining . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs . length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġread ASCII ( out , Ġmin , Ġmax ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġexactly Ġ[ exact Characters ] Ġcharacters Ġand Ġappend Ġthem Ġto Ġ[ out ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Text Exact ( out : ĠAppend able , Ġexact Characters : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread Text ( out , Ġexact Characters , Ġexact Characters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġa Ġstring Ġat Ġlast Ġ[ min ] Ġand Ġat Ġmost Ġ[ max ] Ġcharacters Ġlength ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Text ( min : ĠInt Ġ= Ġ 0 , Ġmax : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( min Ġ== Ġ 0 Ġ&& Ġ( max Ġ== Ġ 0 Ġ|| Ġend Of Input )) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġremaining Ġ= Ġremaining ĊĠĠĠĠĠĠĠ Ġif Ġ( remaining Ġ> Ġ 0 Ġ&& Ġmax . to Long () Ġ>= Ġremaining ) Ġreturn Ġread Text Exact Bytes ( bytes Count Ġ= Ġremaining . toInt ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String ( min . coerce At Least ( 1 6 ). coerce At Most ( max )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread ASCII ( this , Ġmin , Ġmax ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġa Ġstring Ġexactly Ġ[ exact Characters ] Ġlength ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Text Exact ( exact Characters : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Text ( exact Characters , Ġexact Characters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread ASCII ( out : ĠAppend able , Ġmin : ĠInt , Ġmax : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ== Ġ 0 Ġ&& Ġmin Ġ== Ġ 0 Ġ-> Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Input Ġ-> Ġif Ġ( min Ġ== Ġ 0 ) Ġreturn Ġ 0 Ġelse Ġat Least Min Characters Require ( min ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ< Ġmin Ġ-> Ġmin ShouldBe Less ( min , Ġmax ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcopied Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġutf 8 Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtake While Ġ{ Ġbuffer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġbuffer . decode ASCII Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copied Ġ== Ġmax ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrc Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ== Ġmax Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutf 8 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( utf 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopied Ġ+ Ġread Utf 8 ( out , Ġmin Ġ- Ġcopied , Ġmax Ġ- Ġcopied ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( copied Ġ< Ġmin ) Ġprem ature EndOf Stream Chars ( min , Ġcopied ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopied ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġat Least Min Characters Require ( min : ĠInt ): ĠNothing Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" at Ġleast Ġ$ min Ġcharacters Ġrequired Ġbut Ġno Ġbytes Ġavailable ") ĊĊĠĠĠ Ġprivate Ġfun Ġmin ShouldBe Less ( min : ĠInt , Ġmax : ĠInt ): ĠNothing Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" min Ġshould Ġbe Ġless Ġor Ġequal Ġto Ġmax Ġbut Ġmin Ġ= Ġ$ min , Ġmax Ġ= Ġ$ max ") ĊĊĠĠĠ Ġprivate Ġfun Ġprem ature EndOf Stream Chars ( min : ĠInt , Ġcopied : ĠInt ): ĠNothing Ġ= Ġthrow ĠMal formed UTF 8 Input Exception ( ĊĠĠĠĠĠĠĠ Ġ" Prem ature Ġend Ġof Ġstream : Ġexpected Ġat Ġleast Ġ$ min Ġchars Ġbut Ġhad Ġonly Ġ$ copied " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġread Utf 8 ( out : ĠAppend able , Ġmin : ĠInt , Ġmax : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcopied Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġtake While Size Ġ{ Ġbuffer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbuffer . decode UTF 8 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copied Ġ== Ġmax ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ== Ġ 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ> Ġ 0 Ġ-> Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( copied Ġ< Ġmin ) Ġprem ature EndOf Stream Chars ( min , Ġcopied ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcopied ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġdiscard As M uch As Possible ( n : ĠLong , Ġskipped : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ 0 L ) Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( current . read Remaining . to Long (), Ġn ). toInt () ĊĠĠĠĠĠĠĠ Ġcurrent . discard Exact ( size ) ĊĠĠĠĠĠĠĠ Ġhead Position Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġafter Read ( current ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdiscard As M uch As Possible ( n Ġ- Ġsize , Ġskipped Ġ+ Ġsize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġdiscard As M uch As Possible ( n : ĠInt , Ġskipped : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ 0 ) Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( current . read Remaining , Ġn ) ĊĠĠĠĠĠĠĠ Ġcurrent . discard Exact ( size ) ĊĠĠĠĠĠĠĠ Ġhead Position Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġafter Read ( current ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdiscard As M uch As Possible ( n Ġ- Ġsize , Ġskipped Ġ+ Ġsize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġread As M uch As Possible ( array : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt , Ġcopied : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( length , Ġcurrent . read Remaining ) ĊĊĠĠĠĠĠĠĠ Ġcurrent . read Fully ( array , Ġoffset , Ġsize ) ĊĠĠĠĠĠĠĠ Ġhead Position Ġ= Ġcurrent . read Position ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( size Ġ!= Ġlength Ġ|| Ġcurrent . read Remaining Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read ( current ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread As M uch As Possible ( array , Ġoffset Ġ+ Ġsize , Ġlength Ġ- Ġsize , Ġcopied Ġ+ Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ+ Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnot En ough Bytes Available ( n : ĠInt ): ĠNothing Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" Not Ġenough Ġdata Ġin Ġpacket Ġ($ remaining ) Ġto Ġread Ġ$ n Ġbyte ( s )") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" Not Ġsupported Ġanymore .", Ġlevel Ġ= ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġpublic Ġfun Ġupdate Head Remaining ( remaining : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġonly Ġexternal Ġusage s Ġare Ġfrom Ġread Direct ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġafter Ġusing Ġhead Ġchunk Ġdirectly Ġwe Ġshould Ġfix Ġpositions Ġinstead ĊĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġhead End Exclusive Ġ- Ġremaining ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Position Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unable Ġto Ġupdate Ġposition Ġto Ġnegative . Ġnew Remaining Ġis Ġtoo Ġbig .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhead Position Ġ= Ġnew Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ D angerous Internal Io Api ĊĠĠĠ Ġpublic Ġfun Ġprepare Read Head ( min Size : ĠInt ): ĠChunk Buffer ? Ġ= Ġprepare Read Loop ( min Size , Ġhead ) ĊĊĠĠĠ Ġ@ D angerous Internal Io Api ĊĠĠĠ Ġpublic Ġfun Ġensure Next Head ( current : ĠChunk Buffer ): ĠChunk Buffer ? Ġ= Ġensure Next ( current ) ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġensure Next ( current : ĠChunk Buffer ): ĠChunk Buffer ? Ġ= Ġensure Next ( ĊĠĠĠĠĠĠĠ Ġcurrent , ĊĠĠĠĠĠĠĠ ĠChunk Buffer . Empty ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ D angerous Internal Io Api ĊĠĠĠ Ġpublic Ġfun Ġfix Gap After Read ( current : ĠChunk Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcurrent . next Ġ?: Ġreturn Ġfix Gap After Read Fallback ( current ) ĊĊĠĠĠĠĠĠĠ Ġval Ġremaining Ġ= Ġcurrent . read Remaining ĊĠĠĠĠĠĠĠ Ġval Ġover run Size Ġ= Ġmin Of ( remaining , ĠBuffer . Reserved Size Ġ- Ġcurrent . end Gap ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next . start Gap Ġ< Ġover run Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfix Gap After Read Fallback ( current ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext . restore Start Gap ( over run Size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( remaining Ġ> Ġover run Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . release End Gap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . head End Exclusive Ġ= Ġcurrent . write Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ+= Ġover run Size ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ-= Ġnext . read Remaining Ġ- Ġover run Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . clean Next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . release ( pool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Gap After Read Fallback ( current : ĠChunk Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no More Chunks Available Ġ&& Ġcurrent . next Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . head Position Ġ= Ġcurrent . read Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . head End Exclusive Ġ= Ġcurrent . write Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġcurrent . read Remaining ĊĠĠĠĠĠĠĠ Ġval Ġover run Ġ= Ġmin Of ( size , ĠBuffer . Reserved Size Ġ- Ġcurrent . end Gap ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġover run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfix Gap After Read Fallback Un reserved ( current , Ġsize , Ġover run ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġpool . borrow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew . reserve End Gap ( Buffer . Reserved Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew . next Ġ= Ġcurrent . clean Next () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew . write Buffer Append ( current , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġnew ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcurrent . release ( pool ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Gap After Read Fallback Un reserved ( current : ĠChunk Buffer , Ġsize : ĠInt , Ġover run : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġhave Ġa Ġchunk Ġwith Ġno Ġend Ġreservation ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġcan Ġsplit Ġit Ġinto Ġtwo Ġto Ġfix Ġit ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk 1 Ġ= Ġpool . borrow () ĊĠĠĠĠĠĠĠ Ġval Ġchunk 2 Ġ= Ġpool . borrow () ĊĊĠĠĠĠĠĠĠ Ġchunk 1 . reserve End Gap ( Buffer . Reserved Size ) ĊĠĠĠĠĠĠĠ Ġchunk 2 . reserve End Gap ( Buffer . Reserved Size ) ĊĠĠĠĠĠĠĠ Ġchunk 1 . next Ġ= Ġchunk 2 ĊĠĠĠĠĠĠĠ Ġchunk 2 . next Ġ= Ġcurrent . clean Next () ĊĊĠĠĠĠĠĠĠ Ġchunk 1 . write Buffer Append ( current , Ġsize Ġ- Ġover run ) ĊĠĠĠĠĠĠĠ Ġchunk 2 . write Buffer Append ( current , Ġover run ) ĊĊĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġchunk 1 ĊĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ= Ġchunk 2 . remaining All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġensure Next ( current : ĠChunk Buffer , Ġempty : ĠChunk Buffer ): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ġ=== Ġempty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Fill () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcurrent . clean Next () ĊĠĠĠĠĠĠĠ Ġcurrent . release ( pool ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Next ( empty , Ġempty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext . can Read () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ-= Ġnext . read Remaining ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġensure Next ( next , Ġempty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġnext Ġchunk Ġsuitable Ġfor Ġreading Ġor Ġ` null ` Ġif Ġno Ġmore Ġchunks Ġavailable . ĠIt Ġis Ġalso Ġallowed ĊĠĠĠĠ Ġ* Ġto Ġreturn Ġa Ġchain Ġof Ġchunks Ġlinked Ġthrough Ġ[ Chunk Buffer . next ]. ĠThe Ġlast Ġchunk Ġshould Ġhave Ġ` null ` Ġnext Ġreference . ĊĠĠĠĠ Ġ* ĠCould Ġre throw Ġexceptions Ġfrom Ġthe Ġunderlying Ġsource . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġfill (): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġpool . borrow () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . reserve End Gap ( Buffer . Reserved Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Ġ= Ġfill ( buffer . memory , Ġbuffer . write Position , Ġbuffer . write Remaining ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copied Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno More Chunks Available Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! buffer . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . release ( pool ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . commit Written ( copied ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . release ( pool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfinal Ġfun Ġmark No More Chunks Available () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! no More Chunks Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno More Chunks Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsee Ġ[ prefetch ] Ġfor Ġsimilar Ġlogic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfinal Ġfun Ġdo Fill (): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( no More Chunks Available ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġfill () ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno More Chunks Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend View ( chunk ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchunk ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfinal Ġfun Ġappend View ( chunk : ĠChunk Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtail Ġ= Ġ_ head . find Tail () ĊĠĠĠĠĠĠĠ Ġif Ġ( tail Ġ=== ĠChunk Buffer . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ head Ġ= Ġchunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( tail Remaining Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" It Ġshould Ġbe Ġno Ġtail Ġremaining Ġbytes Ġif Ġcurrent Ġtail Ġis ĠEmpty Buffer ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ= Ġchunk . next ?. remaining All () Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail . next Ġ= Ġchunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ+= Ġchunk . remaining All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfun Ġprepare Read ( min Size : ĠInt ): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( head End Exclusive Ġ- Ġhead Position Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Read Loop ( min Size , Ġhead ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġfinal Ġfun Ġprepare Read ( min Size : ĠInt , Ġhead : ĠChunk Buffer ): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( head End Exclusive Ġ- Ġhead Position Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Read Loop ( min Size , Ġhead ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġprepare Read Loop ( min Size : ĠInt , Ġhead : ĠChunk Buffer ): ĠChunk Buffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Size Ġ= Ġhead Remaining ĊĠĠĠĠĠĠĠ Ġif Ġ( head Size Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . next Ġ?: Ġdo Fill () Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head Size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head Ġ!== ĠChunk Buffer . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Head ( head ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprepare Read Loop ( min Size , Ġnext ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesired Extra Bytes Ġ= Ġmin Size Ġ- Ġhead Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Ġ= Ġhead . write Buffer Append ( next , Ġdesired Extra Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead End Exclusive Ġ= Ġhead . write Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail Remaining Ġ-= Ġcopied ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! next . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . next Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . next Ġ= Ġnext . clean Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . release ( pool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . reserve Start Gap ( copied ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head . read Remaining Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ> ĠBuffer . Reserved Size ) Ġmin Size Is Too Big ( min Size ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Read Loop ( min Size , Ġhead ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmin Size Is Too Big ( min Size : ĠInt ): ĠNothing Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" min Size Ġof Ġ$ min Size Ġis Ġtoo Ġbig Ġ( should Ġbe Ġless Ġthan Ġ${ Buffer . Reserved Size }) ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġafter Read ( head : ĠChunk Buffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( head . read Remaining Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Head ( head ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfinal Ġfun Ġrelease Head ( head : ĠChunk Buffer ): ĠChunk Buffer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . clean Next () Ġ?: ĠChunk Buffer . Empty ĊĠĠĠĠĠĠĠ Ġthis ._ head Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġthis . tail Remaining Ġ-= Ġnext . read Remaining ĊĠĠĠĠĠĠĠ Ġhead . release ( pool ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ċ } Ċ