[gtk/wip/otte/vector: 15/17] array: Add a bunch of new features
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/vector: 15/17] array: Add a bunch of new features
- Date: Thu, 16 Jul 2020 15:54:52 +0000 (UTC)
commit eec5f3a448f084e28464070bedefaad1e2f7cc28
Author: Benjamin Otte <otte redhat com>
Date: Thu Jul 16 16:33:14 2020 +0200
array: Add a bunch of new features
* GDK_ARRAY_BY_VALUE
#define this to get GArray-like behavior
* gdk_array_splice (v, 0, 0, NULL, 25)
Adding items but passing NULL as the items will zero() them.
* gdk_array_set_size()
A nicer way to call gdk_array_splice()
* constify getters
gdk/gdkarrayimpl.c | 71 ++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 55 insertions(+), 16 deletions(-)
---
diff --git a/gdk/gdkarrayimpl.c b/gdk/gdkarrayimpl.c
index 37c722f099..b08b43b2c2 100644
--- a/gdk/gdkarrayimpl.c
+++ b/gdk/gdkarrayimpl.c
@@ -89,8 +89,12 @@ gdk_array(free_elements) (_T_ *start,
#ifdef GDK_ARRAY_FREE_FUNC
_T_ *e;
for (e = start; e < end; e++)
+#ifdef GDK_ARRAY_BY_VALUE
+ GDK_ARRAY_FREE_FUNC (e);
+#else
GDK_ARRAY_FREE_FUNC (*e);
#endif
+#endif
}
/* no G_GNUC_UNUSED here */
@@ -107,32 +111,32 @@ gdk_array(clear) (GdkArray *self)
}
G_GNUC_UNUSED static inline _T_ *
-gdk_array(get_data) (GdkArray *self)
+gdk_array(get_data) (const GdkArray *self)
{
return self->start;
}
G_GNUC_UNUSED static inline _T_ *
-gdk_array(index) (GdkArray *self,
- gsize pos)
+gdk_array(index) (const GdkArray *self,
+ gsize pos)
{
return self->start + pos;
}
G_GNUC_UNUSED static inline gsize
-gdk_array(get_capacity) (GdkArray *self)
+gdk_array(get_capacity) (const GdkArray *self)
{
return self->end_allocation - self->start;
}
G_GNUC_UNUSED static inline gsize
-gdk_array(get_size) (GdkArray *self)
+gdk_array(get_size) (const GdkArray *self)
{
return self->end - self->start;
}
G_GNUC_UNUSED static inline gboolean
-gdk_array(is_empty) (GdkArray *self)
+gdk_array(is_empty) (const GdkArray *self)
{
return self->end == self->start;
}
@@ -199,32 +203,65 @@ gdk_array(splice) (GdkArray *self,
GDK_ARRAY_REAL_SIZE (remaining) * sizeof (_T_));
if (added)
- memcpy (gdk_array(index) (self, pos),
- additions,
- added * sizeof (_T_));
+ {
+ if (additions)
+ memcpy (gdk_array(index) (self, pos),
+ additions,
+ added * sizeof (_T_));
+ else
+ memset (gdk_array(index) (self, pos), 0, added * sizeof (_T_));
+ }
+
/* might overflow, but does the right thing */
self->end += added - removed;
}
+G_GNUC_UNUSED static void
+gdk_array(set_size) (GdkArray *self,
+ gsize new_size)
+{
+ gsize old_size = gdk_array(get_size) (self);
+ if (new_size > old_size)
+ gdk_array(splice) (self, old_size, 0, NULL, new_size - old_size);
+ else
+ gdk_array(splice) (self, new_size, old_size - new_size, NULL, 0);
+}
+
G_GNUC_UNUSED static void
gdk_array(append) (GdkArray *self,
+#ifdef GDK_ARRAY_BY_VALUE
+ _T_ *value)
+#else
_T_ value)
+#endif
{
gdk_array(splice) (self,
gdk_array(get_size) (self),
0,
+#ifdef GDK_ARRAY_BY_VALUE
+ value,
+#else
&value,
+#endif
1);
}
-G_GNUC_UNUSED static _T_
-gdk_array(get) (GdkArray *self,
- gsize pos)
+#ifdef GDK_ARRAY_BY_VALUE
+G_GNUC_UNUSED static _T_ *
+gdk_array(get) (const GdkArray *self,
+ gsize pos)
{
- return *gdk_array(index) (self, pos);
+ return gdk_array(index) (self, pos);
}
-
+#else
+G_GNUC_UNUSED static _T_
+gdk_array(get) (const GdkArray *self,
+ gsize pos)
+ {
+ return *gdk_array(index) (self, pos);
+ }
+#endif
#ifndef GDK_ARRAY_NO_UNDEF
@@ -235,10 +272,12 @@ gdk_array(get) (GdkArray *self,
#undef gdk_array
#undef GDK_ARRAY_REAL_SIZE
+#undef GDK_ARRAY_BY_VALUE
#undef GDK_ARRAY_ELEMENT_TYPE
+#undef GDK_ARRAY_FREE_FUNC
#undef GDK_ARRAY_NAME
-#undef GDK_ARRAY_TYPE_NAME
-#undef GDK_ARRAY_PREALLOC
#undef GDK_ARRAY_NULL_TERMINATED
+#undef GDK_ARRAY_PREALLOC
+#undef GDK_ARRAY_TYPE_NAME
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]