diff --git a/include/asterisk/vector.h b/include/asterisk/vector.h index d1b2973bfd9180071a786e78c0180c754b05a42a..291cdf42517ac74bb8fac48ba7472d07e3b8764d 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. *