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)...);
102 template <
typename... Args>
105 unsigned s = states_.size();
106 states_.reserve(s + n);
108 states_.emplace_back(std::forward<Args>(args)...);
113 typename internal::boxed_label<State_Data>::data_t&
116 return states_[s].data();
120 const typename internal::boxed_label<State_Data>::data_t&
123 return states_[s].data();
131 unsigned pos = edges_.size();
132 state_storage& ss = states_[src];
133 edges_.emplace_back(edge{dst, ss.first_edge});
155 : graph(g), edge_index(idx)
162 return graph->edges_[edge_index].dst;
167 edge_index = graph->edges_[edge_index].next_index;
181 return iter.edge_index == 0;
187 return iter.edge_index == 0;
193 return iter.edge_index != 0;
199 return iter.edge_index != 0;
220 SPOT_ASSERT(state < graph->states_.size());
225 std::nullptr_t
end()
const
240 return states_.size();
246 return edges_.size() - 1;
Iterator for traversing successors of a state.
Definition adjlist.hh:139
friend bool operator!=(const successor_iterator &iter, std::nullptr_t)
Return true iff iter is not past the end.
Definition adjlist.hh:191
std::input_iterator_tag iterator_category
Standard iterator type alias.
Definition adjlist.hh:147
int operator*() const
Dereference: return destination state.
Definition adjlist.hh:160
std::ptrdiff_t difference_type
Standard iterator type alias.
Definition adjlist.hh:149
const unsigned & reference
Standard iterator type alias.
Definition adjlist.hh:151
const unsigned * pointer
Standard iterator type alias.
Definition adjlist.hh:150
friend bool operator==(std::nullptr_t, const successor_iterator &iter)
Return true iff iter is past the end.
Definition adjlist.hh:185
successor_iterator operator++(int)
Post-increment: advance to next successor.
Definition adjlist.hh:172
successor_iterator & operator++()
Pre-increment: advance to next successor.
Definition adjlist.hh:166
friend bool operator!=(std::nullptr_t, const successor_iterator &iter)
Return true iff iter is not past the end.
Definition adjlist.hh:197
friend bool operator==(const successor_iterator &iter, std::nullptr_t)
Return true iff iter is past the end.
Definition adjlist.hh:179
unsigned value_type
Standard iterator type alias.
Definition adjlist.hh:148
successor_iterator(const adjlist *g, unsigned idx)
Construct an iterator over successors of state at idx in graph g.
Definition adjlist.hh:154
Range wrapper for successor iteration.
Definition adjlist.hh:205
successor_range(const adjlist *g, unsigned s)
Construct range over successors of state s in g.
Definition adjlist.hh:212
std::nullptr_t end() const
Return past-the-end sentinel.
Definition adjlist.hh:225
successor_iterator begin() const
Return iterator to first successor.
Definition adjlist.hh:218
A compact adjacency list representation for directed graphs.
Definition adjlist.hh:41
internal::boxed_label< State_Data >::data_t & state_data(unsigned s)
Return the state data for state s.
Definition adjlist.hh:114
unsigned new_state(Args &&... args)
Create a new state with given data.
Definition adjlist.hh:91
unsigned num_edges() const
Return the number of edges.
Definition adjlist.hh:244
const internal::boxed_label< State_Data >::data_t & state_data(unsigned s) const
Return the state data for state s.
Definition adjlist.hh:121
unsigned new_states(unsigned n, Args &&... args)
Create multiple new states with the same data.
Definition adjlist.hh:103
unsigned num_states() const
Return the number of states.
Definition adjlist.hh:238
successor_range out(unsigned state) const
Return successor range for state.
Definition adjlist.hh:232
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:129
Abstract class for states.
Definition twa.hh:49
Definition automata.hh:26