package Ġkotlinx . coroutines . experimental . io . buffers Ċ Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlinx . coroutines . experimental . io .* Ċ import Ġkotlinx . coroutines . experimental . io . internal .* Ċ import Ġkotlinx . coroutines . experimental . io . packet .* Ċ Ċ internal Ġclass ĠBuffer View Ġprivate Ġconstructor ( private Ġvar Ġcontent : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġorigin : ĠBuffer View ?) Ġ{ ĊĊĠĠĠ Ġconstructor ( pool : ĠObject Pool < ByteBuffer >) Ġ: Ġthis ( pool . borrow (), Ġnull ) ĊĠĠĠ Ġconstructor ( buffer : ĠByteBuffer ) Ġ: Ġthis ( buffer , Ġnull ) ĊĊĠĠĠ Ġprivate Ġvar Ġduplicated : ĠByteBuffer ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlimit Ġ= Ġcontent . limit () ĊĠĠĠ Ġprivate Ġvar Ġread Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġwrite Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġref Count Ġ= Ġatomic ( 1 L ) ĊĊĠĠĠ Ġvar Ġnext : ĠBuffer View ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ=== Ġthis ) Ġthrow ĠIllegalArgumentException (" next Ġ== Ġthis ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġattachment : ĠAny ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġorder : ĠByte Order Ġ= ĠByte Order . BIG _ ENDIAN ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . order ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġval Ġread Remaining : ĠInt Ġget () Ġ= Ġwrite Position Ġ- Ġread Position ĊĠĠĠ Ġinline Ġval Ġwrite Remaining : ĠInt Ġget () Ġ= Ġlimit Ġ- Ġwrite Position ĊĊĠĠĠ Ġval Ġstart Gap : ĠInt Ġget () Ġ= Ġread Position ĊĠĠĠ Ġval Ġend Gap : ĠInt Ġget () Ġ= Ġlimit Ġ- Ġwrite Position ĊĊĠĠĠ Ġfun Ġhas Remaining () Ġ= Ġwrite Position Ġ> Ġread Position ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . order ( order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ) Ġ= Ġcontent . get ( index ) ĊĠĠĠ Ġoperator Ġfun Ġset ( index : ĠInt , Ġvalue : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put ( index , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Byte (): ĠByte Ġ= Ġread ( 1 ) Ġ{ Ġcontent . get ( it ) Ġ} ĊĠĠĠ Ġfun Ġread Short (): ĠShort Ġ= Ġread ( 2 ) Ġ{ Ġcontent . get Short ( it ) Ġ} ĊĠĠĠ Ġfun Ġread Int (): ĠInt Ġ Ġ= Ġread ( 4 ) Ġ{ Ġcontent . getInt ( it ) Ġ} ĊĠĠĠ Ġfun Ġread Long (): ĠLong Ġ= Ġread ( 8 ) Ġ{ Ġcontent . getLong ( it ) Ġ} ĊĠĠĠ Ġfun Ġread Float (): ĠFloat Ġ= Ġread ( 4 ) Ġ{ Ġcontent . get Float ( it ) Ġ} ĊĠĠĠ Ġfun Ġread Double () Ġ= Ġread ( 8 ) Ġ{ Ġcontent . getDouble ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġdiscard Exact ( n : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġread Position Ġ+ Ġn ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġwrite Position Ġ- Ġnew Position ĊĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unable Ġto Ġdiscard Ġ$ n Ġbytes : Ġonly Ġ$ read Remaining Ġavailable ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( n Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Discard ing Ġnegative Ġamount Ġof Ġbytes : Ġ$ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġnew Position ĊĠĠĠĠĠĠĠ Ġreturn Ġdelta Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( dst : ĠByteBuffer , Ġsize : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( size Ġ<= Ġdst . remaining ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdup Ġ= Ġread D uplicated ( size ) ĊĠĠĠĠĠĠĠ Ġval Ġactual Size Ġ= Ġdup . remaining () ĊĠĠĠĠĠĠĠ Ġdst . put ( dup ) ĊĠĠĠĠĠĠĠ Ġread Position Ġ+= Ġactual Size ĊĠĠĠĠĠĠĠ Ġreturn Ġactual Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( dst : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrp Ġ= Ġread Position ĊĠĠĠĠĠĠĠ Ġrequire ( write Position Ġ- Ġrp Ġ>= Ġlength ) Ġ{ Ġthrow ĠIndex OutOfBoundsException (" length Ġ> Ġ$ read Remaining ") Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( offset Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( offset Ġ< Ġdst . size ) ĊĠĠĠĠĠĠĠ Ġrequire ( offset Ġ+ Ġlength Ġ<= Ġdst . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdup Ġ= Ġread D uplicated ( length ) ĊĠĠĠĠĠĠĠ Ġdup . get ( dst , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġrp Ġ+ Ġlength ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< R > Ġread ( n : ĠInt , Ġblock : Ġ( Int ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrp Ġ= Ġread Position ĊĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ<= Ġwrite Position Ġ- Ġrp ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġblock ( rp ) ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġrp Ġ+ Ġn ĊĊĠĠĠĠĠĠĠ Ġreturn Ġr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwrite Ġops ĊĊĠĠĠ Ġfun Ġreserve Start Gap ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ<= Ġlimit ) ĊĠĠĠĠĠĠĠ Ġval Ġrp Ġ= Ġread Position ĊĠĠĠĠĠĠĠ Ġif Ġ( rp Ġ!= Ġ 0 ) Ġthrow ĠIllegalStateException (" Can 't Ġreserve Ġ$ n Ġbytes Ġgap : Ġthere Ġis Ġalready Ġa Ġreserved Ġgap Ġ($ rp Ġbytes )") ĊĠĠĠĠĠĠĠ Ġval Ġwp Ġ= Ġwrite Position ĊĠĠĠĠĠĠĠ Ġif Ġ( wp Ġ!= Ġ 0 Ġ|| Ġrp Ġ!= Ġwp ) Ġthrow ĠIllegalStateException (" Can 't Ġreserve Ġ$ n Ġbytes Ġgap : Ġthere Ġare Ġalready Ġbytes Ġwritten Ġat Ġthe Ġbeginning ") ĊĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġrp Ġ+ Ġn ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ= Ġwp Ġ+ Ġn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreserve End Gap ( n : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ<= Ġlimit Ġ- Ġwrite Position ) ĊĠĠĠĠĠĠĠ Ġval Ġactual Limit Ġ= Ġcontent . limit () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( limit Ġ!= Ġactual Limit ) Ġthrow ĠIllegalStateException (" Can 't Ġreserve Ġ$ n Ġbytes Ġgap : Ġthere Ġis Ġalready Ġa Ġreserved Ġgap Ġ(${ actual Limit Ġ- Ġlimit } Ġbytes )") ĊĠĠĠĠĠĠĠ Ġval Ġnew Limit Ġ= Ġactual Limit Ġ- Ġn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new Limit Ġ< Ġwrite Position ) Ġthrow ĠIllegalStateException (" Can 't Ġreserve Ġ$ n Ġbytes Ġgap : Ġthere Ġare Ġalready Ġbytes Ġwritten Ġat Ġthe Ġend Ġ- Ġnot Ġenough Ġspace Ġto Ġreserve ") ĊĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġnew Limit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Byte ( v : ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Short ( v : ĠShort ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put Short ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Int ( v : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put Int ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġ 4 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Long ( v : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put Long ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġ 8 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Float ( v : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put Float ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġ 4 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Double ( v : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent . put Double ( write Position , Ġv ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġ 8 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( array : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġwrite D uplicated ( length ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( array , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġlength ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( bb : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġbb . remaining () ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġwrite D uplicated ( size ) ĊĠĠĠĠĠĠĠ Ġbuffer . put ( bb ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Buffer ( other : ĠBuffer View , Ġlimit : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġother Size Ġ= Ġother . limit - Ġother . read Position ĊĠĠĠĠĠĠĠ Ġval Ġmy Size Ġ= Ġlimit Ġ- Ġwrite Position ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( limit , Ġother Size , Ġmy Size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Buffer Ġ= Ġwrite D uplicated ( size ) ĊĠĠĠĠĠĠĠ Ġval Ġother Buffer Ġ= Ġother . read D uplicated ( size ) ĊĊĠĠĠĠĠĠĠ Ġmy Buffer . put ( other Buffer ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġother . read Position Ġ+= Ġsize ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Buffer Prepend ( other : ĠBuffer View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġother . read Remaining ĊĠĠĠĠĠĠĠ Ġval Ġrp Ġ= Ġread Position ĊĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġrp ) Ġthrow ĠIllegalArgumentException (" Can 't Ġprepend Ġbuffer : Ġnot Ġenough Ġfree Ġspace Ġin Ġthe Ġbeginning ") ĊĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġduplicated () ĊĠĠĠĠĠĠĠ Ġto . limit ( rp ) ĊĠĠĠĠĠĠĠ Ġto . position ( rp Ġ- Ġsize ) ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġother . read D uplicated ( Int . MAX _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġto . put ( from ) ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġrp Ġ- Ġsize ĊĠĠĠĠĠĠĠ Ġother . read Position Ġ+= Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCould Ġwrite Ġover Ġthe Ġend Ġgap ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Buffer Append ( other : ĠBuffer View , ĠmaxSize : ĠInt Ġ= ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( other . read Remaining , ĠmaxSize ) ĊĠĠĠĠĠĠĠ Ġval Ġwp Ġ= Ġwrite Position ĊĠĠĠĠĠĠĠ Ġval Ġactual Limit Ġ= Ġcontent . limit () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( wp Ġ+ Ġsize Ġ> Ġactual Limit ) Ġthrow ĠIllegalArgumentException (" Can 't Ġappend Ġbuffer : Ġnot Ġenough Ġfree Ġspace Ġin Ġthe Ġend ") ĊĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġwrite D uplicated ( size ) ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġother . read D uplicated ( size ) ĊĊĠĠĠĠĠĠĠ Ġto . put ( from ) ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġmax Of ( limit , Ġwrite Position ) ĊĠĠĠĠĠĠĠ Ġother . read Position Ġ+= Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĊĠĠĠ Ġfun Ġpush Back ( n : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrp Ġ= Ġread Position ĊĠĠĠĠĠĠĠ Ġval Ġnew Rp Ġ= Ġrp Ġ- Ġn ĊĠĠĠĠĠĠĠ Ġif Ġ( new Rp Ġ< Ġ 0 ) Ġthrow ĠIllegalStateException (" Nothing Ġto Ġpush Ġback ") ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġnew Rp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset For Write () Ġ{ ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset For Read () Ġ{ ĊĠĠĠĠĠĠĠ Ġread Position Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwrite Position Ġ= Ġlimit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Ex clus ively Owned (): ĠBoolean Ġ= Ġref Count . value Ġ== Ġ 1 L ĊĊĠĠĠ Ġfun Ġmake View (): ĠBuffer View Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Origin Ġ= Ġorigin Ġ?: Ġthis ĊĠĠĠĠĠĠĠ Ġnew Origin . acquire () ĊĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠBuffer View ( content , Ġnew Origin ) ĊĠĠĠĠĠĠĠ Ġview . attachment Ġ= Ġattachment ĊĠĠĠĠĠĠĠ Ġview . read Position Ġ= Ġread Position ĊĠĠĠĠĠĠĠ Ġview . write Position Ġ= Ġwrite Position ĊĠĠĠĠĠĠĠ Ġview . limit Ġ= Ġlimit ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease ( pool : ĠObject Pool < Buffer View >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( release RefCount ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset For Write () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( origin Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunlink () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin . release ( pool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpool . recycle ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġread Direct ( block : Ġ( ByteBuffer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbb Ġ= Ġread D uplicated ( read Remaining ) ĊĠĠĠĠĠĠĠ Ġval Ġposition Before Ġ= Ġbb . position () ĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġbb . limit () ĊĠĠĠĠĠĠĠ Ġblock ( bb ) ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġbb . position () Ġ- Ġposition Before ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ< Ġ 0 ) Ġthrow ĠIllegalStateException (" Wrong Ġbuffer Ġposition Ġchange : Ġnegative Ġshift Ġ$ delta ") ĊĠĠĠĠĠĠĠ Ġif Ġ( bb . limit () Ġ!= Ġlimit ) Ġthrow ĠIllegalStateException (" Limit Ġchange Ġis Ġnow Ġallowed ") ĊĊĠĠĠĠĠĠĠ Ġread Position Ġ+= Ġdelta ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġwrite Direct ( size : ĠInt , Ġblock : Ġ( ByteBuffer ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrem Ġ= Ġwrite Remaining ĊĠĠĠĠĠĠĠ Ġrequire Ġ( size Ġ<= Ġrem ) Ġ{ Ġ" size Ġ$ size Ġis Ġgreater Ġthan Ġbuffer 's Ġremaining Ġcapacity Ġ$ rem " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġwrite D uplicated ( rem ) ĊĠĠĠĠĠĠĠ Ġval Ġposition Before Ġ= Ġbuffer . position () ĊĠĠĠĠĠĠĠ Ġblock ( buffer ) ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġbuffer . position () Ġ- Ġposition Before ĊĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ< Ġ 0 Ġ|| Ġdelta Ġ> Ġrem ) Ġthrow ĠIllegalStateException (" Wrong Ġbuffer Ġposition Ġchange : Ġ$ delta Ġ( position Ġshould Ġbe Ġmoved Ġforward Ġonly Ġby Ġat Ġmost Ġsize Ġbytes Ġ( size Ġ= Ġ Ġ$ size )") ĊĊĠĠĠĠĠĠĠ Ġwrite Position Ġ+= Ġdelta ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread D uplicated ( limit : ĠInt ): ĠByteBuffer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġread Position ĊĠĠĠĠĠĠĠ Ġval Ġup Limit Ġ= Ġ( position . to Long () Ġ+ Ġlimit ). coerce At Most ( Int . MAX _ VALUE . to Long ()). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġduplicated () ĊĠĠĠĠĠĠĠ Ġbuffer . limit ( min Of ( write Position , Ġup Limit )) ĊĠĠĠĠĠĠĠ Ġbuffer . position ( position ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite D uplicated ( limit : ĠInt ): ĠByteBuffer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġwrite Position ĊĠĠĠĠĠĠĠ Ġval Ġup Limit Ġ= Ġ( position . to Long () Ġ+ Ġlimit ). coerce At Most ( Int . MAX _ VALUE . to Long ()). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġduplicated () ĊĠĠĠĠĠĠĠ Ġbuffer . limit ( min Of ( this . limit , Ġup Limit )) ĊĠĠĠĠĠĠĠ Ġbuffer . position ( position ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġduplicated (): ĠByteBuffer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġduplicated Ġ?: Ġcontent . duplicate () !!. also Ġ{ Ġduplicated Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunlink (): ĠByteBuffer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠEmpty Buffer ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġcontent ĊĊĠĠĠĠĠĠĠ Ġif Ġ( buffer Ġ=== Ġempty ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġempty ĊĠĠĠĠĠĠĠ Ġduplicated Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease RefCount (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġref Count . update AndGet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ 0 L ) Ġthrow ĠIllegalStateException (" Unable Ġto Ġrelease : Ġalready Ġreleased ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ- Ġ 1 L ĊĠĠĠĠĠĠĠ Ġ} Ġ== Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġacquire () Ġ{ ĊĠĠĠĠĠĠĠ Ġref Count . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ 0 L ) Ġthrow ĠIllegalStateException (" Unable Ġto Ġacquire : Ġalready Ġreleased ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+ Ġ 1 L ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġobject ĠPool Ġ: ĠObject Pool Impl < Buffer View >( PACKET _ BUFFER _ POOL _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġproduce Instance () Ġ= ĠBuffer View ( ByteBuffer . allocate Direct ( PACKET _ BUFFER _ SIZE )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclear Instance ( instance : ĠBuffer View ): ĠBuffer View Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachment Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġcontent . limit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ref Count . compare AndSet ( 0 L , Ġ 1 L )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unable Ġto Ġprepare Ġbuffer : Ġref Count Ġis Ġnot Ġzero Ġ( used Ġwhile Ġpar ked Ġin Ġthe Ġpool ?) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvalidate Instance ( instance : ĠBuffer View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( instance . ref Count . value Ġ== Ġ 0 L ) Ġ{ Ġ" Buffer Ġis Ġnot Ġyet Ġreleased Ġbut Ġtried Ġto Ġre cycle " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( instance . origin Ġ== Ġnull ) Ġ{ Ġ" Unable Ġto Ġre cycle Ġbuffer Ġview , Ġonly Ġorigin Ġbuffers Ġare Ġapplicable " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEmpty Buffer Ġ= ĠByteBuffer . allocate ( 0 ) !! ĊĊĠĠĠĠĠĠĠ Ġval ĠEmpty Ġ= ĠBuffer View ( Empty Buffer ) ĊĠĠĠ Ġ} Ċ }