diff options
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/gfsmArcIter.hi')
-rw-r--r-- | gfsm/gfsm/src/libgfsm/gfsmArcIter.hi | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/gfsmArcIter.hi b/gfsm/gfsm/src/libgfsm/gfsmArcIter.hi new file mode 100644 index 0000000..bb8268e --- /dev/null +++ b/gfsm/gfsm/src/libgfsm/gfsmArcIter.hi @@ -0,0 +1,126 @@ + +/*=============================================================================*\ + * File: gfsmArcIter.hi + * Author: Bryan Jurish <moocow@ling.uni-potsdam.de> + * Description: finite state machine library: arc iterators: inline definitions + * + * 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 + *=============================================================================*/ + +/*====================================================================== + * Methods: Arc iterators: open/close + */ + +//-------------------------------------------------------------- +// open() +GFSM_INLINE +void gfsm_arciter_open(gfsmArcIter *aip, gfsmAutomaton *fsm, gfsmStateId stateid) +{ + aip->fsm = fsm; + aip->state = gfsm_automaton_find_state(fsm,stateid); + aip->arcs = NULL; + gfsm_arciter_reset(aip); +} + +//-------------------------------------------------------------- +// open_ptr() +GFSM_INLINE +void gfsm_arciter_open_ptr(gfsmArcIter *aip, gfsmAutomaton *fsm, gfsmState *stateptr) +{ + aip->fsm = fsm; + aip->state = stateptr; + aip->arcs = NULL; + gfsm_arciter_reset(aip); +} + +//-------------------------------------------------------------- +// reset() +GFSM_INLINE +void gfsm_arciter_reset(gfsmArcIter *aip) { + if (aip->state && gfsm_state_is_ok(aip->state)) { + aip->arcs = aip->state->arcs; + } else { + aip->arcs = NULL; + } +} + +//-------------------------------------------------------------- +// close() +GFSM_INLINE +void gfsm_arciter_close(gfsmArcIter *aip) { + if (!aip) return; + aip->fsm = NULL; + aip->state = NULL; + aip->arcs = NULL; +} + +//-------------------------------------------------------------- +// copy() +GFSM_INLINE +gfsmArcIter *gfsm_arciter_copy(gfsmArcIter *dst, const gfsmArcIter *src) { + *dst = *src; + return dst; +} + +//-------------------------------------------------------------- +// clone() +GFSM_INLINE +gfsmArcIter *gfsm_arciter_clone(const gfsmArcIter *src) { + return (gfsmArcIter*)gfsm_mem_dup_n(src,sizeof(gfsmArcIter)); +} + +/*====================================================================== + * Methods: Arc iterators: Accessors + */ + +//-------------------------------------------------------------- +// arc() +GFSM_INLINE +gfsmArc *gfsm_arciter_arc(const gfsmArcIter *aip) +{ + //return aip->arcs ? ((gfsmArc*)aip->arcs->data) : NULL; + return aip->arcs ? (&(aip->arcs->arc)) : NULL; +} + +//-------------------------------------------------------------- +// ok() +GFSM_INLINE +gboolean gfsm_arciter_ok(const gfsmArcIter *aip) +{ return (aip != NULL && aip->arcs != NULL); } + +//-------------------------------------------------------------- +// next() +GFSM_INLINE +void gfsm_arciter_next(gfsmArcIter *aip) +{ if (aip && aip->arcs) aip->arcs = aip->arcs->next; } + + +//-------------------------------------------------------------- +// seek_X() +//--EXTERN + +//-------------------------------------------------------------- +// remove() +GFSM_INLINE +void gfsm_arciter_remove(gfsmArcIter *aip) +{ + if (aip && aip->arcs) { + gfsmArcList *next = aip->arcs->next; + aip->state->arcs = gfsm_arclist_delete_node(aip->state->arcs, aip->arcs); + aip->arcs = next; + } +} |