package Ġcom . tk str . k ler ik . fixtures Ċ Ċ import Ġcom . tk str . k ler ik . Expression Ċ import Ġcom . tk str . k ler ik . core . Expression Exception Ċ import Ġcom . tk str . k ler ik . core . Operator Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigDecimal . ONE Ċ import Ġjava . math . BigDecimal . ZERO Ċ import Ġjava . math . Round ingMode Ċ Ċ /** Ċ Ġ* ĠOperators Ċ Ġ* Ċ Ġ* Ġ@ author ĠBen ĠTe ich man Ċ Ġ*/ Ċ object ĠOperators Ġ{ ĊĠĠĠ Ġfun ĠADD ITION ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("+ ", Ġ 2 0 , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . add ( v 2 , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠString Ġ&& Ġv 2 Ġis ĠString Ġ-> Ġv 1 . substring ( 0 , Ġv 1 . last Index ) Ġ+ Ġv 2 . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠString Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . substring ( 0 , Ġv 1 . last Index ) Ġ+ Ġv 2 . toString () Ġ+ Ġ"'" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠString Ġ-> Ġ"'" Ġ+ Ġv 1 . toString () Ġ+ Ġv 2 . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠSUB TR ACTION ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("- ", Ġ 2 0 , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . subtract ( v 2 , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMULTI PLICATION ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("* ", Ġ 3 0 , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . multiply ( v 2 , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠString Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġstring Multiply ( v 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠString Ġ-> Ġstring Multiply ( v 2 , Ġv 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstring Multiply ( string : ĠString , Ġmultiplier : ĠBigDecimal ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoriginal Ġ= Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. multiplier . intValue Exact ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( result . isNotEmpty ()) Ġresult . substring ( 0 , Ġresult . last Index ) Ġ+ Ġoriginal . substring ( 1 ) Ġelse Ġoriginal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDIV ISION ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("/", Ġ 3 0 , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . divide ( v 2 , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMOD ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("% ", Ġ 3 0 , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġv 1 . remainder ( v 2 , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠPO WER ( expression : ĠExpression ) Ġ= Ġobject Ġ: ĠOperator ("^ ", Ġ 4 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġas ĠBigDecimal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 Ġas ĠBigDecimal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Of 2 Ġ= Ġv 2 . sign um () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdn 1 Ġ= Ġv 1 . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Pos Ġ= Ġv 2 . multiply ( BigDecimal ( sign Of 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremainder Of 2 Ġ= Ġv 2 Pos . remainder ( ONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn 2 Int Part Ġ= Ġv 2 Pos . subtract ( remainder Of 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Pow Ġ= Ġv 1 . pow ( n 2 Int Part . intValue Exact (), Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdouble Pow Ġ= ĠBigDecimal ( Math . pow ( dn 1 , Ġremainder Of 2 . toDouble ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġint Pow . multiply ( double Pow , Ġexpression . mc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sign Of 2 Ġ== Ġ- 1 ) Ġresult Ġ= ĠONE . divide ( result , Ġexpression . mc . precision , ĠRound ingMode . HALF _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠAND Ġ= Ġobject Ġ: ĠOperator (" && ", Ġ 4 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġlogical Result (!( zero ( v 1 ) Ġ|| Ġzero ( v 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠOR Ġ= Ġobject Ġ: ĠOperator (" || ", Ġ 2 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġlogical Result (!( zero ( v 1 ) Ġ&& Ġzero ( v 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġzero ( value : ĠBigDecimal ) Ġ= Ġvalue . equals ( ZERO ) ĊĊĠĠĠ Ġval ĠGT Ġ= Ġobject Ġ: ĠOperator ("> ", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠGT _ OR _ E QL Ġ= Ġobject Ġ: ĠOperator ("> =", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠLT Ġ= Ġobject Ġ: ĠOperator ("< ", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ== Ġ- 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠLT _ OR _ E QL Ġ= Ġobject Ġ: ĠOperator ("< =", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ<= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠE QL Ġ= Ġobject Ġ: ĠOperator (" ==", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠNOT _ E QL Ġ= Ġobject Ġ: ĠOperator (" ! =", Ġ 1 0 , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġeval ( v 1 : ĠAny , Ġv 2 : ĠAny ) Ġ= Ġlogical ( name , Ġv 1 , Ġv 2 ) Ġ{ Ġit Ġ!= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogical ( name : ĠString , Ġv 1 : ĠAny , Ġv 2 : ĠAny , Ġconstraint : Ġ( Int ) Ġ-> ĠBoolean ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġis ĠBigDecimal Ġ&& Ġv 2 Ġis ĠBigDecimal Ġ-> Ġlogical Result ( constraint ( v 1 . compareTo ( v 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbad Params Error ( name , Ġv 1 , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogical Result ( boolean : ĠBoolean ) Ġ= Ġif Ġ( boolean ) ĠONE Ġelse ĠZERO ĊĊĠĠĠ Ġprivate Ġfun Ġbad Params Error ( name : ĠString , Ġv 1 : ĠAny , Ġv 2 : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠExpression Exception ("' $ name ' Ġoperator Ġdoes Ġnot Ġaccept Ġ( v 1 : Ġ${ v 1 . java Class . simple Name }, Ġv 2 : Ġ${ v 2 . java Class . simple Name }) ") ĊĠĠĠ Ġ} Ċ }