/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . core . cr dt Ċ Ċ import Ġkotlin . math . max Ċ Ċ /** ĠDen otes Ġan Ġindividual Ġactor Ġresponsible Ġfor Ġmodifications Ġto Ġa ĠCR DT . Ġ*/ Ċ type alias ĠActor Ġ= ĠString Ċ Ċ /** ĠType Ġof Ġthe Ġversion Ġused Ġin Ġa Ġ[ Version Map ]. Ġ*/ Ċ type alias ĠVersion Ġ= ĠInt Ċ Ċ /** ĠVector Ġclock Ġimplementation . Ġ*/ Ċ class ĠVersion Map ( initial Data : ĠMap < Actor , ĠVersion > Ġ= Ġempty Map ()) Ġ{ ĊĠ Ġconstructor ( initial Data : ĠVersion Map ) Ġ: Ġthis ( initial Data . back ing Map ) ĊĠ Ġconstructor ( var arg Ġinitial Data : ĠPair < Actor , ĠVersion >) Ġ: Ġthis ( map Of (* initial Data )) ĊĠ Ġconstructor ( actor : ĠActor , Ġversion : ĠVersion ) Ġ: Ġthis ( map Of ( actor Ġto Ġversion )) ĊĊĠ Ġval Ġbacking Map Ġ= ĠHashMap ( initial Data ) ĊĊĠ Ġ/** ĠThe Ġnumber Ġof Ġentries Ġin Ġthe Ġ[ Version Map ]. Ġ*/ ĊĠ Ġval Ġsize : ĠInt ĊĠĠĠ Ġget () Ġ= Ġbacking Map . size ĊĊĠ Ġ/** ĠAll Ġdistinct Ġ[ Actor ] s Ġrepresented Ġin Ġthe Ġ[ Version Map ]. Ġ*/ ĊĠ Ġval Ġactors : ĠSet < Actor > ĊĠĠĠ Ġget () Ġ= Ġbacking Map . keys ĊĊĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthis Ġ[ Version Map ] Ġis Ġempty . Ġ*/ ĊĠ Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġbacking Map . isEmpty () ĊĊĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthis Ġ[ Version Map ] Ġcontains Ġitems . Ġ*/ ĊĠ Ġfun Ġis NotEmpty (): ĠBoolean Ġ= Ġ! isEmpty () ĊĊĠ Ġ/** ĠCreates Ġa Ġdeep Ġcopy Ġof Ġthis Ġ[ Version Map ]. Ġ*/ ĊĠ Ġ// Ġto Mutable Map Ġis Ġdocumented Ġto Ġcopy Ġthe Ġdata . ĊĠ Ġfun Ġcopy (): ĠVersion Map Ġ= ĠVersion Map ( this . back ing Map . to Mutable Map ()) ĊĊĠ Ġ/** ĠIncrement Ġthe Ġversion Ġfor Ġthe Ġprovided Ġ` name ` Ġ*/ ĊĠ Ġfun Ġincrement ( name : ĠString ) Ġ= Ġthis . also Ġ{ Ġit [ name ] ++ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠGets Ġa Ġthe Ġcurrent Ġ[ Version ] Ġfor Ġa Ġgiven Ġ[ Actor ], Ġor Ġ[ DEFAULT _ VERSION ] Ġif Ġno Ġvalue Ġhas Ġbeen ĊĠĠ Ġ* Ġset . ĊĠĠ Ġ*/ ĊĠ Ġoperator Ġfun Ġget ( key : ĠActor ): ĠVersion Ġ= Ġbacking Map [ key ] Ġ?: ĠDEFAULT _ VERSION ĊĊĠ Ġ/** ĠSets Ġthe Ġcurrent Ġ[ Version ] Ġfor Ġa Ġgiven Ġ[ Actor ]. Ġ*/ ĊĠ Ġoperator Ġfun Ġset ( key : ĠActor , Ġvalue : ĠVersion ) Ġ{ ĊĠĠĠ Ġbacking Map [ key ] Ġ= Ġvalue ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthis Ġ[ Version Map ] Ġcontains Ġa Ġvalue Ġfor Ġthe Ġgiven Ġ[ Actor ]. Ġ*/ ĊĠ Ġoperator Ġfun Ġcontains ( actor : ĠActor ): ĠBoolean Ġ= Ġactor Ġin Ġbacking Map ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDetermines Ġwhether Ġor Ġnot Ġthis Ġ[ Version Map ] Ġ' dom inates ' Ġanother . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠA Ġ[ Version Map ] Ġis Ġsaid Ġto Ġdom inate Ġanother Ġ[ Version Map ] Ġif Ġand Ġonly Ġif , Ġfor Ġall ĊĠĠ Ġ* Ġ`( a _ O : Ġ[ Actor ], Ġv _ O : Ġ[ Version ]) ` Ġentry Ġin Ġthe Ġother Ġmap , Ġthere Ġexists Ġa ĊĠĠ Ġ* Ġ`( a _ T : Ġ[ Actor ], Ġv _ T : Ġ[ Version ]) ` Ġentry Ġin Ġthis Ġ[ Version Map ] Ġsuch Ġthat : ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ` a _ T Ġ== Ġa _ 0 Ġ&& Ġv _ T Ġ>= Ġv _ 0 ` ĊĠĠ Ġ*/ ĊĠ Ġin fix Ġfun Ġdom inates ( other : ĠVersion Map ): ĠBoolean Ġ= ĊĠĠĠ Ġother . back ing Map . all Ġ{ Ġthis [ it . key ] Ġ>= Ġit . value Ġ} ĊĊĠ Ġin fix Ġfun Ġdoes Not Dom inate ( other : ĠVersion Map ): ĠBoolean Ġ= Ġ!( this Ġdom inates Ġother ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMerge s Ġthis Ġ[ Version Map ] Ġwith Ġanother Ġ[ Version Map ] Ġby Ġtaking Ġthe Ġmaximum Ġversion Ġvalues Ġfor ĊĠĠ Ġ* Ġthe Ġunion Ġof Ġall Ġ[ Actor ] s Ġand Ġreturns Ġthe Ġmerged Ġresult . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ** Note :** ĠDoes Ġnot Ġmodify Ġeither Ġobject . ĊĠĠ Ġ*/ ĊĠ Ġin fix Ġfun Ġmerge With ( other : ĠVersion Map ): ĠVersion Map Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠVersion Map ( back ing Map ) ĊĠĠĠ Ġother . back ing Map . forEach Ġ{ Ġ( actor , Ġversion ) Ġ-> Ġresult [ actor ] Ġ= Ġmax ( version , Ġresult [ actor ]) Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSubtract s Ġthe Ġother Ġ[ Version Map ] Ġfrom Ġthe Ġreceiver Ġand Ġreturns Ġthe Ġactor - by - actor Ġdifference ĊĠĠ Ġ* Ġin Ġa Ġnew Ġ[ Version Map ]. ĠOnly Ġgreater - than - zero Ġdifferences Ġwill Ġbe Ġreturned . ĊĠĠ Ġ*/ ĊĠ Ġoperator Ġfun Ġminus ( other : ĠVersion Map ): ĠVersion Map Ġ{ ĊĠĠĠ Ġ// ĠReturn Ġan Ġempty Ġresult Ġif Ġthe Ġother Ġmap Ġis Ġnewer Ġthan Ġthis Ġone . ĊĠĠĠ Ġif Ġ( other Ġdom inates Ġthis ) Ġreturn ĠVersion Map () ĊĊĠĠĠ Ġreturn ĠVersion Map ( ĊĠĠĠĠĠ Ġbacking Map . map Values Ġ{ Ġ( actor , Ġversion ) Ġ-> Ġversion Ġ- Ġother [ actor ] Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value Ġ> Ġ 0 Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġreturn Ġother Ġis ĠVersion Map Ġ&& Ġbacking Map Ġ== Ġother . back ing Map ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġbacking Map . hashCode () ĊĊĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠ Ġbacking Map . entries ĊĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . key Ġ}. join ToString ( ĊĠĠĠĠĠĠĠ Ġprefix Ġ= Ġ"{ ", Ġpostfix Ġ= Ġ" }" ĊĠĠĠĠĠ Ġ) Ġ{ Ġ"${ it . key }: Ġ${ it . value }" Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĠDefault Ġstarting Ġversion Ġfor Ġany Ġactor . Ġ*/ ĊĠĠĠ Ġconst Ġval ĠDEFAULT _ VERSION : ĠVersion Ġ= Ġ 0 ĊĠ Ġ} Ċ } Ċ