package Ġse . k th . sp ork . base 3 dm Ċ Ċ import Ġjava . util . Collections Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġchange Ġset Ġin Ġ 3 DM Ġmerge . ĠWhile Ġa Ġchange Ġset Ġin Ġpure Ġ 3 DM Ġmerge Ġis Ġjust Ġall Ġcontent Ġtuples Ġand ĠP CS Ċ Ġ* Ġtrip les Ġput Ġtogether , Ġthis Ġchange Ġset Ġsepar ates Ġcontent Ġand Ġstructure Ġinto Ġseparate Ġsets , Ġand Ġalso Ġintroduces Ċ Ġ* Ġsome Ġhelper Ġfunctionality Ġto Ġkeep Ġtrack Ġof Ġconflicts Ġand Ġenable Ġfaster Ġlookup Ġof ĠP CS Ġtrip les . Ċ Ġ* Ċ Ġ* Ġ@ author ĠSimon ĠL ars Ã©n Ċ Ġ*/ Ċ class ĠChange Set < T Ġ: ĠListNode , ĠV >( private Ġval Ġclass Rep Map : ĠMap < T , ĠT >, ĠgetContent : Ġ( T ) Ġ-> ĠV , Ġvar arg Ġtrees : ĠSet < P cs < T >>) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsuccess ors : ĠMutable Map < T , ĠMutable Set < P cs < T >>> ĊĠĠĠ Ġprivate Ġval Ġpre decess ors : ĠMutable Map < T , ĠMutable Set < P cs < T >>> ĊĊĠĠĠ Ġprivate Ġval Ġ_ struct ural Conflict s : ĠMutable Map < P cs < T >, ĠMutable Set < P cs < T >>> ĊĠĠĠ Ġval Ġstructural Conflict s : ĠMap < P cs < T >, ĠSet < P cs < T >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ struct ural Conflict s . toMap () ĊĊĠĠĠ Ġprivate Ġval Ġ_ pcs Set : ĠMutable Set < P cs < T >> ĊĠĠĠ Ġval Ġp cs Set : ĠSet < P cs < T >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ pcs Set . toSet () ĊĊĠĠĠ Ġprivate Ġval Ġ_ content : ĠMutable Map < T , ĠMutable Set < Content < T , ĠV >>> ĊĠĠĠ Ġval Ġcontents : ĠMap < T , ĠMutable Set < Content < T , ĠV >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠHashMap (_ content ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġp cs ĠA ĠP CS Ġtriple . ĊĠĠĠĠ Ġ* Ġ@ return ĠAll ĠP CS es Ġthat Ġare Ġroot Ġconflicting Ġwith Ġthe Ġprovided ĠP CS . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Other Roots ( pcs : ĠP cs < T >): ĠList < P cs < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsequence Of ( pcs . pre decessor , Ġp cs . success or ). flatMap Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Of ( pre decess ors [ node ], Ġsuccess ors [ node ]). filter NotNull (). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . root Ġ!= Ġp cs . root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġp cs ĠA ĠP CS Ġtriple . ĊĠĠĠĠ Ġ* Ġ@ return ĠAll ĠP CS es Ġthat Ġare Ġsuccess or Ġconflicting Ġwith Ġthe Ġprovided ĠP CS . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Other Success ors ( pcs : ĠP cs < T >): ĠList < P cs < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( pre decess ors [ pcs . pre decessor ] Ġ?: Ġset Of < P cs < T >> ()). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . success or Ġ!= Ġp cs . success or ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġp cs ĠA ĠP CS Ġtriple . ĊĠĠĠĠ Ġ* Ġ@ return ĠAll ĠP CS es Ġthat Ġare Ġpre decessor Ġconflicting Ġwith Ġthe Ġprovided ĠP CS . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Other Pre decess ors ( pcs : ĠP cs < T >): ĠList < P cs < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( success ors [ pcs . success or ] Ġ?: Ġempty Set < P cs < T >> ()). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . pre decessor Ġ!= Ġp cs . pre decessor ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġnode ĠA Ġnode .. ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcontent Ġassociated Ġwith Ġthe Ġargument Ġnode , Ġor Ġan Ġempty Ġset Ġif Ġno Ġcontent Ġwas Ġassociated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetContent ( node : ĠT ): ĠSet < Content < T , ĠV >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCollections . unmodifiable Set (_ content [ node ] Ġ?: Ġempty Set ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġp cs ĠA ĠP CS Ġtriple . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġiff Ġthe Ġargument Ġis Ġcontained Ġin Ġthis ĠT *. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcontains ( pcs : ĠP cs < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpre decess ors [ pcs . pre decessor ]?. contains ( pcs ) Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġcont ĠA ĠContent Ġcontainer . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġiff Ġthe Ġargument Ġis Ġcontained Ġin Ġthis ĠT *. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġcontains ( cont : ĠContent < T , ĠV >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ content [ cont . context . pre decessor ]?. contains ( cont ) Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġcontent Ġfor Ġsome Ġp cs Ġtriple , Ġover writing Ġanything Ġthat Ġwas Ġthere Ġpreviously . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode ĠA Ġnode Ġto Ġassociate Ġthe Ġcontent Ġwith . ĠThis Ġis Ġthe Ġkey Ġin Ġthe Ġbacking Ġmap . ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Contents ĠA Ġset Ġof Ġcontent Ġvalues Ġto Ġassociate Ġwith Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Content ( node : ĠT , Ġnode Contents : ĠMutable Set < Content < T , ĠV >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ content [ node ] Ġ= Ġnode Contents ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġthe ĠP CS Ġfrom Ġall Ġlookup Ġtables , Ġexcept Ġfor Ġthe Ġcontents Ġtable . ĠAlso Ġremove Ġit Ġfrom Ġthe Ġ* - set . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġp cs ĠA ĠP CS Ġtriple . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( pcs : ĠP cs < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpred Ġ= Ġp cs . pre decessor ĊĠĠĠĠĠĠĠ Ġval Ġsucc Ġ= Ġp cs . success or ĊĠĠĠĠĠĠĠ Ġpre decess ors [ pred ] !!. remove ( pcs ) ĊĠĠĠĠĠĠĠ Ġsuccess ors [ succ ] !!. remove ( pcs ) ĊĠĠĠĠĠĠĠ Ġ_ pcs Set . remove ( pcs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġcont ĠContent Ġto Ġremove Ġfrom Ġthis ĠT *. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( cont : ĠContent < T , ĠV >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ content [ cont . context . pre decessor ] !!. remove ( cont ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġa Ġconflict Ġin Ġa Ġbi - direction al Ġlookup Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfirst ĠA ĠP CS Ġtriple Ġthat Ġconflicts Ġwith Ġsecond . ĊĠĠĠĠ Ġ* Ġ@ param Ġsecond ĠA ĠP CS Ġtriple Ġthat Ġconflicts Ġwith Ġfirst . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister Structural Conflict ( first : ĠP cs < T >, Ġsecond : ĠP cs < T >) Ġ{ ĊĠĠĠĠĠĠĠ ĠaddTo Lookup Table ( first , Ġsecond , Ġ_ struct ural Conflict s ) ĊĠĠĠĠĠĠĠ ĠaddTo Lookup Table ( second , Ġfirst , Ġ_ struct ural Conflict s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġtree Ġto Ġthis ĠT *. ĠThis Ġent ails Ġconverting Ġthe Ġentire ĠP CS Ġtree Ġto Ġits Ġclass Ġrepresent atives . ĠEach ĊĠĠĠĠ Ġ* Ġ" class Ġrepresentative ĠP CS " Ġis Ġthen Ġadded Ġto Ġthe Ġpre decessor Ġand Ġsuccess or Ġlookup Ġtables , Ġand Ġtheir Ġcontents ĊĠĠĠĠ Ġ* Ġare Ġadded Ġto Ġthe Ġcontent Ġlookup Ġtable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtree ĠA ĠP CS Ġtree Ġstructure . ĊĠĠĠĠ Ġ* Ġ@ param ĠgetContent ĠA Ġfunction Ġthat Ġreturns Ġthe Ġcontent Ġof Ġa ĠT Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd ( tree : ĠSet < P cs < T >>, ĠgetContent : Ġ( T ) Ġ-> ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( pcs Ġin Ġtree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Rep P cs Ġ= ĠaddTo Star ( pcs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpred Ġ= Ġp cs . pre decessor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Rep Pred Ġ= Ġclass Rep P cs . pre decessor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Rep Suc c Ġ= Ġclass Rep P cs . success or ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Lookup Table ( class Rep Pred , Ġclass Rep P cs , Ġpre decess ors ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Lookup Table ( class Rep Suc c , Ġclass Rep P cs , Ġsuccess ors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pred . is Virtual ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= ĠContent ( pcs , ĠgetContent ( pred ), Ġpred . revision ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Lookup Table ( class Rep Pred , Ġc , Ġ_ content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠaddTo Star ( pcs : ĠP cs < T >): ĠP cs < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġclass Rep Map [ pcs . root ] Ġ?: Ġerror ("${ pcs . root } Ġnot Ġin Ġclass Ġrepresent atives ") ĊĠĠĠĠĠĠĠ Ġval Ġpred Ġ= Ġclass Rep Map [ pcs . pre decessor ] Ġ?: Ġerror ("${ pcs . pre decessor } Ġnot Ġin Ġclass Ġrepresent atives ") ĊĠĠĠĠĠĠĠ Ġval Ġsucc Ġ= Ġclass Rep Map [ pcs . success or ] Ġ?: Ġerror ("${ pcs . success or } Ġnot Ġin Ġclass Ġrepresent atives ") ĊĠĠĠĠĠĠĠ Ġval Ġclass Rep P cs Ġ= ĠP cs ( root , Ġpred , Ġsucc , Ġp cs . revision ) ĊĠĠĠĠĠĠĠ Ġ_ pcs Set . add ( class Rep P cs ) ĊĠĠĠĠĠĠĠ Ġreturn Ġclass Rep P cs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< K , ĠV > ĠaddTo Lookup Table ( key : ĠK , Ġ` val `: ĠV , Ġlookup : ĠMutable Map < K , ĠMutable Set < V >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġlookup . get OrDefault ( key , ĠHashSet ()) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values . isEmpty ()) Ġlookup [ key ] Ġ= Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add (` val `) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa ĠT * Ġfrom Ġthe Ġprovided Ġtrees , Ġusing Ġthe Ġclass Ġrepresent atives Ġmap Ġto Ġmap Ġeach Ġnode Ġto Ġits Ġclass ĊĠĠĠĠ Ġ* Ġrepresentative . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġclass Rep Map ĠA Ġmap Ġmapping Ġeach Ġnode Ġto Ġits Ġclass Ġrepresentative . ĊĠĠĠĠ Ġ* Ġ@ param ĠgetContent ĠA Ġfunction Ġfor Ġgetting Ġcontent Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġtrees ĠThe Ġtrees Ġto Ġadd Ġto Ġthis ĠT *. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsuccess ors Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġpre decess ors Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġ_ content Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġ_ pcs Set Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġ_ struct ural Conflict s Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġtrees . forEach Ġ{ Ġt : ĠSet < P cs < T >> Ġ-> Ġadd ( t , ĠgetContent ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ