game: avoid a spurious g++14 warning

* spot/twaalgos/game.cc, spot/twaalgos/game.hh (get_state_winners):
Declare a non-const version as well to avoid a "possibly dangling
reference" error in code show by tut40.org.
This commit is contained in:
Alexandre Duret-Lutz 2024-09-03 17:37:59 +02:00
parent e6ebbdf65f
commit 45cb9caa0e
2 changed files with 39 additions and 20 deletions

View file

@ -1085,12 +1085,12 @@ namespace spot
return aut;
}
void set_state_players(twa_graph_ptr arena, const region_t& owners)
void set_state_players(twa_graph_ptr& arena, const region_t& owners)
{
set_state_players(arena, region_t(owners));
}
void set_state_players(twa_graph_ptr arena, region_t&& owners)
void set_state_players(twa_graph_ptr& arena, region_t&& owners)
{
if (owners.size() != arena->num_states())
throw std::runtime_error
@ -1100,7 +1100,7 @@ namespace spot
new region_t(std::move(owners)));
}
void set_state_player(twa_graph_ptr arena, unsigned state, bool owner)
void set_state_player(twa_graph_ptr& arena, unsigned state, bool owner)
{
if (state >= arena->num_states())
throw std::runtime_error("set_state_player(): invalid state number");
@ -1141,7 +1141,7 @@ namespace spot
return *owners;
}
bool get_state_player(const_twa_graph_ptr arena, unsigned state)
bool get_state_player(const const_twa_graph_ptr& arena, unsigned state)
{
if (state >= arena->num_states())
throw std::runtime_error("get_state_player(): invalid state number");
@ -1165,11 +1165,11 @@ namespace spot
return *strat_ptr;
}
void set_strategy(twa_graph_ptr arena, const strategy_t& strat)
void set_strategy(twa_graph_ptr& arena, const strategy_t& strat)
{
set_strategy(arena, strategy_t(strat));
}
void set_strategy(twa_graph_ptr arena, strategy_t&& strat)
void set_strategy(twa_graph_ptr& arena, strategy_t&& strat)
{
if (arena->num_states() != strat.size())
throw std::runtime_error("set_strategy(): strategies need to have "
@ -1214,12 +1214,12 @@ namespace spot
}
void set_state_winners(twa_graph_ptr arena, const region_t& winners)
void set_state_winners(twa_graph_ptr& arena, const region_t& winners)
{
set_state_winners(arena, region_t(winners));
}
void set_state_winners(twa_graph_ptr arena, region_t&& winners)
void set_state_winners(twa_graph_ptr& arena, region_t&& winners)
{
if (winners.size() != arena->num_states())
throw std::runtime_error
@ -1229,7 +1229,7 @@ namespace spot
new region_t(std::move(winners)));
}
void set_state_winner(twa_graph_ptr arena, unsigned state, bool winner)
void set_state_winner(twa_graph_ptr& arena, unsigned state, bool winner)
{
if (state >= arena->num_states())
throw std::runtime_error("set_state_winner(): invalid state number");
@ -1258,7 +1258,20 @@ namespace spot
return *winners;
}
bool get_state_winner(const_twa_graph_ptr arena, unsigned state)
// This second version should not be needed, but g++14 emits
// "possibly dangling reference" warnings when it sees that the
// first function is called with a temporary const_twa_graph_ptr to
// return a reference.
const region_t& get_state_winners(twa_graph_ptr& arena)
{
region_t *winners = arena->get_named_prop<region_t>("state-winner");
if (!winners)
throw std::runtime_error
("get_state_winners(): state-winner property not defined, not a game?");
return *winners;
}
bool get_state_winner(const const_twa_graph_ptr& arena, unsigned state)
{
if (state >= arena->num_states())
throw std::runtime_error("get_state_winner(): invalid state number");

View file

@ -151,20 +151,20 @@ namespace spot
/// \brief Set the owner for all the states.
/// @{
SPOT_API
void set_state_players(twa_graph_ptr arena, const region_t& owners);
void set_state_players(twa_graph_ptr& arena, const region_t& owners);
SPOT_API
void set_state_players(twa_graph_ptr arena, region_t&& owners);
void set_state_players(twa_graph_ptr& arena, region_t&& owners);
/// @}
/// \ingroup games
/// \brief Set the owner of a state.
SPOT_API
void set_state_player(twa_graph_ptr arena, unsigned state, bool owner);
void set_state_player(twa_graph_ptr& arena, unsigned state, bool owner);
/// \ingroup games
/// \brief Get the owner of a state.
SPOT_API
bool get_state_player(const_twa_graph_ptr arena, unsigned state);
bool get_state_player(const const_twa_graph_ptr& arena, unsigned state);
/// \ingroup games
/// \brief Get the owner of all states
@ -181,9 +181,9 @@ namespace spot
SPOT_API
const strategy_t& get_strategy(const const_twa_graph_ptr& arena);
SPOT_API
void set_strategy(twa_graph_ptr arena, const strategy_t& strat);
void set_strategy(twa_graph_ptr& arena, const strategy_t& strat);
SPOT_API
void set_strategy(twa_graph_ptr arena, strategy_t&& strat);
void set_strategy(twa_graph_ptr& arena, strategy_t&& strat);
/// @}
/// \ingroup games
@ -205,23 +205,29 @@ namespace spot
/// \brief Set the winner for all the states.
/// @{
SPOT_API
void set_state_winners(twa_graph_ptr arena, const region_t& winners);
void set_state_winners(twa_graph_ptr& arena, const region_t& winners);
SPOT_API
void set_state_winners(twa_graph_ptr arena, region_t&& winners);
void set_state_winners(twa_graph_ptr& arena, region_t&& winners);
/// @}
/// \ingroup games
/// \brief Set the winner of a state.
SPOT_API
void set_state_winner(twa_graph_ptr arena, unsigned state, bool winner);
void set_state_winner(twa_graph_ptr& arena, unsigned state, bool winner);
/// \ingroup games
/// \brief Get the winner of a state.
SPOT_API
bool get_state_winner(const_twa_graph_ptr arena, unsigned state);
bool get_state_winner(const const_twa_graph_ptr& arena, unsigned state);
/// \ingroup games
/// \brief Get the winner of all states
/// @{
SPOT_API
const region_t& get_state_winners(const const_twa_graph_ptr& arena);
#ifndef SWIG
SPOT_API
const region_t& get_state_winners(twa_graph_ptr& arena);
#endif
/// @}
}