Skip to content
  • Romain Vimont's avatar
    vlc_vector: add helpers for vectors · 983c43f0
    Romain Vimont authored and Thomas Guillem's avatar Thomas Guillem committed
    
    
    Add a new API for handling general-purpose vectors, intended to replace
    ARRAY_*.
    
    Like ARRAY_*, it provides macros to handle a dynamic array generic
    over the type of its items.
    
    Contrary to ARRAY_*:
     - it does not abort on allocation failure (but reports the error);
     - it uses size_t instead of int to store the capacity and the size;
     - it checks for overflows on reallocation.
    
    For illustration purpose, embedding a vector of input_item_t* in a
    struct looks like:
    
        struct playlist {
            struct VLC_VECTOR(input_item_t *) items;
            // ...
        };
    
    The main features (with names inspired by std::vector from C++ and
    std::vec::Vec from Rust) are:
     - void vlc_vector_init(pv)
          init the vector (use VLC_VECTOR_INITIALIZER for static init)
     - void vlc_vector_destroy(pv)
          destroy the vector and release any associated resources
     - void vlc_vector_clear(pv)
          remove all items from the vector
     - vec.size
          read the size of the vector
     - vec.data[i]
          access the i_th item
     - bool vlc_vector_push(pv, item)
          push an item to the end of the vector
     - bool vlc_vector_push_all(pv, items, count)
          push serveral items to the end of the vector
     - bool vlc_vector_insert(pv, index, item)
          insert an item at index
     - bool vlc_vector_insert_all(pv, index, items, count)
          insert several items at index
     - void vlc_vector_move(pv, index, target)
          move an item to target
     - void vlc_vector_move_all(pv, index, count, target)
          move a slice of items to target
     - void vlc_vector_remove(pv, index)
          remove an item
     - void vlc_vector_remove_slice(pv, index, count)
          remove a slice of items
     - void vlc_vector_swap_remove(pv, index)
          remove an item in O(1) without preserving ordering
     - bool vlc_vector_reserve(pv, mincap)
          increase the capacity of the vector in advance
     - void vlc_vector_shrink_to_fit(pv)
          resize the vector to its actual size
     - void vlc_vector_index_of(pv, index, pidx)
          find the index of an item (returns the result in *pidx)
     - vlc_vector_foreach(item, pv)
          a for-each loop
    
    It uses an exponential growth policy for both increasing and decreasing
    the size. As a consequence, the amortized complexity of
    vlc_vector_push() is O(1).
    
    Signed-off-by: default avatarThomas Guillem <thomas@gllm.fr>
    983c43f0