GMemoryOutputStream: Add new _resizable() constructor usable from bindings
authorColin Walters <walters@verbum.org>
Thu, 22 Nov 2012 13:23:27 +0000 (08:23 -0500)
committerColin Walters <walters@verbum.org>
Wed, 28 Nov 2012 01:45:21 +0000 (20:45 -0500)
Really, the memory output stream API is too warped around the model
where it's a fixed size buffer that you've already allocated.  Even in
C, I find myself always wanting to use it to just accumulate data into
an arbitrary-sized buffer it allocates.

Unfortunately, it's also not usable from bindings because it's not
common to bind g_free() and g_realloc(), but if you just pass NULL, you
get the default of a fixed size, which is useless as per above.

I am going to use this from a gjs test case, and the GSubprocess test
cases also will use it.

https://bugzilla.gnome.org/show_bug.cgi?id=688931

docs/reference/gio/gio-sections.txt
gio/gio.symbols
gio/gmemoryoutputstream.c
gio/gmemoryoutputstream.h
gio/tests/memory-output-stream.c

index 7142227..6bec120 100644 (file)
@@ -863,6 +863,7 @@ GBufferedOutputStreamPrivate
 GReallocFunc
 GMemoryOutputStream
 g_memory_output_stream_new
+g_memory_output_stream_new_resizable
 g_memory_output_stream_get_data
 g_memory_output_stream_get_size
 g_memory_output_stream_get_data_size
index afffd7d..9df4fef 100644 (file)
@@ -573,6 +573,7 @@ g_memory_input_stream_add_bytes
 g_memory_input_stream_add_data
 g_memory_output_stream_get_type
 g_memory_output_stream_new
+g_memory_output_stream_new_resizable
 g_memory_output_stream_get_data
 g_memory_output_stream_get_data_size
 g_memory_output_stream_get_size
index 378bf3c..542732b 100644 (file)
@@ -382,6 +382,20 @@ g_memory_output_stream_new (gpointer       data,
 }
 
 /**
+ * g_memory_output_stream_new_resizable:
+ *
+ * Creates a new #GMemoryOutputStream, using g_realloc() and g_free()
+ * for memory allocation.
+ *
+ * Since: 2.36
+ */
+GOutputStream *
+g_memory_output_stream_new_resizable (void)
+{
+  return g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+}
+
+/**
  * g_memory_output_stream_get_data:
  * @ostream: a #GMemoryOutputStream
  *
index faf0364..8be37e6 100644 (file)
@@ -88,6 +88,8 @@ GOutputStream *g_memory_output_stream_new           (gpointer             data,
                                                      gsize                size,
                                                      GReallocFunc         realloc_function,
                                                      GDestroyNotify       destroy_function);
+GLIB_AVAILABLE_IN_2_36
+GOutputStream *g_memory_output_stream_new_resizable (void);
 gpointer       g_memory_output_stream_get_data      (GMemoryOutputStream *ostream);
 gsize          g_memory_output_stream_get_size      (GMemoryOutputStream *ostream);
 gsize          g_memory_output_stream_get_data_size (GMemoryOutputStream *ostream);
index e9bfc3d..3399bbe 100644 (file)
@@ -34,7 +34,7 @@ test_truncate (void)
 
   g_test_bug ("540423");
 
-  mo = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+  mo = g_memory_output_stream_new_resizable ();
   g_assert (g_seekable_can_truncate (G_SEEKABLE (mo)));
   o = g_data_output_stream_new (mo);
   for (i = 0; i < 1000; i++)
@@ -86,7 +86,7 @@ test_data_size (void)
 
   g_test_bug ("540459");
 
-  mo = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+  mo = g_memory_output_stream_new_resizable ();
   o = g_data_output_stream_new (mo);
   g_data_output_stream_put_byte (o, 1, NULL, NULL);
   pos = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mo));