4 * Enumeration mapping strings (quarks) from/to integers.
6 * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 * Dual LGPL v2.1/GPL v2 license.
11 #include <ctf/ctf-types.h>
16 GHashTable
*value_to_quark
; /* Tuples (value, GQuark) */
17 GHashTable
*quark_to_value
; /* Tuples (GQuark, value) */
20 #if (__WORDSIZE == 32)
21 GQuark
enum_uint_to_quark(const struct enum_table
*table
, uint64_t v
)
23 gconstpointer q
= g_hash_table_lookup(table
->value_to_quark
, &v
);
24 return (GQuark
) (unsigned long) q
;
27 GQuark
enum_int_to_quark(const struct enum_table
*table
, uint64_t v
)
29 gconstpointer q
= g_hash_table_lookup(table
->value_to_quark
, &v
);
30 return (GQuark
) (unsigned long) q
;
33 uint64_t enum_quark_to_uint(size_t len
, int byte_order
, GQuark q
)
35 gconstpointer v
= g_hash_table_lookup(table
->quark_to_value
,
37 return *(const uint64_t *) v
;
40 int64_t enum_quark_to_int(size_t len
, int byte_order
, GQuark q
)
42 gconstpointer v
= g_hash_table_lookup(table
->quark_to_value
,
44 return *(const int64_t *) v
;
47 guint
enum_val_hash(gconstpointer key
)
49 int64_t ukey
= *(const int64_t *)key
;
51 return (guint
)ukey
^ (guint
)(ukey
>> 32);
54 gboolean
enum_val_equal(gconstpointer a
, gconstpointer b
)
56 int64_t ua
= *(const int64_t *)a
;
57 int64_t ub
= *(const int64_t *)b
;
62 void enum_val_free(void *ptr
)
67 void enum_signed_insert(struct enum_table
*table
, int64_t v
, GQuark q
)
69 int64_t *valuep
= g_new(int64_t, 1);
71 g_hash_table_insert(table
->value_to_quark
, valuep
,
72 (gpointer
) (unsigned long) q
);
73 g_hash_table_insert(table
->quark_to_value
, (gpointer
) (unsigned long) q
,
77 void enum_unsigned_insert(struct enum_table
*table
, uint64_t v
, GQuark q
)
79 uint64_t *valuep
= g_new(uint64_t, 1);
81 g_hash_table_insert(table
->value_to_quark
, valuep
,
82 (gpointer
) (unsigned long) q
);
83 g_hash_table_insert(table
->quark_to_value
, (gpointer
) (unsigned long) q
,
86 #else /* __WORDSIZE != 32 */
87 GQuark
enum_uint_to_quark(const struct enum_table
*table
, uint64_t v
)
89 gconstpointer q
= g_hash_table_lookup(table
->value_to_quark
,
91 return (GQuark
) (unsigned long) q
;
94 GQuark
enum_int_to_quark(const struct enum_table
*table
, uint64_t v
)
96 gconstpointer q
= g_hash_table_lookup(table
->value_to_quark
,
98 return (GQuark
) (unsigned long) q
;
101 uint64_t enum_quark_to_uint(size_t len
, int byte_order
, GQuark q
)
103 gconstpointer v
= g_hash_table_lookup(table
->quark_to_value
,
104 (gconstpointer
) (unsigned long) q
);
105 return *(const uint64_t *) v
;
108 int64_t enum_quark_to_int(size_t len
, int byte_order
, GQuark q
)
110 gconstpointer v
= g_hash_table_lookup(table
->quark_to_value
,
111 (gconstpointer
) (unsigned long) q
);
112 return *(const int64_t *) v
;
115 guint
enum_val_hash(gconstpointer key
)
117 return g_direct_hash(key
);
120 gboolean
enum_val_equal(gconstpointer a
, gconstpointer b
)
122 return g_direct_equal(a
, b
);
125 void enum_val_free(void *ptr
)
129 void enum_signed_insert(struct enum_table
*table
, int64_t v
, GQuark q
)
131 g_hash_table_insert(table
->value_to_quark
, (gpointer
) v
,
132 (gpointer
) (unsigned long) q
);
133 g_hash_table_insert(table
->quark_to_value
, (gpointer
) (unsigned long) q
,
137 void enum_unsigned_insert(struct enum_table
*table
, uint64_t v
, GQuark q
)
139 g_hash_table_insert(table
->value_to_quark
, (gpointer
) v
,
140 (gpointer
) (unsigned long) q
);
141 g_hash_table_insert(table
->quark_to_value
, (gpointer
) (unsigned long) q
,
144 #endif /* __WORDSIZE != 32 */
146 struct enum_table
*enum_new(void)
148 struct enum_table
*table
;
150 table
= g_new(struct enum_table
, 1);
151 table
->value_to_quark
= g_hash_table_new_full(enum_val_hash
,
153 enum_val_free
, NULL
);
154 table
->quark_to_value
= g_hash_table_new(g_direct_hash
, g_direct_equal
);
157 void enum_destroy(struct enum_table
*table
)
159 g_hash_table_destroy(table
->value_to_quark
);
160 g_hash_table_destroy(table
->quark_to_value
);
This page took 0.0325 seconds and 4 git commands to generate.