diff --git a/spot/twaalgos/game.cc b/spot/twaalgos/game.cc index e2c550531..9f739d423 100644 --- a/spot/twaalgos/game.cc +++ b/spot/twaalgos/game.cc @@ -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("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"); diff --git a/spot/twaalgos/game.hh b/spot/twaalgos/game.hh index c376304be..737a50d78 100644 --- a/spot/twaalgos/game.hh +++ b/spot/twaalgos/game.hh @@ -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 + /// @} }