diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-06-13 17:03:56 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-06-13 21:55:10 +0200 |
commit | f8bf87face3304f216bcd838081fa33bb4976ac6 (patch) | |
tree | 1dc3e2a512d5b040aa12c760a6b751b8916cbc9d | |
parent | a65ea28d1833d3502c5070472e43bda04410e6b5 (diff) | |
download | glibc-f8bf87face3304f216bcd838081fa33bb4976ac6.tar glibc-f8bf87face3304f216bcd838081fa33bb4976ac6.tar.gz glibc-f8bf87face3304f216bcd838081fa33bb4976ac6.tar.bz2 glibc-f8bf87face3304f216bcd838081fa33bb4976ac6.zip |
dynarray: Implement begin/end functions in the spirit of C++
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | malloc/dynarray-skeleton.c | 22 | ||||
-rw-r--r-- | malloc/tst-dynarray-shared.h | 3 | ||||
-rw-r--r-- | malloc/tst-dynarray.c | 28 |
4 files changed, 63 insertions, 0 deletions
@@ -1,3 +1,13 @@ +2017-06-13 Florian Weimer <fweimer@redhat.com> + + * malloc/dynarray-skeleton.c: List begin/end as defined functions. + (DYNARRAY_PREFIX##begin, DYNARRAY_PREFIX##end): New functions. + * malloc/tst-dynarray-shared.h (CHECK_EMPTY): Add tests for + begin/end. + * malloc/tst-dynarray.c (test_int): Test dynarray_int_begin, + dynarray_int_end. + (test_str): Test dynarray_str_begin, dynarray_str_end. + 2017-06-13 H.J. Lu <hongjiu.lu@intel.com> [BZ #21573] diff --git a/malloc/dynarray-skeleton.c b/malloc/dynarray-skeleton.c index 7a10e083f4..7ec5878808 100644 --- a/malloc/dynarray-skeleton.c +++ b/malloc/dynarray-skeleton.c @@ -65,6 +65,8 @@ bool DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *); void DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *); size_t DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *); + DYNARRAY_ELEMENT *DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *); + DYNARRAY_ELEMENT *DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *); DYNARRAY_ELEMENT *DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *, size_t); void DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *, DYNARRAY_ELEMENT); DYNARRAY_ELEMENT *DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *); @@ -248,6 +250,26 @@ DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index) return list->dynarray_header.array + index; } +/* Return a pointer to the first array element, if any. For a + zero-length array, the pointer can be NULL even though the dynamic + array has not entered the failure state. */ +__attribute__ ((nonnull (1))) +static inline DYNARRAY_ELEMENT * +DYNARRAY_NAME (begin) (struct DYNARRAY_STRUCT *list) +{ + return list->dynarray_header.array; +} + +/* Return a pointer one element past the last array element. For a + zero-length array, the pointer can be NULL even though the dynamic + array has not entered the failure state. */ +__attribute__ ((nonnull (1))) +static inline DYNARRAY_ELEMENT * +DYNARRAY_NAME (end) (struct DYNARRAY_STRUCT *list) +{ + return list->dynarray_header.array + list->dynarray_header.used; +} + /* Internal function. Slow path for the add function below. */ static void DYNARRAY_NAME (add__) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item) diff --git a/malloc/tst-dynarray-shared.h b/malloc/tst-dynarray-shared.h index faba66f580..1de9c04be8 100644 --- a/malloc/tst-dynarray-shared.h +++ b/malloc/tst-dynarray-shared.h @@ -73,5 +73,8 @@ struct str_array TEST_VERIFY_EXIT (dynarray_##type##_emplace (dyn) == NULL); \ dynarray_##type##_free (dyn); \ CHECK_INIT_STATE (type, (dyn)); \ + /* These functions should not assert. */ \ + dynarray_##type##_begin (dyn); \ + dynarray_##type##_end (dyn); \ (void) 0; \ }) diff --git a/malloc/tst-dynarray.c b/malloc/tst-dynarray.c index 7aee85aa39..2206d75e31 100644 --- a/malloc/tst-dynarray.c +++ b/malloc/tst-dynarray.c @@ -111,6 +111,13 @@ test_int (void) } TEST_VERIFY_EXIT (dynarray_int_size (&dyn) == count); TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); + if (count > 0) + { + TEST_VERIFY (dynarray_int_begin (&dyn) + == dynarray_int_at (&dyn, 0)); + TEST_VERIFY (dynarray_int_end (&dyn) + == dynarray_int_at (&dyn, count - 1) + 1); + } unsigned final_count; bool heap_array = dyn.dynarray_header.array != dyn.scratch; if (do_remove_last) @@ -123,6 +130,13 @@ test_int (void) } else final_count = count; + if (final_count > 0) + { + TEST_VERIFY (dynarray_int_begin (&dyn) + == dynarray_int_at (&dyn, 0)); + TEST_VERIFY (dynarray_int_end (&dyn) + == dynarray_int_at (&dyn, final_count - 1) + 1); + } if (do_clear) { dynarray_int_clear (&dyn); @@ -225,6 +239,13 @@ test_str (void) } TEST_VERIFY_EXIT (dynarray_str_size (&dyn) == count); TEST_VERIFY_EXIT (count <= dyn.dynarray_header.allocated); + if (count > 0) + { + TEST_VERIFY (dynarray_str_begin (&dyn) + == dynarray_str_at (&dyn, 0)); + TEST_VERIFY (dynarray_str_end (&dyn) + == dynarray_str_at (&dyn, count - 1) + 1); + } unsigned final_count; bool heap_array = dyn.dynarray_header.array != dyn.scratch; if (do_remove_last) @@ -237,6 +258,13 @@ test_str (void) } else final_count = count; + if (final_count > 0) + { + TEST_VERIFY (dynarray_str_begin (&dyn) + == dynarray_str_at (&dyn, 0)); + TEST_VERIFY (dynarray_str_end (&dyn) + == dynarray_str_at (&dyn, final_count - 1) + 1); + } if (do_clear) { dynarray_str_clear (&dyn); |