package Ġdev . kom u . kr aken . model . region Ċ Ċ import Ġdev . kom u . kr aken . utils . random Int Ċ import Ġjava . util .* Ċ Ċ class ĠMutable Cell Set ( val Ġregion : ĠRegion ): ĠAbstract Set < Cell >(), ĠCell Set Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcells Ġ= ĠBit Set ( region . width Ġ* Ġregion . height ) ĊĊĠĠĠ Ġprivate Ġfun Ġindex ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( x Ġ>= Ġ 0 Ġ&& Ġx Ġ< Ġregion . width ) Ġ{ Ġ" x Ġout Ġof Ġbounds : Ġ$ x " Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( y Ġ>= Ġ 0 Ġ&& Ġy Ġ< Ġregion . height ) Ġ Ġ{ Ġ" y Ġout Ġof Ġbounds : Ġ$ y " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ+ Ġy Ġ* Ġregion . width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠMutable Cell Set Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMutable Cell Set ( region ) ĊĠĠĠĠĠĠĠ Ġresult . addAll ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrandom Element (): ĠCell Ġ= ĊĠĠĠĠĠĠĠ Ġthis [ random Int ( size )] ĊĊĠĠĠ Ġprivate Ġfun Ġpoint ( index : ĠInt ): ĠCell Ġ= ĊĠĠĠĠĠĠĠ Ġregion [ index Ġ% Ġregion . width , Ġindex Ġ/ Ġregion . width ] ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠCell Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġindex ĊĊĠĠĠĠĠĠĠ Ġrequire ( i Ġ>= Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġbit Ġ= Ġcells . next Set Bit ( 0 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( bit Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i -- Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpoint ( bit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit Ġ= Ġcells . next Set Bit ( bit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" no Ġsuch Ġindex : Ġ$ index ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠCell ) Ġ= Ġadd ( element . coordinate ) ĊĊĠĠĠ Ġfun Ġadd ( c : ĠCoordinate ) Ġ= Ġadd ( c . x , Ġc . y ) ĊĊĠĠĠ Ġfun Ġadd ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġindex ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġcells . get ( index ) ĊĠĠĠĠĠĠĠ Ġcells . set ( index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ! old ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠCell ) Ġ= Ġremove ( element . coordinate . x , Ġelement . coordinate . y ) ĊĊĠĠĠ Ġfun Ġremove ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġindex ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġcells . get ( index ) ĊĠĠĠĠĠĠĠ Ġcells . clear ( index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġold ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġcells . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠCell ) Ġ= Ġcontains ( element . coordinate . x , Ġelement . coordinate . y ) ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( x : ĠInt , Ġy : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġx Ġ>= Ġ 0 Ġ&& Ġx Ġ< Ġregion . width Ġ&& Ġy Ġ>= Ġ 0 Ġ&& Ġy Ġ< Ġregion . height Ġ&& Ġcells . get ( index ( x , Ġy )) ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcells . cardinality () ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < Cell > Ġ= ĠMy Iterator () ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠMy Iterator : ĠMutable Iterator < Cell > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġcells . next Set Bit ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġindex Ġ>= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠCell Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġpoint ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġcells . next Set Bit ( index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} Ċ } Ċ