package Ġkotlinx . io Ċ Ċ import Ġkotlinx . io . buffer .* Ċ import Ġkotlinx . io . pool .* Ċ Ċ /** Ċ Ġ* Ġ[ Output ] Ġis Ġan Ġabstract Ġbase Ġfor Ġwritable Ġstreams Ġof Ġbytes Ġover Ġsome Ġsink . Ċ Ġ* Ċ Ġ* Ġ[ Output ] Ġis Ġbuffered . ĠBuffer Ġsize Ġdepends Ġon Ġ[ Buffer . size ] Ġin Ġthe Ġ[ buffer Pool ] Ġbuffer . Ċ Ġ* ĠBuffer Ġsize Ġis Ġ[ DEFAULT _ BUFFER _ SIZE ] Ġby Ġdefault . ĠBuffer Ġcan Ġbe Ġfl ushed Ġusing Ġ[ flush ] Ġmethod . Ċ Ġ* Ċ Ġ* ĠTo Ġimplement Ġ[ Output ] Ġover Ġa Ġcustom Ġsink Ġyou Ġshould Ġoverride Ġonly Ġ[ fill ] Ġmethod . Ċ Ġ*/ Ċ abstract Ġclass ĠOutput ( buffer Size : ĠInt Ġ= ĠDEFAULT _ BUFFER _ SIZE ) Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPool Ġfor Ġobtaining Ġbuffers Ġfor Ġoperations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġbuffer Pool : ĠObject Pool < Buffer > Ġ= Ġif Ġ( buffer Size Ġ== ĠDEFAULT _ BUFFER _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDefault Buffer Pool . Instance ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠDefault Buffer Pool ( buffer Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġbuffer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġbuffer : ĠBuffer Ġ= Ġbuffer Pool . borrow () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġposition Ġin Ġ[ buffer ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġposition : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġa Ġ[ value ] Ġto Ġthis Ġ[ Input ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Byte ( value : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbuffer . size ĊĠĠĠĠĠĠĠ Ġval Ġtarget Limit Ġ= Ġoffset Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġtarget Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġtarget Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . store Byte At ( offset , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġflush Buffer () ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . store Byte At ( 0 , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġa Ġ[ value ] Ġto Ġthis Ġ[ Input ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Short ( value : ĠShort ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Primitive ( 2 , Ġ{ Ġbuffer , Ġoffset Ġ-> Ġbuffer . store Short At ( offset , Ġvalue ) Ġ}, Ġ{ Ġvalue . to Long () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġa Ġ[ value ] Ġto Ġthis Ġ[ Input ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Int ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Primitive ( 4 , Ġ{ Ġbuffer , Ġoffset Ġ-> Ġbuffer . store Int At ( offset , Ġvalue ) Ġ}, Ġ{ Ġvalue . to Long () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġa Ġ[ value ] Ġto Ġthis Ġ[ Input ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Long ( value : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Primitive ( 8 , Ġ{ Ġbuffer , Ġoffset Ġ-> Ġbuffer . store Long At ( offset , Ġvalue ) Ġ}) Ġ{ Ġvalue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġan Ġ[ array ] Ġto Ġthis Ġ[ Input ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : Ġmeasure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Array ( array : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( byte Ġin Ġarray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( byte ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġall Ġbuffered Ġbytes Ġto Ġunderlying Ġsink . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush Buffer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthe Ġunderlying Ġsource Ġof Ġdata Ġused Ġby Ġthis Ġoutput . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġinvoked Ġonce Ġthe Ġoutput Ġis Ġ[ closed ][ close ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġclose Source () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġthe Ġcurrent Ġoutput , Ġflush ing Ġall Ġbuffered Ġdata Ġto Ġthe Ġunderlying Ġsource ĊĠĠĠĠ Ġ* Ġand Ġ[ closing ][ close Source ] Ġit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfinal Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflush Exception Ġ= Ġrun Catch ing Ġ{ Ġflush () Ġ}. exception OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġclose Exception Ġ= Ġrun Catch ing Ġ{ Ġclose Source () Ġ}. exception OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( flush Exception Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( close Exception Ġ!== Ġnull Ġ&& Ġclose Exception Ġ!== Ġflush Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush Exception . add Sup pressed Internal ( close Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġflush Exception ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( close Exception Ġ!== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġclose Exception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġ[ source ] Ġbuffer Ġto Ġdestination . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMay Ġblock Ġuntil Ġdestination Ġhas Ġno Ġavailable Ġspace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġflush ( source : ĠBuffer , Ġlength : ĠInt ) ĊĊĠĠĠ Ġprivate Ġfun Ġflush Buffer () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush ( buffer , Ġposition ) ĊĠĠĠĠĠĠĠ Ġbuffer Ġ= Ġbuffer Pool . borrow () ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġwrite Buffer Range ( writer : Ġ( buffer : ĠBuffer , Ġstart Offset : ĠInt , Ġend Offset : ĠInt ) Ġ-> ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstart Offset Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġvar Ġend Offset Ġ= Ġbuffer . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( start Offset Ġ> Ġend Offset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= Ġbuffer . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġwriter ( buffer , Ġstart Offset , Ġend Offset ) ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġnew Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġwrite Primitive ( ĊĠĠĠĠĠĠĠ Ġprimitive Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġwrite Direct : Ġ( buffer : ĠBuffer , Ġoffset : ĠInt ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġlong Value : Ġ() Ġ-> ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbuffer . size ĊĠĠĠĠĠĠĠ Ġval Ġtarget Limit Ġ= Ġoffset Ġ+ Ġprimitive Size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġtarget Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġtarget Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwrite Direct ( buffer , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ== Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġbuffer Ġex hausted , Ġwe Ġcannot Ġexpand Ġdata Ġin Ġthis Ġbuffer , ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġknow Ġwe Ġare Ġat Ġzero Ġposition Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġprimitive Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġprimitive Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwrite Direct ( buffer , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo pe , Ġdoesn 't Ġfit Ġin Ġa Ġbuffer , Ġread Ġbyte Ġby Ġbyte ĊĠĠĠĠĠĠĠ Ġwrite Bytes ( primitive Size , Ġlong Value ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Bytes ( primitive Size : ĠInt , Ġvalue : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 8 Ġ-- Ġmax Ġsize Ġa ka ĠLong . SIZE _ BYTES , Ġwrite Ġin ĠBE Ġ( most Ġsignificant Ġbyte Ġfirst ) ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Value Ġ= Ġvalue . reverse Byte Order () Ġshr Ġ(( 8 Ġ- Ġprimitive Size ) Ġ* Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġbuffer . size ĊĠĠĠĠĠĠĠ Ġrepeat ( primitive Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbuffer . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . store Byte At ( position ++, Ġremaining Value . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Value Ġ= Ġremaining Value Ġshr Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }