37    typedef typename Graph::state state;
 
   38    typedef typename Graph::edge edge;
 
   39    typedef State_Name name;
 
   41    typedef std::unordered_map<name, state,
 
   42                               Name_Hash, Name_Equal> name_to_state_t;
 
   43    name_to_state_t name_to_state;
 
   44    typedef std::vector<name> state_to_name_t;
 
   45    state_to_name_t state_to_name;
 
   62    template <
typename... Args>
 
   63    state new_state(name n, Args&&... args)
 
   65      auto p = name_to_state.emplace(n, 0
U);
 
   68          unsigned s = g_.new_state(std::forward<Args>(args)...);
 
   70          if (state_to_name.size() < s + 1)
 
   71            state_to_name.resize(s + 1);
 
   75      return p.first->second;
 
   85      auto p = name_to_state.emplace(newname, s);
 
   89          auto old = p.first->second;
 
   92          auto& trans = g_.edge_vector();
 
   93          auto& states = g_.states();
 
   94          trans[states[s].succ_tail].next_succ = states[old].succ;
 
   95          states[s].succ_tail = states[old].succ_tail;
 
   97          states[old].succ_tail = 0;
 
   99          unsigned tend = trans.size();
 
  100          for (
unsigned t = 1; t < tend; ++t)
 
  102              if (trans[t].src == old)
 
  104              if (trans[t].dst == old)
 
 
  111    state get_state(name n)
 const 
  113      return name_to_state.at(n);
 
  116    name get_name(state s)
 const 
  118      return state_to_name.at(s);
 
  121    bool has_state(name n)
 const 
  123      return name_to_state.find(n) != name_to_state.end();
 
  126    const state_to_name_t& names()
 const 
  128      return state_to_name;
 
  131    template <
typename... Args>
 
  133    new_edge(name src, name dst, Args&&... args)
 
  135      return g_.new_edge(get_state(src), get_state(dst),
 
  136                         std::forward<Args>(args)...);
 
  139    template <
typename I, 
typename... Args>
 
  141    new_univ_edge(name src, I dst_begin, I dst_end, Args&&... args)
 
  143      std::vector<unsigned> d;
 
  144      d.reserve(std::distance(dst_begin, dst_end));
 
  145      while (dst_begin != dst_end)
 
  146        d.emplace_back(get_state(*dst_begin++));
 
  147      return g_.new_univ_edge(get_state(src), d.begin(), d.end(),
 
  148                              std::forward<Args>(args)...);
 
  151    template <
typename... Args>
 
  153    new_univ_edge(name src,
 
  154                  const std::initializer_list<State_Name>& dsts, Args&&... args)
 
  156      return new_univ_edge(src, dsts.begin(), dsts.end(),
 
  157                           std::forward<Args>(args)...);