[PATCH] Dynamic growable arrays for internal use
Florian Weimer
fweimer@redhat.com
Fri May 5 11:48:00 GMT 2017
On 04/24/2017 04:06 PM, Joseph Myers wrote:
> On Sat, 22 Apr 2017, Florian Weimer wrote:
>
>> +/* To use the dynarray facility, you need to include
>> + <malloc/dynarray-skeleton.c> and define the parameter macros
>> + documented in that file.
>> +
>> + A minimal example which provides a growing list of integers can be
>> + defined like this:
>> +
>> + struct int_array
>> + {
>> + int *array;
>> + size_t length;
>> + };
>> +
>> + #define DYNARRAY_STRUCT dynarray_int
>> + #define DYNARRAY_ELEMENT int
>> + #define DYNARRAY_PREFIX dynarray_int_
>> + #define DYNARRAY_FINAL_TYPE struct int_array
>> + #include <malloc/dynarray-skeleton.c>
>> +
>> + To create a three-element array with elements 1, 2, 3, use this
>> + code:
>> +
>> + struct dynarray_int dyn;
>> + dynarray_int_init (&dyn);
>> + int *place = dynarray_int_emplace (&dyn);
>
> Should this first call to dynarray_int_emplace outside the loop be there?
> The result doesn't seem to be used.
Right, I didn't test the example at all. There are many errors in it.
The corrected version follows.
A minimal example which provides a growing list of integers can be
defined like this:
struct int_array
{
int *array;
size_t length;
};
#define DYNARRAY_STRUCT dynarray_int
#define DYNARRAY_ELEMENT int
#define DYNARRAY_PREFIX dynarray_int_
#define DYNARRAY_FINAL_TYPE struct int_array
#include <malloc/dynarray-skeleton.c>
To create a three-element array with elements 1, 2, 3, use this
code:
struct dynarray_int dyn;
dynarray_int_init (&dyn);
for (int i = 1; i <= 3; ++i)
{
int *place = dynarray_int_emplace (&dyn);
assert (place != NULL);
*place = i;
}
struct int_array result;
bool ok = dynarray_int_finalize (&dyn, &result);
assert (ok);
assert (result.length == 3);
assert (result.array[0] == 1);
assert (result.array[1] == 2);
assert (result.array[2] == 3);
free (result.array);
I wish we had doctests for these kinds of things.
Does anyone have comments about the interface and implementation?
Thanks,
Florian
More information about the Libc-alpha
mailing list