21#include <spot/misc/common.hh>
22#include <spot/misc/_config.h>
27#include <spot/graph/graph.hh>
35 template<
class State_Data>
36 class SPOT_API adjlist
49 unsigned first_edge = 0;
52 template <
typename... Args,
53 typename =
typename std::enable_if<
55 Args...>::value>::type>
56 state_storage(Args&&... args)
57 noexcept(std::is_nothrow_constructible
65 std::vector<edge> edges_;
66 std::vector<state_storage> states_;
69 adjlist(
unsigned max_states = 10,
unsigned max_trans = 0)
71 states_.reserve(max_states);
73 max_trans = max_states * 2;
74 edges_.reserve(max_trans + 1);
77 edges_.push_back({-1U, 0
U});
80 template <
typename... Args>
81 unsigned new_state(Args&&... args)
83 unsigned s = states_.size();
84 states_.emplace_back(std::forward<Args>(args)...);
88 template <
typename... Args>
89 unsigned new_states(
unsigned n, Args&&... args)
91 unsigned s = states_.size();
92 states_.reserve(s + n);
94 states_.emplace_back(std::forward<Args>(args)...);
98 typename internal::boxed_label<State_Data>::data_t&
99 state_data(
unsigned s)
101 return states_[s].data();
104 const typename internal::boxed_label<State_Data>::data_t&
105 state_data(
unsigned s)
const
107 return states_[s].data();
110 void new_edge(
unsigned src,
unsigned dst)
112 unsigned pos = edges_.size();
113 state_storage& ss = states_[src];
114 edges_.emplace_back(edge{dst, ss.first_edge});
119 class successor_iterator
122 const adjlist* graph;
127 using iterator_category = std::input_iterator_tag;
128 using value_type = unsigned;
129 using difference_type = std::ptrdiff_t;
130 using pointer =
const unsigned*;
131 using reference =
const unsigned&;
133 successor_iterator(
const adjlist* g,
unsigned idx)
134 : graph(g), edge_index(idx)
138 int operator*()
const
140 return graph->edges_[edge_index].dst;
143 successor_iterator& operator++() {
144 edge_index = graph->edges_[edge_index].next_index;
148 successor_iterator operator++(
int) {
149 successor_iterator tmp = *
this;
154 friend bool operator==(
const successor_iterator& iter, std::nullptr_t)
156 return iter.edge_index == 0;
159 friend bool operator==(std::nullptr_t,
const successor_iterator& iter)
161 return iter.edge_index == 0;
164 friend bool operator!=(
const successor_iterator& iter, std::nullptr_t)
166 return iter.edge_index != 0;
169 friend bool operator!=(std::nullptr_t,
const successor_iterator& iter)
171 return iter.edge_index != 0;
175 class successor_range
178 const adjlist* graph;
182 successor_range(
const adjlist* g,
unsigned s)
189 unsigned first_edge = (state < graph->states_.size()) ?
190 graph->states_[state].first_edge : 0;
194 std::nullptr_t end()
const
205 unsigned num_states()
const
207 return states_.size();
210 unsigned num_edges()
const
212 return edges_.size() - 1;
Definition adjlist.hh:120
Definition adjlist.hh:176
Abstract class for states.
Definition twa.hh:47
@ U
until
Definition formula.hh:94
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