21#include <unordered_map>
23#include <spot/graph/graph.hh>
28 template <
typename Graph,
30 typename Name_Hash = std::hash<State_Name>,
31 typename Name_Equal = std::equal_to<State_Name>>
38 typedef typename Graph::state
state;
39 typedef typename Graph::edge
edge;
69 template <
typename... Args>
72 auto p = name_to_state.emplace(n, 0
U);
75 unsigned s = g_.new_state(std::forward<Args>(args)...);
77 if (state_to_name.size() < s + 1)
78 state_to_name.resize(s + 1);
82 return p.first->second;
93 auto p = name_to_state.emplace(newname, s);
97 auto old = p.first->second;
100 auto& trans = g_.edge_vector();
101 auto& states = g_.states();
102 trans[states[s].succ_tail].next_succ = states[old].succ;
103 states[s].succ_tail = states[old].succ_tail;
104 states[old].succ = 0;
105 states[old].succ_tail = 0;
107 unsigned tend = trans.size();
108 for (
unsigned t = 1; t < tend; ++t)
110 if (trans[t].src == old)
112 if (trans[t].dst == old)
122 return name_to_state.at(n);
128 return state_to_name.at(s);
134 return name_to_state.contains(n);
140 return state_to_name;
144 template <
typename... Args>
148 return g_.new_edge(get_state(src), get_state(dst),
149 std::forward<Args>(args)...);
153 template <
typename I,
typename... Args>
157 std::vector<unsigned> d;
158 d.reserve(std::distance(dst_begin, dst_end));
159 while (dst_begin != dst_end)
160 d.emplace_back(get_state(*dst_begin++));
161 return g_.new_univ_edge(get_state(src), d.begin(), d.end(),
162 std::forward<Args>(args)...);
166 template <
typename... Args>
169 const std::initializer_list<State_Name>& dsts, Args&&... args)
171 return new_univ_edge(src, dsts.begin(), dsts.end(),
172 std::forward<Args>(args)...);
A graph wrapper associating named states to graph state indices.
Definition ngraph.hh:33
edge new_edge(name src, name dst, Args &&... args)
Add a new edge.
Definition ngraph.hh:146
state_to_name_t state_to_name
Map from state number to name.
Definition ngraph.hh:48
state get_state(name n) const
Return the state number for the given name.
Definition ngraph.hh:120
named_graph(Graph &g)
Construct wrapping graph g.
Definition ngraph.hh:51
Graph::state state
State type.
Definition ngraph.hh:38
std::vector< name > state_to_name_t
Map from state number to name type.
Definition ngraph.hh:47
state new_state(name n, Args &&... args)
Create a new state with the given name.
Definition ngraph.hh:70
Graph & g_
The underlying graph.
Definition ngraph.hh:35
name get_name(state s) const
Return the name for the given state number.
Definition ngraph.hh:126
Graph & graph() const
Return the underlying graph.
Definition ngraph.hh:63
const state_to_name_t & names() const
Return all state names.
Definition ngraph.hh:138
bool has_state(name n) const
Return true iff a state with the given name exists.
Definition ngraph.hh:132
State_Name name
Name type.
Definition ngraph.hh:40
std::unordered_map< name, state, Name_Hash, Name_Equal > name_to_state_t
Map from name to state number type.
Definition ngraph.hh:44
name_to_state_t name_to_state
Definition ngraph.hh:45
edge new_univ_edge(name src, I dst_begin, I dst_end, Args &&... args)
Add a new universal edge.
Definition ngraph.hh:155
Graph::edge edge
Edge type.
Definition ngraph.hh:39
Graph & graph()
Return the underlying graph.
Definition ngraph.hh:57
edge new_univ_edge(name src, const std::initializer_list< State_Name > &dsts, Args &&... args)
Add a new universal edge.
Definition ngraph.hh:168
bool alias_state(state s, name newname)
Give an alternate name to a state.
Definition ngraph.hh:91
Definition automata.hh:26