21#include <spot/misc/common.hh>
22#include <spot/misc/_config.h>
27#include <spot/graph/graph.hh>
39 template<
class State_Data>
51 struct state_storage:
public internal::boxed_label<State_Data>
53 unsigned first_edge = 0;
56 template <
typename... Args,
57 typename =
typename std::enable_if<
58 !internal::first_is_base_of<state_storage,
59 Args...>::value>::type>
60 state_storage(Args&&... args)
61 noexcept(std::is_nothrow_constructible
62 <internal::boxed_label<State_Data>, Args...>::value)
63 : internal::boxed_label<State_Data>{std::forward<Args>(args)...}
69 std::vector<edge> edges_;
70 std::vector<state_storage> states_;
77 adjlist(
unsigned max_states = 10,
unsigned max_trans = 0)
79 states_.reserve(max_states);
81 max_trans = max_states * 2;
82 edges_.reserve(max_trans + 1);
85 edges_.push_back({-1U, 0
U});
90 template <
typename... Args>
93 unsigned s = states_.size();
94 states_.emplace_back(std::forward<Args>(args)...);
101 template <
typename... Args>
104 unsigned s = states_.size();
105 states_.reserve(s + n);
107 states_.emplace_back(std::forward<Args>(args)...);
111 typename internal::boxed_label<State_Data>::data_t&
112 state_data(
unsigned s)
114 return states_[s].data();
117 const typename internal::boxed_label<State_Data>::data_t&
118 state_data(
unsigned s)
const
120 return states_[s].data();
128 unsigned pos = edges_.size();
129 state_storage& ss = states_[src];
130 edges_.emplace_back(edge{dst, ss.first_edge});
143 using iterator_category = std::input_iterator_tag;
144 using value_type = unsigned;
145 using difference_type = std::ptrdiff_t;
146 using pointer =
const unsigned*;
147 using reference =
const unsigned&;
150 : graph(g), edge_index(idx)
154 int operator*()
const
156 return graph->edges_[edge_index].dst;
160 edge_index = graph->edges_[edge_index].next_index;
172 return iter.edge_index == 0;
177 return iter.edge_index == 0;
182 return iter.edge_index != 0;
187 return iter.edge_index != 0;
206 unsigned first_edge = (
state < graph->states_.size()) ?
207 graph->states_[
state].first_edge : 0;
211 std::nullptr_t end()
const
222 unsigned num_states()
const
224 return states_.size();
227 unsigned num_edges()
const
229 return edges_.size() - 1;
Iterator for traversing successors of a state.
Definition adjlist.hh:136
Range wrapper for successor iteration.
Definition adjlist.hh:193
A compact adjacency list representation for directed graphs.
Definition adjlist.hh:41
unsigned new_state(Args &&... args)
Create a new state with given data.
Definition adjlist.hh:91
unsigned new_states(unsigned n, Args &&... args)
Create multiple new states with the same data.
Definition adjlist.hh:102
adjlist(unsigned max_states=10, unsigned max_trans=0)
Constructor for adjacency list.
Definition adjlist.hh:77
void new_edge(unsigned src, unsigned dst)
Add a new edge between two states.
Definition adjlist.hh:126
Abstract class for states.
Definition twa.hh:47
Definition automata.hh:26