mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-04 02:06:18 +01:00
Merge branch 'strv-builder' into 'master'
gstrvbuilder: Add a new object to make NULL-terminated string arrays. See merge request GNOME/glib!1417
This commit is contained in:
commit
730a395701
@ -1806,9 +1806,15 @@ g_strjoinv
|
|||||||
|
|
||||||
<SUBSECTION>
|
<SUBSECTION>
|
||||||
GStrv
|
GStrv
|
||||||
|
GStrvBuilder
|
||||||
g_strv_length
|
g_strv_length
|
||||||
g_strv_contains
|
g_strv_contains
|
||||||
g_strv_equal
|
g_strv_equal
|
||||||
|
g_strv_builder_new
|
||||||
|
g_strv_builder_ref
|
||||||
|
g_strv_builder_unref
|
||||||
|
g_strv_builder_add
|
||||||
|
g_strv_builder_end
|
||||||
|
|
||||||
<SUBSECTION>
|
<SUBSECTION>
|
||||||
g_strerror
|
g_strerror
|
||||||
|
@ -78,6 +78,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSequence, g_sequence_free)
|
|||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSList, g_slist_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSList, g_slist_free)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GString, g_autoptr_cleanup_gstring_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GString, g_autoptr_cleanup_gstring_free)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GStringChunk, g_string_chunk_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GStringChunk, g_string_chunk_free)
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GStrvBuilder, g_strv_builder_unref)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GThread, g_thread_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GThread, g_thread_unref)
|
||||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GMutex, g_mutex_clear)
|
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GMutex, g_mutex_clear)
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMutexLocker, g_mutex_locker_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMutexLocker, g_mutex_locker_free)
|
||||||
|
@ -82,6 +82,7 @@
|
|||||||
#include <glib/gstrfuncs.h>
|
#include <glib/gstrfuncs.h>
|
||||||
#include <glib/gstringchunk.h>
|
#include <glib/gstringchunk.h>
|
||||||
#include <glib/gstring.h>
|
#include <glib/gstring.h>
|
||||||
|
#include <glib/gstrvbuilder.h>
|
||||||
#include <glib/gtestutils.h>
|
#include <glib/gtestutils.h>
|
||||||
#include <glib/gthread.h>
|
#include <glib/gthread.h>
|
||||||
#include <glib/gthreadpool.h>
|
#include <glib/gthreadpool.h>
|
||||||
|
134
glib/gstrvbuilder.c
Normal file
134
glib/gstrvbuilder.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2020 Canonical Ltd.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "gstrvbuilder.h"
|
||||||
|
|
||||||
|
#include "garray.h"
|
||||||
|
#include "gmem.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SECTION:gstrvbuilder
|
||||||
|
* @title: GStrvBuilder
|
||||||
|
* @short_description: Helper to create NULL-terminated string arrays.
|
||||||
|
*
|
||||||
|
* #GStrvBuilder is a method of easily building dynamically sized
|
||||||
|
* NULL-terminated string arrays.
|
||||||
|
*
|
||||||
|
* The following example shows how to build a two element array:
|
||||||
|
*
|
||||||
|
* |[<!-- language="C" -->
|
||||||
|
* g_autoptr(GStrvBuilder) builder = g_strv_builder_new ();
|
||||||
|
* g_strv_builder_add (builder, "hello");
|
||||||
|
* g_strv_builder_add (builder, "world");
|
||||||
|
* g_auto(GStrv) array = g_strv_builder_end (builder);
|
||||||
|
* ]|
|
||||||
|
*
|
||||||
|
* Since: 2.68
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct _GStrvBuilder
|
||||||
|
{
|
||||||
|
GPtrArray array;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_strv_builder_new:
|
||||||
|
*
|
||||||
|
* Creates a new #GStrvBuilder with a reference count of 1.
|
||||||
|
* Use g_strv_builder_unref() on the returned value when no longer needed.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): the new #GStrvBuilder
|
||||||
|
*
|
||||||
|
* Since: 2.68
|
||||||
|
*/
|
||||||
|
GStrvBuilder *
|
||||||
|
g_strv_builder_new (void)
|
||||||
|
{
|
||||||
|
return (GStrvBuilder *) g_ptr_array_new_with_free_func (g_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_strv_builder_unref:
|
||||||
|
* @builder: (transfer full): a #GStrvBuilder allocated by g_strv_builder_new()
|
||||||
|
*
|
||||||
|
* Decreases the reference count on @builder.
|
||||||
|
*
|
||||||
|
* In the event that there are no more references, releases all memory
|
||||||
|
* associated with the #GStrvBuilder.
|
||||||
|
*
|
||||||
|
* Since: 2.68
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
g_strv_builder_unref (GStrvBuilder *builder)
|
||||||
|
{
|
||||||
|
g_ptr_array_unref (&builder->array);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_strv_builder_ref:
|
||||||
|
* @builder: (transfer none): a #GStrvBuilder
|
||||||
|
*
|
||||||
|
* Atomically increments the reference count of @builder by one.
|
||||||
|
* This function is thread-safe and may be called from any thread.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): The passed in #GStrvBuilder
|
||||||
|
*
|
||||||
|
* Since: 2.68
|
||||||
|
*/
|
||||||
|
GStrvBuilder *
|
||||||
|
g_strv_builder_ref (GStrvBuilder *builder)
|
||||||
|
{
|
||||||
|
return (GStrvBuilder *) g_ptr_array_ref (&builder->array);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_strv_builder_add:
|
||||||
|
* @builder: a #GStrvBuilder
|
||||||
|
* @value: a string.
|
||||||
|
*
|
||||||
|
* Add a string to the end of the array.
|
||||||
|
*
|
||||||
|
* Since 2.68
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
g_strv_builder_add (GStrvBuilder *builder,
|
||||||
|
const char *value)
|
||||||
|
{
|
||||||
|
g_ptr_array_add (&builder->array, g_strdup (value));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_strv_builder_end:
|
||||||
|
* @builder: a #GStrvBuilder
|
||||||
|
*
|
||||||
|
* Ends the builder process and returns the constructed NULL-terminated string
|
||||||
|
* array. The returned value should be freed with g_strfreev() when no longer
|
||||||
|
* needed.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): the constructed string array.
|
||||||
|
*
|
||||||
|
* Since 2.68
|
||||||
|
*/
|
||||||
|
GStrv
|
||||||
|
g_strv_builder_end (GStrvBuilder *builder)
|
||||||
|
{
|
||||||
|
/* Add NULL terminator */
|
||||||
|
g_ptr_array_add (&builder->array, NULL);
|
||||||
|
return (GStrv) g_ptr_array_steal (&builder->array, NULL);
|
||||||
|
}
|
58
glib/gstrvbuilder.h
Normal file
58
glib/gstrvbuilder.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2020 Canonical Ltd.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __G_STRVBUILDER_H__
|
||||||
|
#define __G_STRVBUILDER_H__
|
||||||
|
|
||||||
|
#if !defined(__GLIB_H_INSIDE__) && !defined(GLIB_COMPILATION)
|
||||||
|
#error "Only <glib.h> can be included directly."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <glib/gstrfuncs.h>
|
||||||
|
#include <glib/gtypes.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GStrvBuilder:
|
||||||
|
*
|
||||||
|
* A helper object to build a %NULL-terminated string array
|
||||||
|
* by appending. See g_strv_builder_new().
|
||||||
|
*
|
||||||
|
* Since: 2.68
|
||||||
|
*/
|
||||||
|
typedef struct _GStrvBuilder GStrvBuilder;
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_68
|
||||||
|
GStrvBuilder *g_strv_builder_new (void);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_68
|
||||||
|
void g_strv_builder_unref (GStrvBuilder *builder);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_68
|
||||||
|
GStrvBuilder *g_strv_builder_ref (GStrvBuilder *builder);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_68
|
||||||
|
void g_strv_builder_add (GStrvBuilder *builder,
|
||||||
|
const char *value);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_68
|
||||||
|
GStrv g_strv_builder_end (GStrvBuilder *builder);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __G_STRVBUILDER_H__ */
|
@ -198,6 +198,7 @@ glib_sub_headers = files(
|
|||||||
'gspawn.h',
|
'gspawn.h',
|
||||||
'gstdio.h',
|
'gstdio.h',
|
||||||
'gstrfuncs.h',
|
'gstrfuncs.h',
|
||||||
|
'gstrvbuilder.h',
|
||||||
'gtestutils.h',
|
'gtestutils.h',
|
||||||
'gstring.h',
|
'gstring.h',
|
||||||
'gstringchunk.h',
|
'gstringchunk.h',
|
||||||
@ -286,6 +287,7 @@ glib_sources = files(
|
|||||||
'gstrfuncs.c',
|
'gstrfuncs.c',
|
||||||
'gstring.c',
|
'gstring.c',
|
||||||
'gstringchunk.c',
|
'gstringchunk.c',
|
||||||
|
'gstrvbuilder.c',
|
||||||
'gtestutils.c',
|
'gtestutils.c',
|
||||||
'gthread.c',
|
'gthread.c',
|
||||||
'gthreadpool.c',
|
'gthreadpool.c',
|
||||||
|
@ -92,6 +92,7 @@ glib_tests = {
|
|||||||
'spawn-singlethread' : {},
|
'spawn-singlethread' : {},
|
||||||
'strfuncs' : {},
|
'strfuncs' : {},
|
||||||
'string' : {},
|
'string' : {},
|
||||||
|
'strvbuilder' : {},
|
||||||
'testing' : {},
|
'testing' : {},
|
||||||
'test-printf' : {},
|
'test-printf' : {},
|
||||||
'thread' : {},
|
'thread' : {},
|
||||||
|
80
glib/tests/strvbuilder.c
Normal file
80
glib/tests/strvbuilder.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2020 Canonical Ltd.
|
||||||
|
*
|
||||||
|
* This work is provided "as is"; redistribution and modification
|
||||||
|
* in whole or in part, in any medium, physical or electronic is
|
||||||
|
* permitted without restriction.
|
||||||
|
*
|
||||||
|
* This work is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* In no event shall the authors or contributors be liable for any
|
||||||
|
* direct, indirect, incidental, special, exemplary, or consequential
|
||||||
|
* damages (including, but not limited to, procurement of substitute
|
||||||
|
* goods or services; loss of use, data, or profits; or business
|
||||||
|
* interruption) however caused and on any theory of liability, whether
|
||||||
|
* in contract, strict liability, or tort (including negligence or
|
||||||
|
* otherwise) arising in any way out of the use of this software, even
|
||||||
|
* if advised of the possibility of such damage.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "glib.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_strvbuilder_empty (void)
|
||||||
|
{
|
||||||
|
GStrvBuilder *builder;
|
||||||
|
GStrv result;
|
||||||
|
|
||||||
|
builder = g_strv_builder_new ();
|
||||||
|
result = g_strv_builder_end (builder);
|
||||||
|
g_assert_nonnull (result);
|
||||||
|
g_assert_cmpint (g_strv_length (result), ==, 0);
|
||||||
|
|
||||||
|
g_strfreev (result);
|
||||||
|
g_strv_builder_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_strvbuilder_add (void)
|
||||||
|
{
|
||||||
|
GStrvBuilder *builder;
|
||||||
|
GStrv result;
|
||||||
|
const gchar *expected[] = { "one", "two", "three", NULL };
|
||||||
|
|
||||||
|
builder = g_strv_builder_new ();
|
||||||
|
g_strv_builder_add (builder, "one");
|
||||||
|
g_strv_builder_add (builder, "two");
|
||||||
|
g_strv_builder_add (builder, "three");
|
||||||
|
result = g_strv_builder_end (builder);
|
||||||
|
g_assert_nonnull (result);
|
||||||
|
g_assert_true (g_strv_equal ((const gchar *const *) result, expected));
|
||||||
|
|
||||||
|
g_strfreev (result);
|
||||||
|
g_strv_builder_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_strvbuilder_ref (void)
|
||||||
|
{
|
||||||
|
GStrvBuilder *builder;
|
||||||
|
|
||||||
|
builder = g_strv_builder_new ();
|
||||||
|
g_strv_builder_ref (builder);
|
||||||
|
g_strv_builder_unref (builder);
|
||||||
|
g_strv_builder_unref (builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc,
|
||||||
|
char *argv[])
|
||||||
|
{
|
||||||
|
g_test_init (&argc, &argv, NULL);
|
||||||
|
|
||||||
|
g_test_add_func ("/strvbuilder/empty", test_strvbuilder_empty);
|
||||||
|
g_test_add_func ("/strvbuilder/add", test_strvbuilder_add);
|
||||||
|
g_test_add_func ("/strvbuilder/ref", test_strvbuilder_ref);
|
||||||
|
|
||||||
|
return g_test_run ();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user