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});
135 class successor_iterator
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&;
149 successor_iterator(
const adjlist* g,
unsigned idx)
150 : graph(g), edge_index(idx)
154 int operator*()
const
156 return graph->edges_[edge_index].dst;
159 successor_iterator& operator++() {
160 edge_index = graph->edges_[edge_index].next_index;
164 successor_iterator operator++(
int) {
165 successor_iterator tmp = *
this;
170 friend bool operator==(
const successor_iterator& iter, std::nullptr_t)
172 return iter.edge_index == 0;
175 friend bool operator==(std::nullptr_t,
const successor_iterator& iter)
177 return iter.edge_index == 0;
180 friend bool operator!=(
const successor_iterator& iter, std::nullptr_t)
182 return iter.edge_index != 0;
185 friend bool operator!=(std::nullptr_t,
const successor_iterator& iter)
187 return iter.edge_index != 0;
192 class successor_range
199 successor_range(
const adjlist* g,
unsigned s)
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
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
@ U
until
Definition formula.hh:96
Definition automata.hh:26
Please direct any
question,
comment, or
bug report to the Spot mailing list at
spot@lrde.epita.fr.
Generated on for spot by
1.15.0