[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