From 057c7380bedeac6682e0d3970b20bc8ecb4361a9 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 d1b2973bfd..291cdf4251 100644 --- a/include/asterisk/vector.h +++ b/include/asterisk/vector.h @@ -619,6 +619,34 @@ int ast_vector_string_split(struct ast_vector_string *dest, (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. *