package Ġde . fab max . bin parse Ċ Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġmax Ġon Ġ 1 8 . 1 1 . 2 0 1 5 . Ċ Ġ*/ Ċ Ċ class ĠStruct Instance ( struct Name : ĠString , Ġfields : ĠHashMap < String , ĠField <* >> Ġ= ĠHashMap < String , ĠField <* >> ()) Ġ: ĊĠĠĠĠĠĠĠ ĠContainer Field < HashMap < String , ĠField <* >> >( struct Name , Ġfields ), ĠIterable < Field <* >> Ġby Ġfields . values Ġ{ ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġcontains ( key : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . containsKey ( key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ): ĠField < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . values . find Ġ{ Ġit . index Ġ== Ġindex Ġ} Ġ?: Ġthrow ĠNoSuch Field Exception (" Index Ġnot Ġfound : Ġ$ index ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( name : ĠString ): ĠField < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġname . split To Sequence ('. '). iterator () ĊĠĠĠĠĠĠĠ Ġvar Ġf Name Ġ= Ġpath . next () ĊĠĠĠĠĠĠĠ Ġvar Ġfield Ġ= Ġvalue [ f Name ] Ġ?: Ġthrow ĠNoSuch Field Exception (" No Ġsuch Ġfield : Ġ$ f Name ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Name Ġin Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġis ĠStruct Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġfield [ c Name ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Name Ġ= Ġc Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch Field Exception (" No Ġsuch Ġfield : Ġ$ f Name .$ c Name : Ġ$ f Name Ġhas Ġno Ġchildren ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflat (): ĠIterator < Field <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFl ater ator ( iterator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Child Qualifier ( qual ifier : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . values . find Ġ{ Ġit . has Qualifier ( qual ifier ) Ġ} Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuf . append ("{ Ġ") ĊĠĠĠĠĠĠĠ Ġvalue . values . sorted By Ġ{ Ġit . index Ġ}. forEach Ġ{ Ġbuf . append ( it . name ). append (" Ġ= Ġ"). append ( it ). append ("; Ġ") Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . append (" }") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString ( indent : ĠInt , Ġwith FieldName : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġ.. Ġindent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append (' Ġ') ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġind Ġ= Ġbuf . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( with FieldName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( name ). append (" Ġ= Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuf . append (" {\ n ") ĊĠĠĠĠĠĠĠ Ġvalue . values . sorted By Ġ{ Ġit . index Ġ}. forEach Ġ{ Ġbuf . append ( it . toString ( indent Ġ+ Ġ 2 )). append ('\ n ') Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . append ( ind ). append (' }') ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠFl ater ator ( struct It : ĠIterator < Field <* >>) Ġ: ĠIterator < Field <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack < Iterator < Field <* >> >() ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( struct It ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! stack . isEmpty () Ġ&& Ġ! stack . peek (). hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! stack . isEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠField < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException (" No Ġmore Ġfields ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġstack . peek (). next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġis ĠStruct Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( field . iterator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( field Ġis ĠArray Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . push ( field . iterator ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġput ( field : ĠField <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value . containsKey ( field . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Parse Result Ġalready Ġcontains Ġa Ġfield Ġwith Ġname Ġ" Ġ+ Ġfield . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfield . index Ġ= Ġvalue . size ĊĠĠĠĠĠĠĠ Ġvalue . put ( field . name , Ġfield ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠField <* >. unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġput ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< F Ġ: ĠField <* >> Ġinit Field ( field : ĠF , Ġinit : ĠF . () Ġ-> ĠUnit ): ĠF Ġ{ ĊĠĠĠĠĠĠĠ Ġfield . init () ĊĠĠĠĠĠĠĠ Ġput ( field ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġarray ( name : ĠString , Ġinit : ĠArray Field . () Ġ-> ĠUnit ) Ġ= Ġinit Field ( Array Field ( name ), Ġinit ) ĊĠĠĠ Ġfun Ġint ( name : ĠString , Ġinit : ĠInt Field . () Ġ-> ĠUnit ) Ġ= Ġinit Field ( Int Field ( name , Ġ 0 ), Ġinit ) ĊĠĠĠ Ġfun Ġstring ( name : ĠString , Ġinit : ĠString Field . () Ġ-> ĠUnit ) Ġ= Ġinit Field ( StringField ( name , Ġ""), Ġinit ) ĊĠĠĠ Ġfun Ġstruct ( name : ĠString , Ġinit : ĠStruct Instance . () Ġ-> ĠUnit ) Ġ= Ġinit Field ( Struct Instance ( name ), Ġinit ) Ċ } Ċ Ċ fun Ġstruct ( name : ĠString Ġ= Ġ" anonymous _ struct ", Ġinit : ĠStruct Instance . () Ġ-> ĠUnit ): ĠStruct Instance Ġ{ ĊĠĠĠ Ġval Ġstruct Ġ= ĠStruct Instance ( name ) ĊĠĠĠ Ġstruct . init () ĊĠĠĠ Ġreturn Ġstruct Ċ }