package Ġdev . d res . utilities Ċ Ċ import Ġdev . d res . utilities . extensions . read Ċ import Ġdev . d res . utilities . extensions . write Ċ import Ġorg . eclipse . collections . impl . map . mutable . primitive . Object Boolean HashMap Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . concurrent . locks . Stamp ed Lock Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġl atch Ġthat Ġtracks Ġfor Ġall Ġobject Ġit Ġcontains Ġwhether Ġthey Ġare Ġready Ġ( true ) Ġor Ġnot Ġ( false ). Ċ Ġ* Ċ Ġ* Ġ@ author ĠR alph ĠG asser Ċ Ġ* Ġ@ version Ġ 1 . 1 Ċ Ġ*/ Ċ class ĠReady Latch < T > Ġ{ ĊĊĠĠĠ Ġ/** ĠInternal Ġmap Ġthat Ġmaps Ġobject Ġof Ġtype Ġ[ T ] Ġto Ġits Ġready Ġstate . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= ĠObject Boolean HashMap < T >() ĊĊĠĠĠ Ġ/** ĠInternal Ġlock Ġto Ġmedi ate Ġaccess Ġto Ġmap . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠSt amp ed Lock () ĊĊĠĠĠ Ġprivate Ġvar Ġtimeout : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġa Ġnew Ġobject Ġ[ T ] Ġwith Ġthis Ġ[ Ready Latch ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġo ĠThe Ġobject Ġ[ T ] Ġto Ġregister . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister ( o : ĠT ) Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map . put ( o , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn registers Ġan Ġobject Ġ[ T ] Ġwith Ġthis Ġ[ Ready Latch ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġo ĠThe Ġobject Ġ[ T ] Ġto Ġunregister . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunregister ( o : ĠT ) Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map . remove ( o ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġstate Ġof Ġthis Ġ[ Ready Latch ] Ġas Ġa Ġ[ HashMap ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠCurrent Ġstate Ġof Ġthis Ġ[ Ready Latch ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstate () Ġ= Ġthis . lock . read Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < T , Boolean >() ĊĠĠĠĠĠĠĠ Ġthis . map . forEach KeyValue Ġ{ Ġk , Ġv Ġ-> Ġmap [ k ] Ġ= Ġv } ĊĠĠĠĠĠĠĠ Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġready Ġstate Ġfor Ġthe Ġgiven Ġobject Ġ[ T ] Ġto Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġo ĠThe Ġobject Ġ[ T ] Ġto Ġset Ġthe Ġready Ġstate Ġfor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Ready ( o : ĠT ) Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( this . map . containsKey ( o )) Ġ{ Ġ" Given Ġkey Ġis Ġnot Ġtracked Ġby Ġthis ĠReady Latch Ġinstance . Ġ"} ĊĠĠĠĠĠĠĠ Ġthis . map . put ( o , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġready Ġstate Ġfor Ġthe Ġgiven Ġobject Ġ[ T ] Ġto Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġo ĠThe Ġobject Ġ[ T ] Ġto Ġset Ġthe Ġready Ġstate Ġfor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Un ready ( o : ĠT ) Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( this . map . containsKey ( o )) Ġ{ Ġ" Given Ġkey Ġis Ġnot Ġtracked Ġby Ġthis ĠReady Latch Ġinstance . Ġ"} ĊĠĠĠĠĠĠĠ Ġthis . map . put ( o , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe sets Ġthis Ġ[ Ready Latch ] Ġand Ġthus Ġmoves Ġall Ġregistered Ġobjects Ġto Ġun ready Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout Ġspecifies Ġan Ġoptional Ġtimeout Ġin Ġseconds Ġafter Ġwhich Ġ[ all Ready Or Timed Out ] Ġis Ġconsidered Ġto Ġbe Ġtrue Ġin Ġany Ġcase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġreset ( timeout : ĠLong ? Ġ= Ġnull ) Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map . update Values Ġ{ Ġ_, Ġ_ Ġ-> Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġthis . timeout Ġ= Ġif Ġ( timeout Ġ!= Ġnull ) Ġ( 1 0 0 0 L Ġ* Ġtimeout ) Ġ+ ĠSystem . currentTimeMillis () Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear s Ġthis Ġ[ Ready Latch ] Ġthus Ġremoving Ġall Ġobjects Ġit Ġtracks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ= Ġthis . lock . write Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġand Ġonly Ġif Ġall Ġobjects Ġregistered Ġwith Ġthis Ġ[ Ready Latch ] Ġare Ġin Ġthe Ġready Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġall Ready () Ġ= Ġthis . lock . read Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map . all Satisf y Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠE quivalent Ġto Ġ[ all Ready ] Ġin Ġcase Ġno Ġtimeout Ġwas Ġset Ġin Ġ[ reset ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġall Ready Or Timed Out () Ġ= Ġall Ready () Ġ|| Ġif Ġ( timeout Ġ!= Ġnull ) Ġtimeout Ġ?: ĠLong . MAX _ VALUE Ġ<= ĠSystem . currentTimeMillis () Ġelse Ġfalse Ċ }