From a9242e3d98eaca6056ea744e6437b08029b16cf8 Mon Sep 17 00:00:00 2001 From: Alex Wilson Date: Mon, 23 Jan 2012 16:22:37 +1300 Subject: [PATCH] Properly handle unbounded results in SharedSolver::Validate{Min|Max}() --- src/libs/alm/SharedSolver.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/libs/alm/SharedSolver.cpp b/src/libs/alm/SharedSolver.cpp index 8cf6279ee8..c9d2698213 100644 --- a/src/libs/alm/SharedSolver.cpp +++ b/src/libs/alm/SharedSolver.cpp @@ -19,10 +19,15 @@ struct SharedSolver::MinSizeValidator { spec->FindMins(vars); } - inline void Finalize(BALMLayout* layout, SharedSolver* solver) + inline void Finalize(BALMLayout* layout, SharedSolver* solver, + ResultType solveResult) { - solver->SetMinSize(layout, BSize(layout->Right()->Value(), - layout->Bottom()->Value())); + if (solveResult == LinearProgramming::kUnbounded) { + solver->SetMinSize(layout, BSize(0, 0)); + } else { + solver->SetMinSize(layout, BSize(layout->Right()->Value(), + layout->Bottom()->Value())); + } } }; @@ -33,10 +38,16 @@ struct SharedSolver::MaxSizeValidator { spec->FindMaxs(vars); } - inline void Finalize(BALMLayout* layout, SharedSolver* solver) + inline void Finalize(BALMLayout* layout, SharedSolver* solver, + ResultType solveResult) { - solver->SetMaxSize(layout, BSize(layout->Right()->Value(), - layout->Bottom()->Value())); + if (solveResult == LinearProgramming::kUnbounded) { + solver->SetMaxSize(layout, + BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED)); + } else { + solver->SetMaxSize(layout, BSize(layout->Right()->Value(), + layout->Bottom()->Value())); + } } }; @@ -47,7 +58,8 @@ struct SharedSolver::PreferredSizeValidator { spec->Solve(); } - inline void Finalize(BALMLayout* layout, SharedSolver* solver) + inline void Finalize(BALMLayout* layout, SharedSolver* solver, + ResultType solveResult) { float width = layout->Right()->Value() - layout->Left()->Value(); float height = layout->Top()->Value() - layout->Bottom()->Value(); @@ -238,11 +250,11 @@ SharedSolver::_Validate(bool& isValid, ResultType& result) } validator.CallSolverMethod(&fLinearSpec, &variables); + result = fLinearSpec.Result(); for (int32 i = fLayouts.CountItems() - 1; i >= 0; i--) - validator.Finalize(fLayouts.ItemAt(i), this); + validator.Finalize(fLayouts.ItemAt(i), this, result); - result = fLinearSpec.Result(); isValid = true; fLayoutValid = false; }