GMemoryOutputStream: Add new _resizable() constructor usable from bindings

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
This commit is contained in:
Colin Walters 2012-11-22 08:23:27 -05:00
parent 7a5dd54f47
commit ed5c17e11f
5 changed files with 20 additions and 2 deletions

View 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

View 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

View File

@ -381,6 +381,20 @@ g_memory_output_stream_new (gpointer data,
return stream;
}
/**
* 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

View 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);

View 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));