package Ġkotlinx . io Ċ Ċ import Ġkotlinx . io . buffer .* Ċ import Ġkotlinx . io . bytes . Bytes Ċ import Ġkotlinx . io . bytes . point ed Ċ import Ġkotlinx . io . pool . Object Pool Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ[ Input ] Ġis Ġan Ġabstract Ġbase Ġclass Ġfor Ġsynchronous Ġbyte Ġreaders . Ċ Ġ* Ċ Ġ* ĠIt Ġcontains Ġ` read *` Ġmethods Ġto Ġread Ġprimitive Ġtypes Ġ([ read Byte ], Ġ[ readInt ], Ġ...) Ġand Ġarrays Ġ([ read ByteArray ]). Ċ Ġ* Ċ Ġ* Ġ[ Input ] Ġis Ġbuffered . ĠBuffer Ġsize Ġdepends Ġon Ġ[ Buffer . size ] Ġin Ġthe Ġ[ buffer Pool ] Ġbuffer . Ċ Ġ* ĠBuffer Ġsize Ġis Ġ[ DEFAULT _ BUFFER _ SIZE ] Ġby Ġdefault . Ċ Ġ* Ċ Ġ* ĠTo Ġensure Ġthat Ġthe Ġrequired Ġamount Ġbytes Ġare Ġavailable , Ġyou Ġcan Ġprefetch Ġit Ġwith Ġthe Ġ[ prefetch ] Ġmethod . Ċ Ġ* Ċ Ġ* Ġ[ Input ] Ġsupports Ġa Ġre wind Ġmechanism Ġwith Ġthe Ġ[ preview ] Ġmethod . Ċ Ġ* Ċ Ġ* Ġ[ Input ] Ġis Ġa Ġresource Ġbecause Ġit Ġholds Ġthe Ġsource . ĠThe Ġuser Ġhas Ġto Ġclose Ġ[ Input ] Ġwith Ġthe Ġ[ close ] Ġmethod Ġat Ġthe Ġend . Ċ Ġ* Ċ Ġ* ĠTo Ġimplement Ġ[ Input ] Ġover Ġa Ġcustom Ġsource , Ġyou Ġshould Ġoverride Ġ[ fill ] Ġand Ġ[ close Source ] Ġmethods : Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠConstant Input Ġ: ĠInput () Ġ{ Ċ Ġ* ĠĠĠĠ Ġprivate Ġvar Ġclosed : ĠBoolean Ġ= Ġfalse Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġfill ( buffer : ĠBuffer ): ĠInt Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġif Ġ( closed ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġbuffer . store Byte At ( index Ġ= Ġ 0 , Ġvalue Ġ= Ġ 4 2 ) Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġoverride Ġfun Ġclose Source () Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠPlease Ġnote Ġthat Ġ[ Input ] Ġdoesn 't Ġprovide Ġany Ġsynchronization Ġover Ġthe Ġsource Ġand Ġdoesn 't Ġsupport Ġconcurrent Ġaccess . Ċ Ġ* Ċ Ġ* ĠTODO : Ġdocument Ġ[ prefetch ] Ġand Ġ( abstract , Ġprotected ) ĠAPI . Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠInput Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuffer Ġpool Ġused Ġby Ġthis Ġ[ Input ] Ġfor Ġcopy Ġand Ġcache Ġoperations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġbuffer Pool : ĠObject Pool < Buffer > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuffer Ġfor Ġcurrent Ġoperations . ĊĠĠĠĠ Ġ* ĠNote , Ġthat Ġbuffer Ġcan Ġbe Ġex hausted Ġ( position Ġ== Ġlimit ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġbuffer : ĠBuffer ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġreading Ġposition Ġin Ġthe Ġ[ buffer ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġposition : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumber Ġof Ġbytes Ġloaded Ġinto Ġthe Ġ[ buffer ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlimit : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndex Ġof Ġa Ġcurrent Ġbuffer Ġin Ġthe Ġ[ preview Bytes ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpreview Index : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlag Ġto Ġindicate Ġif Ġcurrent Ġ[ preview Bytes ] Ġare Ġbeing Ġdiscarded . ĊĠĠĠĠ Ġ* ĠWhen Ġno Ġpreview Ġis Ġin Ġprogress Ġand Ġa Ġcurrent Ġ[ buffer ] Ġhas Ġbeen Ġex hausted , Ġit Ġshould Ġbe Ġdiscarded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpreview Discard : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe corded Ġbuffers Ġfor Ġpreview Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpreview Bytes : ĠBytes ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġa Ġnew ĠInput Ġwith Ġthe Ġgiven Ġ` buffer Pool `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconstructor ( pool : ĠObject Pool < Buffer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer Pool Ġ= Ġpool ĊĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġpool . borrow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġa Ġnew ĠInput Ġwith Ġthe Ġgiven Ġ[ bytes ], Ġpool Ġis Ġtaken Ġfrom Ġ[ bytes ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġconstructor ( bytes : ĠBytes , Ġpool : ĠObject Pool < Buffer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer Pool Ġ= Ġpool ĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= ĠBuffer . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpreview Bytes Ġ= Ġbytes ĊĊĠĠĠĠĠĠĠ Ġbytes . point ed ( 0 ) Ġ{ Ġfirst Buffer , Ġfirst Limit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġfirst Buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġfirst Limit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġa Ġnew ĠInput Ġwith Ġthe Ġdefault Ġpool Ġof Ġbuffers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġconstructor () Ġ: Ġthis ( Default Buffer Pool . Instance ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġavailable Ġcontent Ġin Ġcurrent Ġ[ Input ] Ġto Ġthe Ġ[ destination ]. ĊĠĠĠĠ Ġ* ĠIf Ġno Ġbytes Ġare Ġavailable Ġin Ġthe Ġinput , Ġ[ fill ] Ġmethod Ġwill Ġbe Ġcalled Ġdirectly Ġon ĊĠĠĠĠ Ġ* Ġthe Ġ[ destination ] Ġunderlying Ġbuffer Ġwithout Ġan Ġextra Ġcopy . ĊĠĠĠĠ Ġ* ĠOtherwise , Ġavailable Ġbytes Ġare Ġcopied Ġto Ġthe Ġdestination . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : Ġfix Ġthis Ġone Ġalong Ġall Ġthe Ġcodebase ĊĠĠĠĠ Ġ* ĠIf Ġ[ Input ] Ġand Ġ[ Output ] Ġhave Ġdifferent Ġbuffer Ġpools , Ġavailable Ġbytes Ġare Ġcopied Ġand ĊĠĠĠĠ Ġ* Ġno Ġdirect Ġtransfer Ġis Ġperformed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Available To ( destination : ĠOutput ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! preview Discard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy Available To ( destination ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= Ġpreview Bytes ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġwe Ġhave Ġsingle Ġbyte Ġin Ġcache ? ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġlimit Ġ|| Ġpreview Ġ!= Ġnull Ġ&& Ġpreview Index Ġ< Ġpreview . tail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Pool Ġ!== Ġdestination . buffer Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCan 't Ġshare Ġbuffers Ġbetween Ġdifferent Ġpools . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy Available To ( destination ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Buffer Range Ġ{ Ġbuffer , Ġstart Offset , Ġend Offset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination . write Buffer ( buffer , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ- Ġstart Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġbytes Ġin Ġcache : Ġfill Ġ[ destination ] Ġbuffer Ġdirect . ĊĠĠĠĠĠĠĠ Ġreturn Ġdestination . write Buffer Ġ{ Ġbuffer , ĠstartIndex , Ġend Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ+ Ġfill ( buffer , ĠstartIndex , Ġend Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġavailable Ġcontent Ġin Ġthe Ġcurrent Ġ[ Input ] Ġto Ġthe Ġ[ destination ] Ġbuffer . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġno Ġbytes Ġare Ġavailable , Ġ[ fill ] Ġmethod Ġwill Ġbe Ġcalled Ġdirectly Ġon Ġthe Ġ[ destination ] Ġbuffer Ġwithout Ġan Ġextra Ġcopy . ĊĠĠĠĠ Ġ* ĠOtherwise , Ġavailable Ġbytes Ġare Ġcopied Ġto Ġthe Ġdestination . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġbytes Ġwritten Ġto Ġthe Ġ[ destination ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġread Available To ( ĊĠĠĠĠĠĠĠ Ġdestination : ĠBuffer , ĊĠĠĠĠĠĠĠ ĠstartIndex : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġend Index : ĠInt Ġ= Ġdestination . size ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Buffer And Indexes ( destination , ĠstartIndex , Ġend Index ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġany Ġcached Ġbyte , Ġwe Ġshould Ġcopy Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġlimit Ġ|| Ġpreview Bytes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy Available To ( destination , ĠstartIndex , Ġend Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġbytes Ġin Ġcache : Ġfill Ġ[ destination ] Ġbuffer Ġdirect . ĊĠĠĠĠĠĠĠ Ġreturn Ġfill ( destination , ĠstartIndex , Ġend Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġreading Ġfrom Ġ[ Input ] Ġin Ġthe Ġ[ reader ] Ġblock Ġwithout Ġconsuming Ġits Ġcontent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġoperation Ġsaves Ġthe Ġstate Ġof Ġthe Ġ[ Input ] Ġbefore Ġ[ reader ] Ġand Ġacc umul ates Ġbuffers Ġfor Ġreplay . ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġ[ reader ] Ġfinishes , Ġit Ġre wind s Ġthis Ġ[ Input ] Ġto Ġthe Ġstate Ġbefore Ġthe Ġ[ reader ] Ġblock . ĊĠĠĠĠ Ġ* ĠPlease Ġnote Ġthat Ġ[ Input ] Ġholds Ġaccumulated Ġbuffers Ġuntil Ġthey Ġare 't Ġconsumed Ġoutside Ġof Ġthe Ġ[ preview ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPreview Ġoperations Ġcan Ġbe Ġnested . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġ< R > Ġpreview ( reader : ĠInput . () Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlimit Ġ&& Ġfetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" End Ġof Ġfile Ġwhile Ġreading Ġbuffer ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmark Discard Ġ= Ġpreview Discard ĊĠĠĠĠĠĠĠ Ġval Ġmark Index Ġ= Ġpreview Index ĊĠĠĠĠĠĠĠ Ġval Ġmark Position Ġ= Ġposition ĊĊĠĠĠĠĠĠĠ Ġpreview Discard Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġreader () ĊĠĠĠĠĠĠĠ Ġpreview Discard Ġ= Ġmark Discard ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġmark Position ĊĊĠĠĠĠĠĠĠ Ġif Ġ( preview Index Ġ== Ġmark Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġat Ġthe Ġsame Ġbuffer , Ġjust Ġrestore Ġthe Ġposition Ġ& Ġstate Ġabove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġpreview Bytes !! ĊĠĠĠĠĠĠĠ Ġbytes . point ed ( mark Index ) Ġ{ Ġbuffer , Ġlimit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Ġ= Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpreview Index Ġ= Ġmark Index ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġat Ġleast Ġone Ġbyte Ġis Ġavailable Ġto Ġread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġcan Ġuse Ġ[ fill ] Ġif Ġno Ġbytes Ġare Ġavailable Ġin Ġthe Ġcache . ĠPlease Ġconsider Ġusing Ġ[ read Available To ] Ġin ĊĠĠĠĠ Ġ* Ġperformance - critical Ġcode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" NOTH ING _ TO _ INLINE ") ĊĠĠĠ Ġpublic Ġinline Ġfun Ġex hausted (): ĠBoolean Ġ= Ġ! prefetch ( 1 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthat Ġ[ size ] Ġbytes Ġare Ġfetched Ġin Ġ[ Input ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġ[ Input ] Ġcontains Ġat Ġleast Ġ[ size ] Ġbytes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġprefetch ( size : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Size ( size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlimit Ġ&& Ġfetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġsize Ġ- Ġ( limit Ġ- Ġposition ) ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// ĠEn ough Ġbytes Ġin Ġcurrent Ġbuffer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprefetch In Preview ( left ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSk ips Ġ[ count ] Ġbytes Ġfrom Ġinput . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġskipped Ġbytes Ġcount . ĠIt Ġcould Ġbe Ġless Ġthan Ġ[ count ] Ġif Ġno Ġmore Ġbytes Ġavailable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġdiscard ( count : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Count ( count ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġcount ĊĠĠĠĠĠĠĠ Ġwhile Ġ( remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskip Count Ġ= Ġread Buffer Range Ġ{ Ġ_, Ġstart Offset , Ġend Offset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( remaining , Ġend Offset Ġ- Ġstart Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Ġ-= Ġskip Count ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcount Ġ- Ġremaining ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġinput Ġincluding Ġthe Ġunderlying Ġsource . ĠAll Ġpending Ġbytes Ġwill Ġbe Ġdiscarded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose Source () ĊĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġbuffer Pool . recycle ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= Ġpreview Bytes Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġpreview Bytes Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġpreview . discard First () ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! preview . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . point ed ( 0 ) Ġ{ Ġbuffer , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pool . recycle ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . discard First () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġto Ġfill Ġ[ buffer ] Ġfrom Ġ[ startIndex ] Ġto Ġ[ end Index ] Ġexclusive Ġfrom Ġthe Ġunderlying Ġsource . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġmay Ġblock Ġand Ġwait Ġif Ġno Ġbytes Ġare Ġavailable . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġcopies Ġbytes Ġfrom Ġsource Ġto Ġ[ buffer ] Ġfrom Ġ[ startIndex ] Ġto Ġ[ startIndex ] Ġ+ Ġ` return - value `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ[ startIndex ] Ġcannot Ġbe Ġnegative , Ġthe Ġ[ end Index ] Ġshould Ġbe Ġgreater Ġthan Ġ[ startIndex ] ĊĠĠĠĠ Ġ* ĠThe Ġ[ buffer ] Ġsize Ġshould Ġbe Ġpositive , Ġ[ end Index ] Ġcannot Ġbe Ġgreater Ġthan Ġ[ buffer ] Ġsize . ĊĠĠĠĠ Ġ* ĠWriting Ġand Ġreading Ġto Ġthe Ġ[ buffer ] Ġoutside Ġof Ġthe Ġgiven Ġrange Ġleads Ġto Ġunspecified Ġbehaviour . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġbytes Ġwere Ġfilled Ġ(` end Index Ġ- ĠstartIndex ` Ġat Ġmost ) Ġor Ġ` 0 ` Ġif Ġno Ġmore Ġinput Ġis Ġavailable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġfill ( buffer : ĠBuffer , ĠstartIndex : ĠInt Ġ= Ġ 0 , Ġend Index : ĠInt Ġ= Ġbuffer . size Ġ- ĠstartIndex ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġnext Ġbytes Ġinto Ġthe Ġ[ dest inations ]. ĊĠĠĠĠ Ġ* ĠMay Ġblock Ġuntil Ġat Ġleast Ġone Ġbyte Ġis Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : Ġpurpose . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġbytes Ġwere Ġcopied Ġor Ġ` 0 ` Ġif Ġno Ġmore Ġinput Ġis Ġavailable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġfill ( dest inations : ĠArray < Buffer >): ĠInt Ġ= Ġdest inations . sum By Ġ{ Ġfill ( it ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthe Ġunderlying Ġsource Ġof Ġdata Ġused Ġby Ġthis Ġinput . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġinvoked Ġonce Ġthe Ġinput Ġis Ġ[ closed ][ close ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġclose Source () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġa Ġprimitive Ġof Ġ[ primitive Size ] Ġeither Ġdirectly Ġfrom Ġa Ġbuffer Ġwith Ġ[ read Direct ] Ġor Ġbyte - by - byte Ġinto Ġa ĠLong . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinline Ġfun Ġread Primitive ( ĊĠĠĠĠĠĠĠ Ġprimitive Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġread Direct : Ġ( buffer : ĠBuffer , Ġoffset : ĠInt ) Ġ-> ĠLong ĊĠĠĠ Ġ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġprepare Primitive Read Position ( primitive Size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Direct ( buffer , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠNo pe , Ġdoesn 't Ġfit Ġin Ġa Ġbuffer , Ġread Ġbyte Ġby Ġbyte ĊĠĠĠĠĠĠĠ Ġreturn Ġread Primitive ( primitive Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Primitive Read Position ( primitive Size : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠ Ġval Ġtarget Limit Ġ= Ġcurrent Position Ġ+ Ġprimitive Size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Limit Ġ>= Ġtarget Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġtarget Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Limit Ġ== Ġcurrent Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġbuffer Ġex hausted Ġand Ġwe Ġalso Ġdon 't Ġhave Ġbytes Ġleft Ġto Ġbe Ġread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġshould Ġfetch Ġnew Ġbuffer Ġof Ġdata Ġand Ġmay Ġbe Ġread Ġentire Ġprimitive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" End Ġof Ġfile Ġwhile Ġreading Ġbuffer ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġknow Ġwe Ġare Ġat Ġzero Ġposition Ġhere , Ġbut Ġlimit Ġ& Ġbuffer Ġcould 've Ġchanged , Ġso Ġcan 't Ġuse Ġcached Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( limit Ġ>= Ġprimitive Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġprimitive Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Primitive ( size : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġwhile Ġ( remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġcurrent Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEOF Exception (" End Ġof Ġfile Ġwhile Ġreading Ġbuffer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Ġ= Ġbuffer . load Byte At ( current ). toInt () Ġand Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ( result Ġshl Ġ 8 ) Ġor Ġbyte . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining -- ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġcurrent ĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġcurrent Limit ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllows Ġdirect Ġread Ġfrom Ġa Ġbuffer , Ġoper ates Ġon Ġstart Offset Ġ+ Ġend Offset Ġ( exclusive ), Ġreturns Ġconsumed Ġbytes Ġcount . ĊĠĠĠĠ Ġ* ĠNOTE : ĠD angerous Ġto Ġuse , Ġif Ġnon - local Ġreturn Ġthen Ġposition Ġwill Ġnot Ġbe Ġupdated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġconsumed Ġbytes Ġcount ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinline Ġfun Ġread Buffer Range ( reader : Ġ( Buffer , Ġstart Offset : ĠInt , Ġend Offset : ĠInt ) Ġ-> ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlimit Ġ&& Ġfetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconsumed Ġ= Ġreader ( buffer , Ġposition , Ġlimit ) ĊĠĠĠĠĠĠĠ Ġposition Ġ+= Ġconsumed ĊĠĠĠĠĠĠĠ Ġreturn Ġconsumed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġcurrently Ġbuffered Ġbytes Ġto Ġthe Ġgiven Ġ[ destination ]. ĠIf Ġno Ġbytes Ġare Ġcurrently Ġbuffered , Ġ[ fill ] Ġmethod ĊĠĠĠĠ Ġ* Ġis Ġinvoked Ġfirst . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtransferred Ġbytes Ġcount . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcopy Available To ( destination : ĠOutput ): ĠInt Ġ= Ġdestination . write Buffer Ġ{ Ġbuffer , ĠstartIndex , Ġend Index Ġ-> ĊĠĠĠĠĠĠĠ ĠstartIndex Ġ+ Ġcopy Available To ( buffer , ĠstartIndex , Ġend Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCop ies Ġcurrently Ġbuffered Ġbytes Ġto Ġthe Ġgiven Ġ[ destination ]. ĠIf Ġno Ġbytes Ġare Ġcurrently Ġbuffered , Ġ[ fill ] Ġmethod ĊĠĠĠĠ Ġ* Ġis Ġinvoked Ġfirst . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtransferred Ġbytes Ġcount . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcopy Available To ( destination : ĠBuffer , ĠstartIndex : ĠInt , Ġend Index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġlimit Ġ&& Ġfetch Cached Or Fill () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġmin ( end Index Ġ- ĠstartIndex , Ġlimit Ġ- Ġposition ) ĊĠĠĠĠĠĠĠ Ġbuffer . copy To ( destination , Ġposition , Ġlength , ĠstartIndex ) ĊĠĠĠĠĠĠĠ Ġposition Ġ+= Ġlength ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlength ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrep ares Ġthis ĠInput Ġfor Ġreading Ġfrom Ġthe Ġnext Ġbuffer , Ġeither Ġby Ġfilling Ġit Ġfrom Ġthe Ġunderlying Ġsource ĊĠĠĠĠ Ġ* Ġor Ġloading Ġfrom Ġa Ġ[ preview Bytes ] Ġafter Ġa Ġ[ preview ] Ġoperation Ġor Ġif Ġreading Ġfrom Ġpre - supp lied Ġ[ Bytes ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCurrent Ġ[ buffer ] Ġshould Ġbe Ġex hausted Ġat Ġthis Ġmoment , Ġi . e . Ġ[ position ] Ġshould Ġbe Ġequal Ġto Ġ[ limit ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfetch Cached Or Fill (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdiscard Ġ= Ġpreview Discard ĊĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= Ġpreview Bytes ĊĊĠĠĠĠĠĠĠ Ġif Ġ( discard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfill From Source () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfetch From Preview And Discard ( preview ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġpreview Ġ?: Ġstart Preview () ĊĠĠĠĠĠĠĠ Ġreturn Ġfill And Store In Preview ( bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare New Buffer () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġbuffer Pool . borrow () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstanti ates Ġ[ preview Bytes ] Ġand Ġfill Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Preview (): ĠBytes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠBytes (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( buffer , Ġlimit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpreview Bytes Ġ= Ġbytes ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF etches Ġbuffer Ġfrom Ġ[ bytes ]. ĊĠĠĠĠ Ġ* ĠThe Ġ[ bytes ] Ġshouldn 't Ġbe Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfetch From Preview And Discard ( bytes : ĠBytes ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġbytes . discard First () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Bytes Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfill From Source () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuffer Pool . recycle ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġbytes . point ed ( 0 ) Ġ{ Ġnew Buffer , Ġnew Limit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġnew Buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġnew Limit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlimit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill And Store In Preview ( bytes : ĠBytes ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Index Ġ= Ġpreview Index Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . is After Last ( next Index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare New Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Ġ= Ġfill From Source () Ġ// Ġreceived Ġdata Ġcan Ġbe Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . append ( buffer , Ġfetched ) Ġ// Ġbuffer Ġcan Ġbe Ġempty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Index Ġ= Ġnext Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfetched ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġa Ġbuffer Ġalready Ġin Ġhistory , Ġi . e . Ġreplay ing Ġhistory Ġinside Ġanother Ġpreview ĊĠĠĠĠĠĠĠ Ġbytes . point ed ( next Index ) Ġ{ Ġbuffer , Ġlimit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . buffer Ġ= Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . limit Ġ= Ġlimit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġpreview Index Ġ= Ġnext Index ĊĠĠĠĠĠĠĠ Ġreturn Ġlimit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill From Source (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfetched Ġ= Ġfill ( buffer , Ġ 0 , Ġbuffer . size ) ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġfetched ĊĠĠĠĠĠĠĠ Ġreturn Ġfetched ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprefetch In Preview ( count : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġcount ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġfetch Ġbytes Ġinto Ġadditional Ġbuffers , Ġso Ġprepare Ġpreview ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġpreview Bytes Ġ?: Ġstart Preview () ĊĊĠĠĠĠĠĠĠ Ġvar Ġfetch Index Ġ= Ġpreview Index ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! bytes . is After Last ( fetch Index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ-= Ġbytes . limit ( fetch Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEn ough Ġbytes Ġin Ġpreview Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Index ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( left Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( buffer , Ġlimit ) Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġbuffer Pool . borrow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġfill ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Ġto Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pool . recycle ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( limit Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Pool . recycle ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . append ( buffer , Ġlimit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ-= Ġlimit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġhow Ġmany Ġbytes Ġremaining Ġin Ġcurrent Ġpreview Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġremaining Cache Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreview Size Ġ= Ġpreview Bytes ?. size ( preview Index ) Ġ?: Ġlimit ĊĠĠĠĠĠĠĠ Ġreturn Ġpreview Size Ġ- Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġa Ġ[ Binary ] Ġof Ġgiven Ġ[ size ] Ġif Ġpossible . ĠThe Ġresulting Ġbinary Ġis Ġindependent Ġfrom Ġthis Ġinput Ġand Ġcould Ġbe Ġused ĊĠĠĠĠ Ġ* Ġseparately . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġfun Ġread Binary ( size : ĠInt ): ĠBinary Ġ= Ġread ByteArray ( size ). as Binary () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġread Ġposition Ġin Ġa Ġcurrent Ġbuffer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġbuffer Position (): ĠInt Ġ= Ġposition Ċ } Ċ