5 #include <boost/bimap.hpp>
6 #include <boost/bimap/set_of.hpp>
7 #include <boost/bimap/unordered_set_of.hpp>
20 template <Automaton Aut>
45 static auto res =
symbol{
"expression_automaton<"
52 o <<
"expression_automaton<";
59 = boost::bimaps::unordered_set_of<expression_t,
60 vcsn::hash<expressionset_t>,
61 vcsn::equal_to<expressionset_t>>;
63 using right_t = boost::bimaps::set_of<state_t>;
65 using bimap_t = boost::bimap<left_t, right_t>;
69 state_t state(const expression_t& r)
72 const auto& map_ = bimap_.left;
73 auto i = map_.find(r);
74 if (i == std::end(map_))
76 res = super_t::new_state();
77 bimap_.insert({r, res});
78 todo_.emplace(res, r);
79 super_t::set_lazy(res);
86 using super_t::add_transition;
88 add_transition(state_t src, const expression_t& dst,
89 label_t l, const weight_t& w)
91 super_t::add_transition(src, state(dst), l, w);
94 using super_t::new_transition;
96 new_transition(state_t src, const expression_t& dst,
97 label_t l, const weight_t& w)
99 super_t::new_transition(src, state(dst), l, w);
102 using super_t::set_initial;
104 set_initial(const expression_t& s, const weight_t& w)
106 super_t::set_initial(state(s), w);
109 bool state_has_name(state_t s) const
111 return has(origins(), s);
115 print_state_name(state_t s, std::ostream& o,
119 auto i = origins().find(s);
120 if (i == std::end(origins()))
121 this->print_state(s, o);
123 rs_.print(i->second, o, fmt);
128 using origins_t = typename bimap_t::right_map;
129 const origins_t& origins() const
138 std::stack<std::pair<state_t, const state_name_t>> todo_;
typename detail::weight_t_of_impl< base_t< ValueSet >>::type weight_t_of
typename expressionset_t::value_t expression_t
An incremental automaton whose states are expressions.
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
label_t_of< super_t > label_t
Aggregate an automaton, and forward calls to it.
auto print_set(Args &&...args) const -> decltype(aut_-> print_set(std::forward< Args >(args)...))
typename detail::context_t_of_impl< base_t< ValueSet >>::type context_t_of
static symbol sname()
Static name.
weight_t_of< super_t > weight_t
context_t_of< automaton_t > context_t
state_t_of< super_t > state_t
expressionset_t rs_
The expression's set.
typename detail::state_t_of_impl< base_t< ValueSet >>::type state_t_of
typename detail::label_t_of_impl< base_t< ValueSet >>::type label_t_of
std::ostream & print_set(std::ostream &o, format fmt={}) const
An input/output format for valuesets.
expression_t state_name_t
State are named by expressions.
expression_automaton_impl(const expressionset_t &rs)
Provide a variadic mul on top of a binary mul(), and one().