Back to Closure of automaton states
// Description: Closure of automaton states
#ifndef PASTELSYS_AUTOMATON_CLOSURE_H
#define PASTELSYS_AUTOMATON_CLOSURE_H
#include "pastel/sys/automaton/automaton_closure_concepts.h"
#include "pastel/sys/automaton.h"
namespace Pastel
{
    //! Computes the closure of each state in the automaton.
    /*!
   The closure of a state A is the set of those states which 
   are reachable from A by transitions with closure symbols. 
   The type of the state-set to contain these states needs to 
   be explicitly specified by the user. Have a look at 
   automaton_closure_concepts.h for more information.
   Preconditions:
   StateSet is copy-constructible.
   forEachRelated:
   Visits each state in the direct closure of 'state'.
   insert:
   Inserts the given state in the given state-set.
   report:
   Reports the closure-set of a specific state.
   */
    template <
        typename Symbol,
        typename StateData,
        typename TransitionData,
        typename Customization,
        typename StateSet,
        typename ForEachRelated,
        typename Insert_State,
        typename Closure_Output>
    void automatonClosure(
        const Automaton<Symbol, StateData, TransitionData, Customization>& automaton,
        const StateSet& emptySet,
        const ForEachRelated& forEachRelated,
        const Insert_State& insert,
        const Closure_Output& report);
    //! Compures the epsilon-closure of each state in the automaton.
    /*!
   This is a convenience function which calls automatonClosure()
   with the ForEachRelated traversing the epsilon-transitions.
   */
    template <
        typename Symbol,
        typename StateData,
        typename TransitionData,
        typename Customization,
        typename StateSet,
        typename Insert_State,
        typename Closure_Output>
    void epsilonClosure(
        const Automaton<Symbol, StateData, TransitionData, Customization>& automaton,
        const StateSet& emptySet,
        const Insert_State& insert,
        const Closure_Output& report);
}
#include "pastel/sys/automaton/automaton_closure.hpp"
#endif