@@ -3619,90 +3619,84 @@ void LinkVarExpr(Solver* s, IntExpr* expr, IntVar* var) {
36193619}
36203620
36213621IntVar* NewVarPlusInt (Solver* s, IntVar* var, int64_t value) {
3622+ if (value == 0 ) return var;
36223623 switch (var->VarType ()) {
36233624 case IntVar::DOMAIN_INT_VAR: {
3624- return RegisterIntExpr (
3625- s->RevAlloc (new PlusCstDomainIntVar (
3626- s, reinterpret_cast <DomainIntVar*>(var), value)))
3627- ->Var ();
3625+ return RegisterIntVar (s->RevAlloc (new PlusCstDomainIntVar (
3626+ s, reinterpret_cast <DomainIntVar*>(var), value)));
36283627 }
36293628 case IntVar::CONST_VAR: {
36303629 DCHECK (!AddOverflows (var->Min (), value));
3631- return RegisterIntExpr (s->MakeIntConst (var->Min () + value))-> Var ( );
3630+ return RegisterIntVar (s->MakeIntConst (var->Min () + value));
36323631 }
36333632 case IntVar::VAR_ADD_CST: {
3634- PlusCstVar* const add_var = reinterpret_cast <PlusCstVar*>(var);
3635- IntVar* const sub_var = add_var->SubVar ();
3636- const int64_t new_constant = value + add_var->Constant ();
3633+ PlusCstVar* const var_add_cst = reinterpret_cast <PlusCstVar*>(var);
3634+ IntVar* const sub_var = var_add_cst->SubVar ();
3635+ DCHECK (!AddOverflows (value, var_add_cst->Constant ()));
3636+ const int64_t new_constant = value + var_add_cst->Constant ();
36373637 if (new_constant == 0 ) {
36383638 return sub_var;
36393639 } else {
36403640 if (sub_var->VarType () == IntVar::DOMAIN_INT_VAR) {
36413641 DomainIntVar* const dvar = reinterpret_cast <DomainIntVar*>(sub_var);
3642- return RegisterIntExpr (s->RevAlloc (new PlusCstDomainIntVar (
3643- s, dvar, new_constant)))
3644- ->Var ();
3642+ return RegisterIntVar (
3643+ s->RevAlloc (new PlusCstDomainIntVar (s, dvar, new_constant)));
36453644 } else {
3646- return RegisterIntExpr (
3647- s->RevAlloc (new PlusCstIntVar (s, sub_var, new_constant)))
3648- ->Var ();
3645+ return RegisterIntVar (
3646+ s->RevAlloc (new PlusCstIntVar (s, sub_var, new_constant)));
36493647 }
36503648 }
3651- break ;
36523649 }
36533650 case IntVar::CST_SUB_VAR: {
3654- SubCstIntVar* const add_var = reinterpret_cast <SubCstIntVar*>(var);
3655- IntVar* const sub_var = add_var->SubVar ();
3656- const int64_t new_constant = value + add_var->Constant ();
3657- return RegisterIntExpr (
3658- s->RevAlloc (new SubCstIntVar (s, sub_var, new_constant)))
3659- ->Var ();
3660- break ;
3651+ SubCstIntVar* const cst_sub_var = reinterpret_cast <SubCstIntVar*>(var);
3652+ IntVar* const sub_var = cst_sub_var->SubVar ();
3653+ DCHECK (!AddOverflows (value, cst_sub_var->Constant ()));
3654+ const int64_t new_constant = value + cst_sub_var->Constant ();
3655+ return NewIntMinusVar (s, new_constant, sub_var);
36613656 }
36623657 case IntVar::OPP_VAR: {
3663- OppIntVar* const add_var = reinterpret_cast <OppIntVar*>(var);
3664- IntVar* const sub_var = add_var->SubVar ();
3665- return RegisterIntExpr (s->RevAlloc (new SubCstIntVar (s, sub_var, value)))
3666- ->Var ();
3667- break ;
3658+ OppIntVar* const opp_var = reinterpret_cast <OppIntVar*>(var);
3659+ IntVar* const sub_var = opp_var->SubVar ();
3660+ return NewIntMinusVar (s, value, sub_var);
36683661 }
36693662 default :
3670- return RegisterIntExpr (s->RevAlloc (new PlusCstIntVar (s, var, value)))
3671- ->Var ();
3663+ return RegisterIntVar (s->RevAlloc (new PlusCstIntVar (s, var, value)));
36723664 }
36733665}
36743666
36753667IntVar* NewIntMinusVar (Solver* s, int64_t value, IntVar* var) {
36763668 switch (var->VarType ()) {
36773669 case IntVar::VAR_ADD_CST: {
3678- PlusCstVar* const add_var = reinterpret_cast <PlusCstVar*>(var);
3679- IntVar* const sub_var = add_var->SubVar ();
3680- const int64_t new_constant = value - add_var->Constant ();
3670+ PlusCstVar* const cst_add_var = reinterpret_cast <PlusCstVar*>(var);
3671+ IntVar* const sub_var = cst_add_var->SubVar ();
3672+ DCHECK (!SubOverflows (value, cst_add_var->Constant ()));
3673+ const int64_t new_constant = value - cst_add_var->Constant ();
36813674 if (new_constant == 0 ) {
36823675 return sub_var;
36833676 } else {
3684- return RegisterIntExpr (
3685- s->RevAlloc (new SubCstIntVar (s, sub_var, new_constant)))
3686- ->Var ();
3677+ return RegisterIntVar (
3678+ s->RevAlloc (new SubCstIntVar (s, sub_var, new_constant)));
36873679 }
3688- break ;
36893680 }
36903681 case IntVar::CST_SUB_VAR: {
3691- SubCstIntVar* const add_var = reinterpret_cast <SubCstIntVar*>(var);
3692- IntVar* const sub_var = add_var ->SubVar ();
3693- const int64_t new_constant = value - add_var- >Constant ();
3694- return s-> MakeSum (sub_var, new_constant)-> Var ();
3695- break ;
3682+ SubCstIntVar* const cst_sub_var = reinterpret_cast <SubCstIntVar*>(var);
3683+ IntVar* const sub_var = cst_sub_var ->SubVar ();
3684+ DCHECK (! SubOverflows ( value, cst_sub_var- >Constant ()) );
3685+ const int64_t new_constant = value - cst_sub_var-> Constant ();
3686+ return NewVarPlusInt (s, sub_var, new_constant) ;
36963687 }
36973688 case IntVar::OPP_VAR: {
36983689 OppIntVar* const add_var = reinterpret_cast <OppIntVar*>(var);
36993690 IntVar* const sub_var = add_var->SubVar ();
3700- return s->MakeSum (sub_var, value)->Var ();
3701- break ;
3691+ return NewVarPlusInt (s, sub_var, value);
3692+ }
3693+ default : {
3694+ if (value == 0 ) {
3695+ return RegisterIntVar (s->RevAlloc (new OppIntVar (s, var)));
3696+ } else {
3697+ return RegisterIntVar (s->RevAlloc (new SubCstIntVar (s, var, value)));
3698+ }
37023699 }
3703- default :
3704- return RegisterIntExpr (s->RevAlloc (new SubCstIntVar (s, var, value)))
3705- ->Var ();
37063700 }
37073701}
37083702
0 commit comments