/* * This file is part of the program ltl2dstar (http://www.ltl2dstar.de/). * Copyright (C) 2005-2007 Joachim Klein * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef DA_STATE_H #define DA_STATE_H /** @file * Provides class DA_State for storing a state of a deterministic omega-automaton. */ #include "common/Exceptions.hpp" #include "common/Indexable.hpp" #include "common/BitSet.hpp" #include #include #include template class EdgeContainer, typename AcceptanceCondition> class DA; /** * A state of a deterministic omega-automaton. * For a description of the template parameters, see class DA. */ template class EdgeContainer, typename AcceptanceCondition> class DA_State : public Indexable > { public: /** The type of the automaton containing this state */ typedef DA graph_type; /** The type of the edges in the DA. */ typedef typename graph_type::edge_type edge_type; /** The type of the states in the DA (ie this DA_State class). */ typedef typename graph_type::state_type state_type; /** The type of the EdgeContainer for the DA_State. */ typedef EdgeContainer edge_container_type; /** The type of an iterator over all the edges of this state. */ typedef typename edge_container_type::iterator edge_iterator; /** * Constructor. * @param graph The automaton (DA) that contains this state. */ DA_State(graph_type& graph) : _graph(graph), _edges(graph.getAPSize()) {;} ~DA_State() {;} /** Get the EdgeContainer to access the edges. */ edge_container_type& edges() {return _edges;} /** Get the EdgeContainer to access the edges. */ const edge_container_type& edges() const {return _edges;} /** Get the name (index) of this state. */ unsigned int getName() const { return _graph.getIndexForState(this); }; /** Print the name of the state on an output stream. */ friend std::ostream& operator<<(std::ostream& out, DA_State& state) { out << state.getName(); return out; } /** Set an description for the state */ void setDescription(const std::string& s) { _description.reset(new std::string(s)); } /** * Get an description for the state (previously set using setDescription()). * Should only be called after verifying that the state hasDescription() * @return a const string ref to the description */ const std::string& getDescription() { assert(hasDescription()); return *_description; } /** * Check wheter the state has a description. */ bool hasDescription() { return _description.get()!=0; } /** * Checks if all transitions originating in this state * leed back to itself. */ bool hasOnlySelfLoop() { for (edge_iterator eit=edges().begin(); eit!=edges().end(); ++eit) { if (this != (*eit).second) { return false; } } return true; } /** Get the AcceptanceForState access functor for this state */ typename AcceptanceCondition::AcceptanceForState acceptance() { typename AcceptanceCondition::AcceptanceForState acc(_graph.acceptance(), this->getName()); return acc; } /** A Functor that gets the name of the to state in an edge */ struct GetToForEdgeFunctor : public std::unary_function { unsigned int operator()(typename edge_container_type::edge_type e) const { return e.second->getName(); } }; /** * The type of an iterator over the names (indizes) of the * states that are reachable in one step from this state. * Note: A state can occur multiple times! */ typedef boost::transform_iterator< GetToForEdgeFunctor, typename edge_container_type::EdgeIterator > successor_iterator; /** * Returns an iterator over the names of the successors, pointing to the first. * Note: A state can occur multiple times! */ successor_iterator successors_begin() { return successor_iterator(_edges.begin(), GetToForEdgeFunctor()); } /** * Returns an iterator over the names of the successors, pointing after the last. * Note: A state can occur multiple times! */ successor_iterator successors_end() { return successor_iterator(_edges.end(), GetToForEdgeFunctor()); } private: /** The automaton of which this state is a part. */ graph_type& _graph; /** The edges */ edge_container_type _edges; /** A description */ std::auto_ptr _description; }; #endif