aboutsummaryrefslogtreecommitdiff
path: root/gfsm/gfsm/src/libgfsm/gfsmEnum.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfsm/gfsm/src/libgfsm/gfsmEnum.h')
-rw-r--r--gfsm/gfsm/src/libgfsm/gfsmEnum.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/gfsm/gfsm/src/libgfsm/gfsmEnum.h b/gfsm/gfsm/src/libgfsm/gfsmEnum.h
new file mode 100644
index 0000000..96ccdb7
--- /dev/null
+++ b/gfsm/gfsm/src/libgfsm/gfsmEnum.h
@@ -0,0 +1,129 @@
+
+/*=============================================================================*\
+ * File: gfsmEnum.h
+ * Author: Bryan Jurish <moocow@ling.uni-potsdam.de>
+ * Description: finite state machine library
+ *
+ * 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 gfsmEnum.h
+ * \brief Abstract utilities for run-time value enumerations
+ */
+
+#ifndef _GFSM_ENUM_H
+#define _GFSM_ENUM_H
+
+#include <gfsmMem.h>
+#include <gfsmCommon.h>
+
+/*======================================================================
+ * Types
+ */
+///\name Types and constants
+//@{
+
+/// Structure for mapping symbolic names to numeric IDs
+typedef struct {
+ GHashTable *table; ///< hash table which does the dirty work
+ guint nxtval; ///< next id to assign
+ gfsmDupFunc key_dup; ///< key copying function
+} gfsmEnum;
+
+/// Enumeration of StateIds
+typedef gfsmEnum gfsmDirectEnum;
+
+/** Constant indicating failed gfsmEnum value-lookup */
+extern const guint gfsmEnumNone;
+
+//@}
+
+/*======================================================================
+ * Methods: Constructors etc.
+ */
+/// \name Constructors etc.
+//@{
+
+/** create a new gfsmEnum (full version) */
+GFSM_INLINE
+gfsmEnum *gfsm_enum_new_full(gfsmDupFunc key_dup_func,
+ GHashFunc key_hash_func,
+ GEqualFunc key_equal_func,
+ GDestroyNotify key_destroy_func);
+
+/** create a new gfsmEnum (no copying) */
+#define gfsm_enum_new(key_hash_f) gfsm_enum_new_full(NULL,key_hash_f,NULL,NULL)
+
+/** create a new gfsmDirectEnum */
+#define gfsm_direct_enum_new() gfsm_enum_new(g_direct_hash)
+
+/** Clear a gfsmEnum */
+GFSM_INLINE
+void gfsm_enum_clear(gfsmEnum *en);
+
+/** Free a gfsmEnum */
+GFSM_INLINE
+void gfsm_enum_free(gfsmEnum *en);
+//@}
+
+/*======================================================================
+ * Methods: Accessors
+ */
+/// \name Accessors
+//@{
+
+/** Get next available value */
+#define gfsm_enum_next_value(en) ((en)->nxtval)
+
+/** Lookup the numeric value associated with \a lookup_key.
+ * On return, *\a stored_key points to the original (stored) key, if any;
+ * and *\a stored_value points to the stored value.
+ * \returns true iff a value for \a key was already stored
+ */
+GFSM_INLINE
+gboolean gfsm_enum_lookup_extended(gfsmEnum *en,
+ gconstpointer lookup_key,
+ gpointer *stored_key,
+ gpointer *stored_val);
+
+/** Lookup the numeric value associated with \a key.
+ * \returns the value associated with \a key, or gfsmEnumNone
+ * if no such value was found
+ */
+GFSM_INLINE
+guint gfsm_enum_lookup(gfsmEnum *en, gconstpointer key);
+
+
+/** Insert or overwrite new value \a val for \a key.
+ * If \a val is gfsmEnumNone, the next available value will be used.
+ * \returns new value for \a key
+ */
+GFSM_INLINE
+guint gfsm_enum_insert_full(gfsmEnum *en, gpointer key, guint val);
+
+/** Insert a (possibly new) value \a val for \a key */
+#define gfsm_enum_insert(en,key) gfsm_enum_insert_full(en,key,gfsmEnumNone)
+
+/** Really just an alias for gfsm_enum_insert(en,key) */
+#define gfsm_enum_get(en,key) gfsm_enum_insert(en,key)
+
+//-- inline definitions
+#ifdef GFSM_INLINE_ENABLED
+# include <gfsmEnum.hi>
+#endif
+
+#endif /* _GFSM_ENUM_H */