package Ġcom . ti qu ion op hist . scheduler Ċ Ċ import Ġcom . ti qu ion op hist . core . Assigned Class room Ċ import Ġcom . ti qu ion op hist . core . Schedule Ċ import Ġcom . ti qu ion op hist . core . Subject Ċ import Ġcom . ti qu ion op hist . core . Teacher Ċ Ċ /** Ċ Ġ* ĠSpecifies Ġthe Ġstrategy Ġby Ġwhich Ġclass rooms Ġare Ġassigned Ġto Ġeach Ġlesson . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġjust Ġthe Ġmarker Ġenum Ġfor Ġwhich Ġstrategy Ġis Ġused ; Ġit Ġcan Ġthen Ġ[ make ] Ġa Ġcorresponding Ċ Ġ* Ġ[ Class room Fill Order Instance ] Ġwhich Ġis Ġthe Ġstate ful Ġobject Ġthat Ġdoes Ġactual Ġclass room Ġassignments . Ċ Ġ*/ Ċ enum Ġclass ĠClass room Fill Order ( val Ġdescription : ĠString ) Ġ{ ĊĠĠĠ ĠBY _ TE AC HER (" Te achers Ġare Ġalways Ġassigned Ġto Ġthe Ġsame Ġclass room ; Ġeach Ġclass Ġcomes Ġto Ġthem ."), ĊĊĠĠĠ ĠBY _ CLASS (" Classes Ġare Ġalways Ġassigned Ġto Ġthe Ġsame Ġclass room ; Ġeach Ġteacher Ġcomes Ġto Ġthem ."), ĊĊĠĠĠ ĠBY _ SUBJECT (" Subject s Ġare Ġalways Ġassigned Ġto Ġthe Ġsame Ġclass room ; Ġeach Ġteacher Ġand Ġclass Ġcomes Ġto Ġthem ."), ĊĊĠĠĠ ĠAR BIT R ARY (" Class rooms Ġare Ġassigned Ġar bitr arily ."); ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġnew Ġ[ Class room Fill Order Instance ] Ġbased Ġon Ġthis Ġstrategy Ġwhich Ġcan Ġassign Ġclass rooms Ġfor Ġless ons . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmake (): ĠClass room Fill Order Instance Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ TE AC HER Ġ-> ĠClass room Fill Order Instance . By Teacher () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ CLASS Ġ-> ĠClass room Fill Order Instance . By Class ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ SUBJECT Ġ-> ĠClass room Fill Order Instance . By Subject () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAR BIT R ARY Ġ-> ĠClass room Fill Order Instance . Ar bitrary ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVerifies Ġthat Ġ[ schedule ] Ġhas Ġthe Ġcorrect Ġclass room Ġassignments Ġaccording Ġto Ġthis Ġ[ Class room Fill Order ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġverify ( schedule : ĠSchedule ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ TE AC HER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteacher Class room Numbers Ġ= Ġmutable Map Of < Teacher , ĠInt >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cls Ġin Ġschedule . lessons ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lesson Ġin Ġcls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteacher Ġ= Ġlesson . teacher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass room Ġ= Ġlesson . assigned Class room ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( teacher Ġ!= Ġnull Ġ&& Ġclass room Ġis ĠAssigned Class room . Number ed Class room ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Number Ġ= Ġteacher Class room Numbers [ teacher ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Number Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteacher Class room Numbers [ teacher ] Ġ= Ġclass room . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( expected Number Ġ== Ġclass room . number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ teacher Ġte aches Ġin Ġboth Ġ$ expected Number Ġand Ġ${ class room . number }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ CLASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( class Index , Ġcls ) Ġin Ġschedule . lessons . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lesson Ġin Ġcls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass room Ġ= Ġlesson . assigned Class room ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class room Ġis ĠAssigned Class room . Number ed Class room ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( class room . number Ġ== Ġclass Index Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" class Ġ${ class Index Ġ+ Ġ 1 } Ġwas Ġta ught Ġin Ġclass room Ġ${ class room . number }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠBY _ SUBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Class room Numbers Ġ= Ġmutable Map Of < Subject , ĠInt >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cls Ġin Ġschedule . lessons ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lesson Ġin Ġcls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= Ġlesson . subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass room Ġ= Ġlesson . assigned Class room ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class room Ġis ĠAssigned Class room . Number ed Class room ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Number Ġ= Ġsubject Class room Numbers [ subject ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Number Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Class room Numbers [ subject ] Ġ= Ġclass room . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( expected Number Ġ== Ġclass room . number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ subject Ġis Ġta ught Ġin Ġboth Ġ$ expected Number Ġand Ġ${ class room . number }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAR BIT R ARY Ġ-> ĠUnit Ġ// Ġno - op : Ġarbitrary ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġpossibly Ġstate ful Ġimplementation Ġof Ġa Ġ[ Class room Fill Order ], Ġwhich Ġcan Ġproduce Ġvalid Ġclass rooms Ġfor Ġa Ġlesson Ġvia Ċ Ġ* Ġ[ assign Next ]. Ċ Ġ*/ Ċ sealed Ġinterface ĠClass room Fill Order Instance Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġset Ġof Ġ[ Assigned Class room ] s Ġwhich Ġcan Ġbe Ġused Ġfor Ġthe Ġlesson Ġwith Ġthe Ġgiven Ġparameters . ĠIf Ġthe ĊĠĠĠĠ Ġ* Ġ[ subject ] Ġmust Ġbe Ġta ught Ġin Ġparticular Ġ[ Assigned Class room . Named Class room ] s , Ġthose Ġwill Ġbe Ġreturned . ĠOtherwise , Ġa ĊĠĠĠĠ Ġ* Ġsingle Ġ[ Assigned Class room . Number ed Class room ] Ġis Ġreturned Ġin Ġwhich Ġthe Ġclass Ġshould Ġtake Ġplace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġassign Next ( ĊĠĠĠĠĠĠĠ Ġclass Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġsubject : ĠSubject , ĊĠĠĠĠĠĠĠ Ġteacher : ĠTe acher , ĊĠĠĠĠĠĠĠ Ġoccupied Class rooms : ĠSet < Assigned Class room >, ĊĠĠĠ Ġ): ĠSet < Assigned Class room > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġmapping Ġ[ Subject . class rooms ] Ġto Ġtheir Ġ[ Assigned Class room . Named Class room ] s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠSubject . assigned Class rooms : ĠSet < Assigned Class room . Named Class room >? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclass rooms ?. let Ġ{ Ġsubject Class rooms Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Class rooms . map To ( mutable Set Of ()) Ġ{ ĠAssigned Class room . Named Class room ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBy Teacher Ġ: ĠClass room Fill Order Instance Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnext Class room Number : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġteacher Class rooms Ġ= Ġmutable Map Of < Teacher , ĠAssigned Class room . Number ed Class room >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassign Next ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject : ĠSubject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteacher : ĠTe acher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Class rooms : ĠSet < Assigned Class room >, ĊĠĠĠĠĠĠĠ Ġ): ĠSet < Assigned Class room > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . assigned Class rooms ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteacher Class rooms . compute If Absent ( teacher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssigned Class room . Number ed Class room ( next Class room Number ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠBy Class Ġ: ĠClass room Fill Order Instance Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassign Next ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject : ĠSubject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteacher : ĠTe acher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Class rooms : ĠSet < Assigned Class room >, ĊĠĠĠĠĠĠĠ Ġ): ĠSet < Assigned Class room > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . assigned Class rooms ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset Of ( Assigned Class room . Number ed Class room ( number Ġ= Ġclass Index Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBy Subject Ġ: ĠClass room Fill Order Instance Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnext Class room Number : ĠInt Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsubject Class rooms Ġ= Ġmutable Map Of < Subject , ĠAssigned Class room . Number ed Class room >() ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassign Next ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject : ĠSubject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteacher : ĠTe acher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Class rooms : ĠSet < Assigned Class room >, ĊĠĠĠĠĠĠĠ Ġ): ĠSet < Assigned Class room > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . assigned Class rooms ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Class rooms . compute If Absent ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssigned Class room . Number ed Class room ( next Class room Number ++) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠAr bitrary Ġ: ĠClass room Fill Order Instance Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassign Next ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject : ĠSubject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġteacher : ĠTe acher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoccupied Class rooms : ĠSet < Assigned Class room >, ĊĠĠĠĠĠĠĠ Ġ): ĠSet < Assigned Class room > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . assigned Class rooms ?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Occup ied Number Ġ= Ġoccupied Class rooms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. max Of OrNull Ġ{ Ġ( it Ġas ? ĠAssigned Class room . Number ed Class room )?. number Ġ?: Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġset Of ( Assigned Class room . Number ed Class room ( number Ġ= Ġmax Occup ied Number Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ