From cc954977ebddf9f47bf94e03fe02dbef26a63f5f Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Thu, 14 Mar 2019 10:55:30 -0400 Subject: [PATCH] vector: Add AST_VECTOR_COMPACT() to reclaim wasted space This might be useful in situations where you are loading an undetermined number of items into a vector and don't want to keep (potentially) 2x the necessary memory around indefinitely. Change-Id: I9711daa0fe01783fc6f04c5710eba84f2676d7b9 --- include/asterisk/vector.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/asterisk/vector.h b/include/asterisk/vector.h index 2ee5e29a6a..0e33590560 100644 --- a/include/asterisk/vector.h +++ b/include/asterisk/vector.h @@ -589,6 +589,34 @@ AST_VECTOR(ast_vector_string, char *); (vec)->current = 0; \ }) +/*! + * \brief Resize a vector so that its capacity is the same as its size. + * + * \param vec Vector to compact. + * + * \return 0 on success. + * \return Non-zero on failure. + */ +#define AST_VECTOR_COMPACT(vec) ({ \ + int res = 0; \ + do { \ + if ((vec)->max > (vec)->current) { \ + size_t new_max = (vec)->current; \ + typeof((vec)->elems) new_elems = ast_realloc( \ + (vec)->elems, \ + new_max * sizeof(*new_elems)); \ + if (new_elems || (vec)->current == 0) { \ + (vec)->elems = new_elems; \ + (vec)->max = new_max; \ + } else { \ + res = -1; \ + break; \ + } \ + } \ + } while(0); \ + res; \ +}) + /*! * \brief Get an address of element in a vector. * -- 2.47.2