optionmap: set_if_unset and simplifications

* spot/misc/optionmap.hh (set_if_unset): New method.
* spot/misc/optionmap.cc (set_if_unset, set, set_str): Implement
set_if_unset, and simplify set and set_str to not perform two lookups.
* spot/twaalgos/synthesis.cc (create_translator): Use set_if_unset
to simplify the code.
This commit is contained in:
Alexandre Duret-Lutz 2022-03-17 10:55:30 +01:00
parent 4f69e99c45
commit c1e6340228
3 changed files with 38 additions and 17 deletions

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2008, 2013-2016, 2018 Laboratoire de Recherche // Copyright (C) 2008, 2013-2016, 2018, 2022 Laboratoire de Recherche
// et Développement de l'Epita (LRDE). // et Développement de l'Epita (LRDE).
// Copyright (C) 2005 Laboratoire d'Informatique de Paris 6 (LIP6), // Copyright (C) 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre // département Systèmes Répartis Coopératifs (SRC), Université Pierre
@ -158,17 +158,39 @@ namespace spot
int int
option_map::set(const char* option, int val, int def) option_map::set(const char* option, int val, int def)
{ {
int old = get(option, def); if (auto [p, b] = options_.emplace(option, val); b)
set_(option, val); {
return old; unused_.insert(option);
return def;
}
else
{
int old = p->second;
p->second = val;
return old;
}
}
void
option_map::set_if_unset(const char* option, int val)
{
if (options_.emplace(option, val).second)
unused_.insert(option);
} }
std::string std::string
option_map::set_str(const char* option, std::string val, std::string def) option_map::set_str(const char* option, std::string val, std::string def)
{ {
std::string old = get_str(option, def); if (auto [p, b] = options_str_.emplace(option, val); b)
set_str_(option, val); {
return old; unused_.insert(option);
return def;
}
else
{
std::swap(val, p->second);
return val;
}
} }
void void

View file

@ -1,6 +1,6 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2013, 2015, 2016-2017 Laboratoire de Recherche et // Copyright (C) 2013, 2015, 2016-2017, 2022 Laboratoire de Recherche
// Developpement de l'Epita (LRDE) // et Developpement de l'Epita (LRDE)
// Copyright (C) 2005 Laboratoire d'Informatique de Paris 6 (LIP6), // Copyright (C) 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre // département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie. // et Marie Curie.
@ -80,6 +80,9 @@ namespace spot
/// or \a def otherwise. /// or \a def otherwise.
int set(const char* option, int val, int def = 0); int set(const char* option, int val, int def = 0);
/// \brief Set the value of \a option to \a val if it is unset.
void set_if_unset(const char* option, int val);
/// \brief Set the value of a string \a option to \a val. /// \brief Set the value of a string \a option to \a val.
/// ///
/// \return The previous value associated to \a option if declared, /// \return The previous value associated to \a option if declared,

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2020, 2021 Laboratoire de Recherche et // Copyright (C) 2020-2022 Laboratoire de Recherche et
// Développement de l'Epita (LRDE). // Développement de l'Epita (LRDE).
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
@ -768,13 +768,9 @@ namespace spot
auto sol = gi.s; auto sol = gi.s;
const bdd_dict_ptr& dict = gi.dict; const bdd_dict_ptr& dict = gi.dict;
for (auto&& p : std::vector<std::pair<const char*, int>> extra_options.set_if_unset("simul", 0);
{{"simul", 0}, extra_options.set_if_unset("tls-impl", 1);
{"ba-simul", 0}, extra_options.set_if_unset("wdba-minimize", 2);
{"det-simul", 0},
{"tls-impl", 1},
{"wdba-minimize", 2}})
extra_options.set(p.first, extra_options.get(p.first, p.second));
translator trans(dict, &extra_options); translator trans(dict, &extra_options);
switch (sol) switch (sol)