[gtk/wip/otte/vector: 3/4] vector: Add a bunch of new features
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/vector: 3/4] vector: Add a bunch of new features
- Date: Sun, 5 Jul 2020 11:36:24 +0000 (UTC)
commit 345e05a32929bdacf90e4af6e886c57a57b06f47
Author: Benjamin Otte <otte redhat com>
Date: Fri Jul 3 04:51:14 2020 +0200
vector: Add a bunch of new features
* GTK_VECTOR_BY_VALUE
#define this to get GArrray-like behavior
* gtk_vector_splice (v, 0, 0, NULL, 25)
Adding items but passing NULL as the items will zero() them.
* gtk_vector_set_size()
A nicer way to call gtk_vector_splice()
gtk/gtkvectorimpl.c | 65 ++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 52 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkvectorimpl.c b/gtk/gtkvectorimpl.c
index ee5fbc1114..6cf583f697 100644
--- a/gtk/gtkvectorimpl.c
+++ b/gtk/gtkvectorimpl.c
@@ -89,8 +89,12 @@ gtk_vector(free_elements) (_T_ *start,
#ifdef GTK_VECTOR_FREE_FUNC
_T_ *e;
for (e = start; e < end; e++)
+#ifdef GTK_VECTOR_BY_VALUE
+ GTK_VECTOR_FREE_FUNC (e);
+#else
GTK_VECTOR_FREE_FUNC (*e);
#endif
+#endif
}
/* no G_GNUC_UNUSED here */
@@ -107,32 +111,32 @@ gtk_vector(clear) (GtkVector *self)
}
G_GNUC_UNUSED static inline _T_ *
-gtk_vector(get_data) (GtkVector *self)
+gtk_vector(get_data) (const GtkVector *self)
{
return self->start;
}
G_GNUC_UNUSED static inline _T_ *
-gtk_vector(index) (GtkVector *self,
- gsize pos)
+gtk_vector(index) (const GtkVector *self,
+ gsize pos)
{
return self->start + pos;
}
G_GNUC_UNUSED static inline gsize
-gtk_vector(get_capacity) (GtkVector *self)
+gtk_vector(get_capacity) (const GtkVector *self)
{
return self->end_allocation - self->start;
}
G_GNUC_UNUSED static inline gsize
-gtk_vector(get_size) (GtkVector *self)
+gtk_vector(get_size) (const GtkVector *self)
{
return self->end - self->start;
}
G_GNUC_UNUSED static inline gboolean
-gtk_vector(is_empty) (GtkVector *self)
+gtk_vector(is_empty) (const GtkVector *self)
{
return self->end == self->start;
}
@@ -199,31 +203,64 @@ gtk_vector(splice) (GtkVector *self,
GTK_VECTOR_REAL_SIZE (remaining) * sizeof (_T_));
if (added)
- memcpy (gtk_vector(index) (self, pos),
- additions,
- added * sizeof (_T_));
+ {
+ if (additions)
+ memcpy (gtk_vector(index) (self, pos),
+ additions,
+ added * sizeof (_T_));
+ else
+ memset (gtk_vector(index) (self, pos), 0, added * sizeof (_T_));
+ }
/* might overflow, but does the right thing */
self->end += added - removed;
}
+G_GNUC_UNUSED static void
+gtk_vector(set_size) (GtkVector *self,
+ gsize new_size)
+{
+ gsize old_size = gtk_vector(get_size) (self);
+ if (new_size > old_size)
+ gtk_vector(splice) (self, old_size, 0, NULL, new_size - old_size);
+ else
+ gtk_vector(splice) (self, old_size, old_size - new_size, NULL, 0);
+}
+
G_GNUC_UNUSED static void
gtk_vector(append) (GtkVector *self,
+#ifdef GTK_VECTOR_BY_VALUE
+ _T_ *value)
+#else
_T_ value)
+#endif
{
gtk_vector(splice) (self,
gtk_vector(get_size) (self),
0,
+#ifdef GTK_VECTOR_BY_VALUE
+ value,
+#else
&value,
+#endif
1);
}
+#ifdef GTK_VECTOR_BY_VALUE
+G_GNUC_UNUSED static _T_ *
+gtk_vector(get) (const GtkVector *self,
+ gsize pos)
+{
+ return gtk_vector(index) (self, pos);
+}
+#else
G_GNUC_UNUSED static _T_
-gtk_vector(get) (GtkVector *self,
- gsize pos)
+gtk_vector(get) (const GtkVector *self,
+ gsize pos)
{
return *gtk_vector(index) (self, pos);
}
+#endif
#ifndef GTK_VECTOR_NO_UNDEF
@@ -235,10 +272,12 @@ gtk_vector(get) (GtkVector *self,
#undef gtk_vector
#undef GTK_VECTOR_REAL_SIZE
+#undef GTK_VECTOR_BY_VALUE
#undef GTK_VECTOR_ELEMENT_TYPE
+#undef GTK_VECTOR_FREE_FUNC
#undef GTK_VECTOR_NAME
-#undef GTK_VECTOR_TYPE_NAME
-#undef GTK_VECTOR_PREALLOC
#undef GTK_VECTOR_NULL_TERMINATED
+#undef GTK_VECTOR_PREALLOC
+#undef GTK_VECTOR_TYPE_NAME
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]