aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/gfsmArcList.hi
blob: 9426f26bba44d5e28037c1a98f9cc80bea9ba7ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

/*=============================================================================*\
 * File: gfsmArclist.hi
 * Author: Bryan Jurish <moocow@ling.uni-potsdam.de>
 * Description: finite state machine library: arc lists: 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
 *=============================================================================*/

#include <stdlib.h>

/*======================================================================
 * Methods: Arc lists
 */

/*--------------------------------------------------------------
 * arclist_prepend_node()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_prepend_node(gfsmArcList *al, gfsmArcList *nod)
{
  nod->next = al;
  return nod;
}

/*--------------------------------------------------------------
 * arclist_new_full()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_new_full(gfsmStateId  src,
				   gfsmStateId  dst,
				   gfsmLabelVal lo,
				   gfsmLabelVal hi,
				   gfsmWeight   wt,
				   gfsmArcList  *nxt)
{
  gfsmArcList *nod = g_new(gfsmArcList,1);
  nod->arc.source = src;
  nod->arc.target = dst;
  nod->arc.lower  = lo;
  nod->arc.upper  = hi;
  nod->arc.weight = wt;
  nod->next       = nxt;
  return nod;
}

/*--------------------------------------------------------------
 * arclist_delete_node()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_delete_node(gfsmArcList *al, gfsmArcList *nod)
{
  al = gfsm_arclist_remove_node(al,nod);
  g_free(nod);
  return al;
}

/*--------------------------------------------------------------
 * arclist_insert()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_insert(gfsmArcList *al,
				 gfsmStateId  src,
				 gfsmStateId  dst,
				 gfsmLabelVal lo,
				 gfsmLabelVal hi,
				 gfsmWeight   wt,
				 gfsmArcCompData *acdata)
{
  gfsmArcList *nod = gfsm_arclist_new_full(src,dst,lo,hi,wt,NULL);
  if (!acdata || acdata->mask == gfsmASMNone) {
    nod->next = al;
    return nod;
  }
  return gfsm_arclist_insert_node_sorted(al,nod,acdata);
}

/*--------------------------------------------------------------
 * arclist_insert_node()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_insert_node(gfsmArcList *al,
				      gfsmArcList *nod,
				      gfsmArcCompData *acdata)
{
  if (!acdata || acdata->mask == gfsmASMNone) return gfsm_arclist_prepend_node(al,nod);
  return gfsm_arclist_insert_node_sorted(al,nod,acdata);
}

/*--------------------------------------------------------------
 * arclist_sort_with_data()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_sort_with_data (gfsmArcList      *al,
					  GCompareDataFunc  compare_func,
					  gpointer          user_data)
{
  return gfsm_arclist_sort_real (al, (GFunc)compare_func, user_data);
}



/*--------------------------------------------------------------
 * arclist_sort()
 */
GFSM_INLINE
gfsmArcList *gfsm_arclist_sort(gfsmArcList *al, gfsmArcCompData *acdata)
{
  return gfsm_arclist_sort_real(al, (GFunc)gfsm_arc_compare_bymask, acdata);
}