@@ -78,19 +78,23 @@ void ssa_analyzert::operator()(
7878 domain=template_generator.domain ();
7979
8080 // get strategy solver from options
81- strategy_solver_baset * s_solver;
81+ std::unique_ptr< strategy_solver_baset> s_solver;
8282 if (template_generator.options .get_bool_option (" compute-ranking-functions" ))
8383 {
8484 if (template_generator.options .get_bool_option (
8585 " monolithic-ranking-function" ))
8686 {
87- s_solver=new SIMPLE_SOLVER (domain, linrank_domaint);
88- result=new linrank_domaint::templ_valuet ();
87+ s_solver=std::unique_ptr<strategy_solver_baset>(
88+ new SIMPLE_SOLVER (domain, linrank_domaint));
89+ result=std::unique_ptr<domaint::valuet>(
90+ new linrank_domaint::templ_valuet ());
8991 }
9092 else
9193 {
92- s_solver=new SIMPLE_SOLVER (domain, lexlinrank_domaint);
93- result=new lexlinrank_domaint::templ_valuet ();
94+ s_solver=std::unique_ptr<strategy_solver_baset>(
95+ new SIMPLE_SOLVER (domain, lexlinrank_domaint));
96+ result=std::unique_ptr<domaint::valuet>(
97+ new lexlinrank_domaint::templ_valuet ());
9498 }
9599 }
96100 else
@@ -99,37 +103,38 @@ void ssa_analyzert::operator()(
99103 // Check if symbolic paths domain is used. If so, invariant_domain points to
100104 // the inner domain of the symbolic paths domain.
101105 if (template_generator.options .get_bool_option (" sympath" ))
102- invariant_domain=dynamic_cast <sympath_domaint *>(domain)->inner_domain ;
106+ invariant_domain=
107+ dynamic_cast <sympath_domaint *>(domain)->inner_domain .get ();
103108 else
104109 invariant_domain=domain;
105110
106- // simple_domains contains a vector of simple domains used.
111+ // simple_domains contains a vector of pointers to simple domains used.
107112 // This is either invariant_domain (if a single simple domain is used) or
108113 // the vector of domains retrieved from the product domain.
109114 std::vector<domaint *> simple_domains;
110115 unsigned next_domain=0 ;
111116 auto *product_domain=dynamic_cast <product_domaint *>(invariant_domain);
112117 if (product_domain)
113- simple_domains=product_domain->domains ;
118+ simple_domains=product_domain->get_domains () ;
114119 else
115120 simple_domains.push_back (invariant_domain);
116121
117122 // Create list of solvers and values.
118123 // Important: these must follow the order of domains created in the
119124 // template generator.
120- std::vector<strategy_solver_baset *> solvers;
121- std::vector<domaint::valuet *> values;
125+ solver_vect solvers;
126+ value_vect values;
122127 if (template_generator.options .get_bool_option (" equalities" ))
123128 {
124- solvers.push_back (
129+ solvers.emplace_back (
125130 new SIMPLE_SOLVER (simple_domains[next_domain++], equality_domaint));
126- values.push_back (new equality_domaint::equ_valuet ());
131+ values.emplace_back (new equality_domaint::equ_valuet ());
127132 }
128133 if (template_generator.options .get_bool_option (" heap" ))
129134 {
130- solvers.push_back (
135+ solvers.emplace_back (
131136 new SIMPLE_SOLVER (simple_domains[next_domain++], heap_domaint));
132- values.push_back (new heap_domaint::heap_valuet ());
137+ values.emplace_back (new heap_domaint::heap_valuet ());
133138 }
134139 if (template_generator.options .get_bool_option (" intervals" ) ||
135140 template_generator.options .get_bool_option (" zones" ) ||
@@ -138,42 +143,49 @@ void ssa_analyzert::operator()(
138143 {
139144 if (template_generator.options .get_bool_option (" enum-solver" ))
140145 {
141- solvers.push_back (
146+ solvers.emplace_back (
142147 new SIMPLE_SOLVER (simple_domains[next_domain++], tpolyhedra_domaint));
143- values.push_back (new tpolyhedra_domaint::templ_valuet ());
148+ values.emplace_back (new tpolyhedra_domaint::templ_valuet ());
144149 }
145150 else if (template_generator.options .get_bool_option (" predabs-solver" ))
146151 {
147- solvers.push_back (
152+ solvers.emplace_back (
148153 new SIMPLE_SOLVER (simple_domains[next_domain++], predabs_domaint));
149- values.push_back (new predabs_domaint::templ_valuet ());
154+ values.emplace_back (new predabs_domaint::templ_valuet ());
150155 }
151156 else if (template_generator.options .get_bool_option (" binsearch-solver" ))
152157 {
153- solvers.push_back (new BINSEARCH_SOLVER);
154- values.push_back (new tpolyhedra_domaint::templ_valuet ());
158+ solvers.emplace_back (new BINSEARCH_SOLVER);
159+ values.emplace_back (new tpolyhedra_domaint::templ_valuet ());
155160 }
156161 else
157162 assert (false );
158163 }
159164
160165 if (solvers.size ()==1 )
161166 {
162- s_solver=solvers[0 ];
163- result=values[0 ];
167+ s_solver=std::move ( solvers[0 ]) ;
168+ result=std::move ( values[0 ]) ;
164169 }
165170 else
166171 {
167- s_solver=new strategy_solver_productt (
168- *product_domain, solver, SSA.ns , solvers);
169- result=new product_domaint::valuet (values);
172+ s_solver=std::unique_ptr<strategy_solver_baset>(
173+ new strategy_solver_productt (
174+ *product_domain, solver, SSA.ns , std::move (solvers)));
175+ result=std::unique_ptr<domaint::valuet>(
176+ new product_domaint::valuet (std::move (values)));
170177 }
171178
172179 if (template_generator.options .get_bool_option (" sympath" ))
173180 {
174- s_solver=new strategy_solver_sympatht (
175- *dynamic_cast <sympath_domaint *>(domain), solver, SSA, s_solver);
176- result=new sympath_domaint::sympath_valuet (result);
181+ s_solver=std::unique_ptr<strategy_solver_baset>(
182+ new strategy_solver_sympatht (
183+ *dynamic_cast <sympath_domaint *>(domain),
184+ solver,
185+ SSA,
186+ std::move (s_solver)));
187+ result=std::unique_ptr<domaint::valuet>(
188+ new sympath_domaint::sympath_valuet (std::move (result)));
177189 }
178190 }
179191
@@ -191,8 +203,6 @@ void ssa_analyzert::operator()(
191203 solver_instances+=s_solver->get_number_of_solver_instances ();
192204 solver_calls+=s_solver->get_number_of_solver_calls ();
193205 solver_instances+=s_solver->get_number_of_solver_instances ();
194-
195- delete s_solver;
196206}
197207
198208void ssa_analyzert::get_result (exprt &_result, const var_sett &vars)
0 commit comments