21#include <spot/misc/common.hh>
22#include <spot/misc/_config.h>
27#include <spot/graph/graph.hh>
35 template<
class State_Data>
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});
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&;
134 : graph(g), edge_index(idx)
138 int operator*()
const
140 return graph->edges_[edge_index].dst;
144 edge_index = graph->edges_[edge_index].next_index;
156 return iter.edge_index == 0;
161 return iter.edge_index == 0;
166 return iter.edge_index != 0;
171 return iter.edge_index != 0;
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
Definition: adjlist.hh:37
Abstract class for states.
Definition: twa.hh:47
Definition: automata.hh:26