X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=include%2Fvlc_arrays.h;h=14db10b93eba1b0dfe51eae51190fe8defefd375;hb=dbcc7fad003192d2b589a4b6f32ae285e0767923;hp=e085f0378b432ed56392241bc3017a57c6f81c85;hpb=37d45ebb7a3093f01c01972b3196ab45a2b37c3a;p=vlc diff --git a/include/vlc_arrays.h b/include/vlc_arrays.h index e085f0378b..14db10b93e 100644 --- a/include/vlc_arrays.h +++ b/include/vlc_arrays.h @@ -30,6 +30,13 @@ * This file defines functions, structures and macros for handling arrays in vlc */ +/* realloc() that never fails *if* downsizing */ +static inline void *realloc_down( void *ptr, size_t size ) +{ + void *ret = realloc( ptr, size ); + return ret ? ret : ptr; +} + /** * Simple dynamic array handling. Array is realloced at each insert/removal */ @@ -41,37 +48,36 @@ #define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) \ do \ { \ - if( !i_oldsize ) (p_ar) = NULL; \ + if( !(i_oldsize) ) (p_ar) = NULL; \ (p_ar) = VLCCVP realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \ + if( !(p_ar) ) abort(); \ if( (i_oldsize) - (i_pos) ) \ { \ memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos), \ ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); \ } \ - (p_ar)[i_pos] = elem; \ + (p_ar)[(i_pos)] = elem; \ (i_oldsize)++; \ } \ while( 0 ) -#define REMOVE_ELEM( p_ar, i_oldsize, i_pos ) \ +#define REMOVE_ELEM( p_ar, i_size, i_pos ) \ do \ { \ - if( (i_oldsize) - (i_pos) - 1 ) \ + if( (i_size) - (i_pos) - 1 ) \ { \ memmove( (p_ar) + (i_pos), \ (p_ar) + (i_pos) + 1, \ - ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ - } \ - if( i_oldsize > 1 ) \ - { \ - (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) ); \ + ((i_size) - (i_pos) - 1) * sizeof( *(p_ar) ) ); \ } \ + if( i_size > 1 ) \ + (p_ar) = realloc_down( p_ar, ((i_size) - 1) * sizeof( *(p_ar) ) );\ else \ { \ free( p_ar ); \ (p_ar) = NULL; \ } \ - (i_oldsize)--; \ + (i_size)--; \ } \ while( 0 ) @@ -94,41 +100,37 @@ (tab) = cast realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \ else \ (tab) = cast malloc( sizeof( void ** ) ); \ + if( !(tab) ) abort(); \ (tab)[count] = (p); \ (count)++; \ } while(0) #define TAB_APPEND( count, tab, p ) \ TAB_APPEND_CAST( , count, tab, p ) -#define TAB_APPEND_CPP( type, count, tab, p ) \ - TAB_APPEND_CAST( (type**), count, tab, p ) #define TAB_FIND( count, tab, p, index ) \ do { \ - int _i_; \ - (index) = -1; \ - for( _i_ = 0; _i_ < (count); _i_++ ) \ + (index) = -1; \ + for( int i = 0; i < (count); i++ ) \ + if( (tab)[i] == (p) ) \ { \ - if( (tab)[_i_] == (p) ) \ - { \ - (index) = _i_; \ - break; \ - } \ + (index) = i; \ + break; \ } \ } while(0) #define TAB_REMOVE( count, tab, p ) \ do { \ - int _i_index_; \ - TAB_FIND( count, tab, p, _i_index_ ); \ - if( _i_index_ >= 0 ) \ + int i_index; \ + TAB_FIND( count, tab, p, i_index ); \ + if( i_index >= 0 ) \ { \ if( (count) > 1 ) \ { \ - memmove( ((void**)(tab) + _i_index_), \ - ((void**)(tab) + _i_index_+1), \ - ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\ + memmove( ((void**)(tab) + i_index), \ + ((void**)(tab) + i_index+1), \ + ( (count) - i_index - 1 ) * sizeof( void* ) );\ } \ (count)--; \ if( (count) == 0 ) \ @@ -144,6 +146,7 @@ (tab) = cast realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \ else \ (tab) = cast malloc( sizeof( void ** ) ); \ + if( !(tab) ) abort(); \ if( (count) - (index) > 0 ) \ memmove( (void**)(tab) + (index) + 1, \ (void**)(tab) + (index), \ @@ -192,6 +195,7 @@ (array).i_alloc = newsize; \ (array).p_elems = VLCCVP realloc( (array).p_elems, (array).i_alloc * \ sizeof(*(array).p_elems) ); \ + if( !(array).p_elems ) abort(); \ } #define _ARRAY_GROW1(array) { \ @@ -201,24 +205,6 @@ _ARRAY_ALLOC(array, (int)(array.i_alloc * 1.5) ) \ } -#define _ARRAY_GROW(array,additional) { \ - int i_first = (array).i_alloc; \ - while( (array).i_alloc - i_first < additional ) \ - { \ - if( (array).i_alloc < 10 ) \ - _ARRAY_ALLOC(array, 10 ) \ - else if( (array).i_alloc == (array).i_size ) \ - _ARRAY_ALLOC(array, (int)((array).i_alloc * 1.5) ) \ - else break; \ - } \ -} - -#define _ARRAY_SHRINK(array) { \ - if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ - _ARRAY_ALLOC(array, (array).i_size + 5); \ - } \ -} - #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) /* API */ @@ -262,6 +248,12 @@ (array).i_size++; \ } while(0) +#define _ARRAY_SHRINK(array) { \ + if( (array).i_size > 10 && (array).i_size < (int)((array).i_alloc / 1.5) ) { \ + _ARRAY_ALLOC(array, (array).i_size + 5); \ + } \ +} + #define ARRAY_REMOVE(array,pos) \ do { \ if( (array).i_size - (pos) - 1 ) \ @@ -608,4 +600,20 @@ vlc_dictionary_remove_value_for_key( const vlc_dictionary_t * p_dict, const char /* No key was found */ } +#ifdef __cplusplus +// C++ helpers +template +void vlc_delete_all( T &container ) +{ + typename T::iterator it = container.begin(); + while ( it != container.end() ) + { + delete *it; + ++it; + } + container.clear(); +} + +#endif + #endif