summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test-buffer.c34
-rw-r--r--ufo/ufo-buffer.c54
-rw-r--r--ufo/ufo-buffer.h5
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,