aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/gfsmArcIter.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/gfsmArcIter.h')
-rw-r--r--gfsm/gfsm/src/libgfsm/gfsmArcIter.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/gfsmArcIter.h b/gfsm/gfsm/src/libgfsm/gfsmArcIter.h
new file mode 100644
index 0000000..ff96994
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/gfsmArcIter.h
@@ -0,0 +1,202 @@
+
+/*=============================================================================*\
+ * File: gfsmArcIter.h
+ * Author: Bryan Jurish <moocow@ling.uni-potsdam.de>
+ * Description: finite state machine library: arc iterators
+ *
+ * Copyright (c) 2004-2007 Bryan Jurish.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *=============================================================================*/
+
+/** \file gfsmArcIter.h
+ * \brief Iterate over outgoing arcs of an automaton state.
+ */
+
+#ifndef _GFSM_ARCITER_H
+#define _GFSM_ARCITER_H
+
+#include <gfsmAutomaton.h>
+
+/*======================================================================
+ * Types: Arc iterators
+ */
+/// Abstract type for arc iterators
+typedef struct {
+ gfsmAutomaton *fsm; /**< fsm holding these arcs */
+ gfsmState *state; /**< state holding these arcs */
+ gfsmArcList *arcs; /**< pointer to node for current arc */
+} gfsmArcIter;
+
+/*======================================================================
+ * Methods: Arc iterators: open/close
+ */
+///\name Arc Iterators: Constructors etc.
+//@{
+/** Open a ::gfsmArcIter \a aip for the outgoing arcs from state with ID \a qid in the automaton \a fsm.
+ * \param aip Pointer to the ::gfsmArcIter to be opened; assumed to be already allocated
+ * \param fsm Automaton containing the state whose outgoing arcs are to be opened
+ * \param qid ID of the state whose outgoing arcs are to be opened
+ *
+ * \note
+ * \li Arc iterators may be silently invalidated by destructive operations
+ * \li The arc iterator should be closed with gfsm_arciter_close() when it is no longer needed.
+ * \li Caller is responsible for allocation and freeing of \a *aip.
+ */
+GFSM_INLINE
+void gfsm_arciter_open(gfsmArcIter *aip, gfsmAutomaton *fsm, gfsmStateId stateid);
+
+/** "Open" an arc iterator for the outgoing arcs from a state pointer into \a fsm
+ * \deprecated prefer gfsm_arciter_open()
+ */
+GFSM_INLINE
+void gfsm_arciter_open_ptr(gfsmArcIter *aip, gfsmAutomaton *fsm, gfsmState *stateptr);
+
+/** Close a ::gfsmArcIter \a aip if already opened, otherwise does nothing.
+ * \param aip The ::gfsmArcIter to be closed.
+ * \note
+ * \li If multiple copies of a ::gfsmArcIter exist, only one needs to be closed.
+ * \li Currently does nothing useful; in future versions this function may
+ * be required to free temporary allocations, etc.
+ */
+GFSM_INLINE
+void gfsm_arciter_close(gfsmArcIter *aip);
+
+/** Copy positional data from \a src to \a dst.
+ * \param src The ::gfsmArcIter from which to copy positional data
+ * \param dst The ::gfsmArcIter to which positional data is to be written
+ * \note
+ * \li Only the position pointed to should be copied by this method,
+ * and not the underlying data.
+ * \li If you use this method to copy ::gfsmArcIter positions,
+ * you should subsequently call gfsm_arciter_close() on only
+ * \e one of them!
+ */
+GFSM_INLINE
+gfsmArcIter *gfsm_arciter_copy(gfsmArcIter *dst, const gfsmArcIter *src);
+
+/* Create and return a new (shallow) copy of a ::gfsmArcIter.
+ * \param src The ::gfsmArcIter whose positional data is to be duplicated.
+ * \note
+ * \li Only the position pointed to should be copied by this method,
+ * and not the underlying data.
+ * \li If you use this method to copy ::gfsmArcIter positions,
+ * you should subsequently call gfsm_arciter_close() on only
+ * \e one of them!
+ */
+GFSM_INLINE
+gfsmArcIter *gfsm_arciter_clone(const gfsmArcIter *src);
+
+//@}
+
+/*======================================================================
+ * Methods: Arc iterators: Accessors
+ */
+///\name Arc Iterators: Accessors
+//@{
+
+/** Check validity of a ::gfsmArcIter* \a aip.
+ * \param aip The ::gfsmArcIter whose status is to be queried.
+ * \returns a true value if \a aip is considered valid, FALSE otherwise.
+ */
+GFSM_INLINE
+gboolean gfsm_arciter_ok(const gfsmArcIter *aip);
+
+/** Position the ::gfsmArcIter \a aip to the next available outgoing arc for which it was opened.
+ * \param aip The ::gfsmArcIter to be incremented.
+ */
+GFSM_INLINE
+void gfsm_arciter_next(gfsmArcIter *aip);
+
+/** Reset an arc iterator to the first outgoing arc for which it was initially opened.
+ * \param aip the ::gfsmArcIter to be reset
+ */
+GFSM_INLINE
+void gfsm_arciter_reset(gfsmArcIter *aip);
+
+/** Get current arc associated with a :gfsmArcIter, or NULL if none is available.
+ * \param aip The ::gfsmArcIter to be 'dereferenced'.
+ * \returns A pointer to the current ::gfsmArc 'pointed to' by \a aip, or NULL if
+ * no more arcs are available.
+ * \note
+ * \li In future versions, a ::gfsmAutomaton implementation will be free to return
+ * a dynamically generated arc here: there is no general
+ * guarantee that modifications to the ::gfsmArc returned by this
+ * function will be propagated to the underlying ::gfsmAutomaton.
+ * \li It is expected to remain the case that for the default automaton implementation class,
+ * the arcs returned by this function should be modifiable in-place.
+ */
+GFSM_INLINE
+gfsmArc *gfsm_arciter_arc(const gfsmArcIter *aip);
+
+/** Remove the arc referred to by a ::gfsmArcIter \a aip from the associated ::gfsmAutomaton,
+ * and position \aip to the next available arc, if any.
+ * \param aip The ::gfsmArcIter whose 'current' arc is to be removed.
+ */
+GFSM_INLINE
+void gfsm_arciter_remove(gfsmArcIter *aip);
+
+
+/** Position an arc-iterator to the current or next arc with lower label \a lo.
+ * \param aip The ::gfsmArcIter to reposition
+ * \param lo Lower arc label to seek
+ * \note
+ * Currently just wraps gfsm_arciter_ok(), gfsm_arciter_next() and gfsm_arciter_arc()
+ * in a linear search from the current position.
+ */
+void gfsm_arciter_seek_lower(gfsmArcIter *aip, gfsmLabelVal lo);
+
+/** Position an arc-iterator to the current or next arc with upper label \a hi.
+ * \param aip The ::gfsmArcIter to reposition
+ * \param lo Upper arc label to seek
+ * \note
+ * Currently just wraps gfsm_arciter_ok(), gfsm_arciter_next() and gfsm_arciter_arc()
+ * in a linear search from the current position.
+ */
+void gfsm_arciter_seek_upper(gfsmArcIter *aip, gfsmLabelVal hi);
+
+/** Position an arc-iterator to the current or next arc with lower label \a lo and upper label \a hi.
+ * If either \a lo or \a hi is ::gfsmNoLabel, no matching will be performed on the corresponding arc label(s).
+ * \param aip The ::gfsmArcIter to reposition
+ * \param lo Lower arc label to seek, or ::gfsmNoLabel to ignore lower labels
+ * \param hi Upper arc label to seek, or ::gfsmNoLabel to ignore upper labels
+ * \note
+ * Default implementation wraps gfsm_arciter_ok(), gfsm_arciter_next() and gfsm_arciter_arc()
+ * in a linear search from the current position.
+ */
+void gfsm_arciter_seek_both(gfsmArcIter *aip, gfsmLabelVal lo, gfsmLabelVal hi);
+
+/// Typedef for user-seek functions
+typedef gboolean (*gfsmArcIterSeekFunc) (gfsmArcIter *aip, gpointer data);
+
+/** Position an arc-iterator to the next arc for which (*seekfunc)(arciter,data) returns TRUE.
+ * \note
+ * Just wraps gfsm_arciter_ok() and gfsm_arciter_next()
+ * in a linear search from the current position.
+ */
+void gfsm_arciter_seek_user(gfsmArcIter *aip,
+ gfsmArcIterSeekFunc seekfunc,
+ gpointer data);
+
+
+//@}
+
+//-- inline definitions
+#ifdef GFSM_INLINE_ENABLED
+# include <gfsmArcIter.hi>
+#endif
+
+#endif /* _GFSM_ARCITER_H */
+