diff --git a/src/constraint_solver/constraint_solver.cc b/src/constraint_solver/constraint_solver.cc index 439b17e555..972e64be66 100644 --- a/src/constraint_solver/constraint_solver.cc +++ b/src/constraint_solver/constraint_solver.cc @@ -2436,7 +2436,7 @@ bool Solver::SolveAndCommit(DecisionBuilder* const db, void Solver::Fail() { if (fail_intercept_) { - fail_intercept_->Run(); + fail_intercept_(); return; } ConstraintSolverFailsHere(); diff --git a/src/constraint_solver/constraint_solver.h b/src/constraint_solver/constraint_solver.h index 9c2e36ca4f..bd6b134286 100644 --- a/src/constraint_solver/constraint_solver.h +++ b/src/constraint_solver/constraint_solver.h @@ -61,6 +61,7 @@ #ifndef OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_ #define OR_TOOLS_CONSTRAINT_SOLVER_CONSTRAINT_SOLVER_H_ +#include #include "base/hash.h" #include "base/hash.h" #include @@ -2844,8 +2845,9 @@ class Solver { Decision* balancing_decision() const { return balancing_decision_.get(); } // Internal - // set_fail_intercept does not take ownership of the closure. - void set_fail_intercept(Closure* const c) { fail_intercept_ = c; } + void set_fail_intercept(std::function fail_intercept) { + fail_intercept_ = fail_intercept; + } void clear_fail_intercept() { fail_intercept_ = nullptr; } // Access to demon profiler. DemonProfiler* demon_profiler() const { return demon_profiler_; } @@ -3054,7 +3056,7 @@ class Solver { uint64 fail_stamp_; std::unique_ptr balancing_decision_; // intercept failures - Closure* fail_intercept_; + std::function fail_intercept_; // Demon monitor DemonProfiler* const demon_profiler_; diff --git a/src/constraint_solver/csharp/constraint_solver.swig b/src/constraint_solver/csharp/constraint_solver.swig index 2b1ae99ae8..e51c751621 100644 --- a/src/constraint_solver/csharp/constraint_solver.swig +++ b/src/constraint_solver/csharp/constraint_solver.swig @@ -83,12 +83,10 @@ struct FailureProtect { %exception Method { operations_research::Solver* const solver = GetSolver; FailureProtect protect; - Closure* const intercept = NewCallback<>(&protect, &FailureProtect::JumpBack); - solver->set_fail_intercept(intercept); + solver->set_fail_intercept([&protect]() { protect.JumpBack(); }); if (setjmp(protect.exception_buffer) == 0) { $action solver->clear_fail_intercept(); - delete intercept; } else { solver->clear_fail_intercept(); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "fail"); diff --git a/src/constraint_solver/java/constraint_solver.swig b/src/constraint_solver/java/constraint_solver.swig index 075dc63361..ffd5aa66f7 100644 --- a/src/constraint_solver/java/constraint_solver.swig +++ b/src/constraint_solver/java/constraint_solver.swig @@ -27,12 +27,10 @@ %exception Method { operations_research::Solver* const solver = GetSolver; FailureProtect protect; - Closure* const intercept = NewCallback<>(&protect, &FailureProtect::JumpBack); - solver->set_fail_intercept(intercept); + solver->set_fail_intercept([&protect]() { protect.JumpBack(); }); if (setjmp(protect.exception_buffer) == 0) { $action solver->clear_fail_intercept(); - delete intercept; } else { solver->clear_fail_intercept(); jclass fail_class = jenv->FindClass( diff --git a/src/constraint_solver/python/constraint_solver.swig b/src/constraint_solver/python/constraint_solver.swig index 0d3b1f7b78..9d4f3ac48c 100644 --- a/src/constraint_solver/python/constraint_solver.swig +++ b/src/constraint_solver/python/constraint_solver.swig @@ -787,12 +787,10 @@ PY_STRINGIFY_DEBUGSTRING(Decision); %exception Method { operations_research::Solver* const solver = GetSolver; FailureProtect protect; - Closure* const intercept = NewCallback<>(&protect, &FailureProtect::JumpBack); - solver->set_fail_intercept(intercept); + solver->set_fail_intercept([&protect]() { protect.JumpBack(); }); if (setjmp(protect.exception_buffer) == 0) { $action solver->clear_fail_intercept(); - delete intercept; } else { solver->clear_fail_intercept(); // IMPORTANT: the type and message of the exception raised matter,