diff options
-rw-r--r-- | tests/test-buffer.c | 34 | ||||
-rw-r--r-- | ufo/ufo-buffer.c | 54 | ||||
-rw-r--r-- | ufo/ufo-buffer.h | 5 |
3 files changed, 93 insertions, 0 deletions
diff --git a/tests/test-buffer.c b/tests/test-buffer.c index dd5d200..c53c78b 100644 --- a/tests/test-buffer.c +++ b/tests/test-buffer.c @@ -109,6 +109,36 @@ test_convert_16_from_data (Fixture *fixture, g_assert (host_data[i] == ((gfloat) fixture->data16[i])); } +static void +test_metadata (Fixture *fixture, + gconstpointer unused) +{ + GValue value = G_VALUE_INIT; + GValue *other; + + g_assert (ufo_buffer_get_metadata (fixture->buffer, "bar") == NULL); + + /* Insert data */ + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, -123); + + ufo_buffer_set_metadata (fixture->buffer, "foo", &value); + other = ufo_buffer_get_metadata (fixture->buffer, "foo"); + + g_assert (other != NULL); + g_assert (g_value_get_int (other) == -123); + + /* Overwrite data */ + g_value_unset (&value); + g_value_init (&value, G_TYPE_FLOAT); + g_value_set_float (&value, 3.14f); + ufo_buffer_set_metadata (fixture->buffer, "foo", &value); + + other = ufo_buffer_get_metadata (fixture->buffer, "foo"); + g_assert (other != NULL); + g_assert (g_value_get_float (other) == 3.14f); +} + void test_add_buffer (void) { @@ -127,4 +157,8 @@ test_add_buffer (void) g_test_add ("/no-opencl/buffer/convert/16/data", Fixture, NULL, setup, test_convert_16_from_data, teardown); + + g_test_add ("/no-opencl/buffer/metadata", + Fixture, NULL, + setup, test_metadata, teardown); } diff --git a/ufo/ufo-buffer.c b/ufo/ufo-buffer.c index 98b18e5..71167f9 100644 --- a/ufo/ufo-buffer.c +++ b/ufo/ufo-buffer.c @@ -62,6 +62,7 @@ struct _UfoBufferPrivate { gsize size; /* size of buffer in bytes */ UfoMemLocation location; UfoMemLocation last_location; + GHashTable *metadata; }; static void @@ -996,6 +997,56 @@ ufo_buffer_convert_from_data (UfoBuffer *buffer, } /** + * ufo_buffer_get_metadata: + * @buffer: A #UfoBuffer + * @name: Name of the associated meta data + * + * Returns: (transfer: none) previously defined meta data for this buffer. + */ +GValue * +ufo_buffer_get_metadata (UfoBuffer *buffer, + const gchar *name) +{ + g_return_val_if_fail (UFO_IS_BUFFER (buffer), NULL); + return g_hash_table_lookup (buffer->priv->metadata, name); +} + +/** + * ufo_buffer_get_metadata: + * @buffer: A #UfoBuffer + * @name: Name of the associated meta data + * @value: #GValue of the meta data + * + * Associates a key-value pair with @buffer. + */ +void +ufo_buffer_set_metadata (UfoBuffer *buffer, + const gchar *name, + GValue *value) +{ + UfoBufferPrivate *priv; + GValue *old; + GValue *new; + + g_return_if_fail (UFO_IS_BUFFER (buffer)); + priv = buffer->priv; + + old = g_hash_table_lookup (priv->metadata, name); + + if (old != NULL) { + g_print ("unsetting old\n"); + g_value_unset (old); + } + + g_print ("here\n"); + new = g_malloc0 (sizeof (GValue)); + g_value_init (new, G_VALUE_TYPE (value)); + g_value_copy (value, new); + + g_hash_table_insert (priv->metadata, g_strdup (name), new); +} + +/** * ufo_buffer_param_spec: * @name: canonical name of the property specified * @nick: nick name for the property specified @@ -1046,6 +1097,8 @@ ufo_buffer_finalize (GObject *gobject) free_cl_mem (&priv->device_array); free_cl_mem (&priv->device_image); + g_hash_table_destroy (priv->metadata); + G_OBJECT_CLASS(ufo_buffer_parent_class)->finalize(gobject); } @@ -1072,6 +1125,7 @@ ufo_buffer_init (UfoBuffer *buffer) priv->location = UFO_LOCATION_INVALID; priv->last_location = UFO_LOCATION_INVALID; priv->requisition.n_dims = 0; + priv->metadata = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } static void diff --git a/ufo/ufo-buffer.h b/ufo/ufo-buffer.h index 4864161..28d0f57 100644 --- a/ufo/ufo-buffer.h +++ b/ufo/ufo-buffer.h @@ -154,6 +154,11 @@ void ufo_buffer_convert (UfoBuffer *buffer, void ufo_buffer_convert_from_data (UfoBuffer *buffer, gconstpointer data, UfoBufferDepth depth); +GValue *ufo_buffer_get_metadata (UfoBuffer *buffer, + const gchar *name); +void ufo_buffer_set_metadata (UfoBuffer *buffer, + const gchar *name, + GValue *value); GType ufo_buffer_get_type (void); GParamSpec* ufo_buffer_param_spec (const gchar* name, |