/blox

Simple array library for C

Primary LanguageCMIT LicenseMIT

blox

Blox is a single-header array library for C. Implemented as a set of macros and designed for ease of use, blox provides a wide range of useful functions for manipulating arrays of arbitrary type. While typically used for manipulating dynamic arrays, blox objects can also be attached to local variables. For sample usage, see example.c, demo.c, and oom.c.

typedef struct
{
 void* data;
 size_t length;
 size_t capacity;
}
 blox;

TYPE* blox_data(TYPE, buffer)

Returns a pointer to the first element (typecast of buffer.data)


size_t blox_length(buffer)

Returns the number of elements (same as buffer.length)


size_t blox_capacity(buffer)

Returns the number of elements reserved by the container (same as buffer.capacity)


blox blox_nil(void)

Returns a nil blox


void blox_free(buffer)

Frees a blox container (don't forget!)


void blox_drop(buffer)

Zeroes out the container, but doesn't free it (use with care!)


blox blox_create(TYPE)

Returns a blox with zero elements (must be freed with blox_free)


blox blox_make(TYPE, length)

Returns a blox with length elements, all zeroed out (must be freed with blox_free)


blox blox_reserved(TYPE, length)

Returns a blox with length elements reserved; nominal size of container will be zero (must be freed with blox_free)


blox blox_from_array(TYPE, array, length)

Constructs a new blox containing a copy of array (must be freed with blox_free)


blox blox_from_string(TYPE, string)

Constructs a new blox from a zero-terminated string of TYPE (must be freed with blox_free)


blox blox_from_sequence(TYPE, start, end)

Constructs a new blox object by copying pointer ranges start to end (must be freed with blox_free)


blox blox_slice(TYPE, other, start, amount)

Constructs a new blox object by copying amount elements of blox other starting from index start (must be freed with blox_free)


blox blox_slice_range(TYPE, other, start, end)

Constructs a new blox object by copying from index start to end of blox other (must be freed with blox_free)


blox blox_slice_end(TYPE, other, start)

Constructs a new blox object by copying the last elements of blox other starting at index start (must be freed with blox_free)


blox blox_slice_first(TYPE, other, amount)

Constructs a new blox object by copying the first amount elements of blox other (must be freed with blox_free)


blox blox_slice_last(TYPE, other, amount)

Constructs a new blox object by copying the last amount elements of blox other (must be freed with blox_free)


blox blox_use(array, length)

Use array as if it were a normal blox object (must not be freed with blox_free)


blox blox_use_array(TYPE, array, length)

Use array as if it were a normal blox object (must not be freed with blox_free)


blox blox_use_string(TYPE, string)

Use a zero-terminated string of TYPE as if it were a normal blox object (must not be freed with blox_free)


blox blox_use_sequence(TYPE, start, end)

Use a sequence (from pointer start to end) as if it were a normal blox object (must not be freed with blox_free)


blox blox_use_window(TYPE, other, start, end)

Use a subsequence (from index start to end) of blox object other as if it were itself a normal blox object (must not be freed with blox_free)


blox blox_use_view(TYPE, other, start, amount)

Use amount elements (starting from index start) of blox object other as if it were itself a normal blox object (must not be freed with blox_free)


TYPE* blox_index(TYPE, buffer, index)

Returns a pointer to the element at index


TYPE blox_get(TYPE, buffer, index)

Returns a reference to the element at index (not bounds checked!)


void blox_set(TYPE, buffer, index, value)

Sets the element at index to value (not bounds checked!)


TYPE* blox_begin(TYPE, buffer)

Returns a pointer to the first element in the container


TYPE* blox_end(TYPE, buffer)

Returns a pointer to the unused element immediately following the last element in the container


TYPE* blox_top(TYPE, buffer)

Returns a pointer to the last element in the container


TYPE* blox_bottom(TYPE, buffer)

Returns a pointer to the unused element immediately preceding the first element in the container


TYPE blox_front(TYPE, buffer)

Returns a reference to the first element in the container


TYPE blox_back(TYPE, buffer)

Returns a reference to the last element in the container


void blox_resize(TYPE, buffer, length)

Resizes the container (and buffer.length is set to length)


void blox_reserve(TYPE, buffer, length)

Reserves length elements (buffer.length remains unchanged)


void blox_shrink(TYPE, buffer)

Resizes the container to zero elements


void blox_shrink_by(TYPE, buffer, amount)

Shrinks the container by amount elements


bool blox_empty(buffer)

Returns true if the blox is empty (buffer.length == 0)


void blox_clear(TYPE, buffer)

Zeroes out all elements (the container is not resized)


void blox_clear_range(TYPE, buffer, start, end)

Zeroes out all elements from index start up to (but excluding) end (the container is not resized)


void blox_clear_at(TYPE, buffer, start, amount)

Zeroes out amount elements starting from index start (the container is not resized)


void blox_clear_end(TYPE, buffer, start)

Zeroes out all elements from index start up to the last element (the container is not resized)


void blox_insert(TYPE, buffer, index, value)

Inserts value at index of the (possibly empty) container


void blox_stuff(TYPE, buffer)

Inserts a zero-filled object of TYPE at the end of the container


void blox_push(TYPE, buffer, value)

Inserts value at the end of the container


void blox_pop(TYPE, buffer)

Removes the last element, then shrinks the container by one (if possible)


void blox_shift_by(TYPE, buffer, amount)

Removes the first amount elements from the front of the container


void blox_shift(TYPE, buffer)

Removes the first element of the container


void blox_unshift(TYPE, buffer, value)

Inserts value at the front of the container (remaining elements are shifted toward the back)


void blox_unshift_by(TYPE, buffer, amount)

Makes space at the front of the container for amount (zeroed out) elements (remaining elements are shifted toward the back)


void blox_erase_range(TYPE, buffer, start, end)

Removes all elements from index start up to (but excluding) end


void blox_erase_at(TYPE, buffer, start, amount)

Removes amount elements starting from index start


void blox_erase(TYPE, buffer, index)

Erases the element at index


void blox_reverse(TYPE, buffer)

Reverses the elements in buffer (inplace)


void blox_splice(TYPE, buffer, index, other)

Splices blox other to buffer at index


void blox_splice_sequence(TYPE, buffer, index, start, end)

Splices the sequence from pointer start to end to the container buffer at index


void blox_splice_string(TYPE, buffer, index, string)

Splices a zero-terminated string of TYPE to the container buffer at index


void blox_splice_array(TYPE, buffer, index, array, length)

Splices length elements of array to the container buffer at index


void blox_append(TYPE, buffer, other)

Appends the blox other to buffer


void blox_append_sequence(TYPE, buffer, start, end)

Appends the sequence from pointer start to end to the container


void blox_append_string(TYPE, buffer, string)

Appends a zero-terminated string of TYPE to the container


void blox_append_array(TYPE, buffer, array, length)

Appends length elements of array to the container


void blox_prepend(TYPE, buffer, other)

Prepends the blox other to buffer


void blox_prepend_sequence(TYPE, buffer, start, end)

Prepends the sequence from pointer start to end to the container


void blox_prepend_string(TYPE, buffer, string)

Prepends a zero-terminated string of TYPE to the container


void blox_prepend_array(TYPE, buffer, array, length)

Prepends length elements of array to the container


void blox_copy(TYPE, buffer, other)

Copies blox other to buffer


blox blox_clone(TYPE, buffer)

Returns a copy of buffer


void blox_swap(buffer, other)

Swaps buffer with other


void blox_for_each(TYPE, buffer, action)

Applies action to each element of buffer (function should take a TYPE* as it's first argument, plus an optional size_t argument for the index)


void blox_visit(TYPE, buffer, action, userdata)

Applies action to each element of buffer (function should take a TYPE* as it's first argument, plus an optional void* argument for userdata)


void blox_sort(TYPE, buffer, compare)

Sort using compare, which should take two arguments of TYPE*


TYPE* blox_search(TYPE, buffer, key, compare)

Binary search using compare, which should take two arguments of TYPE*


TYPE* blox_find(TYPE, buffer, key, compare)

Sequential search using compare, which should take two arguments of TYPE*


int blox_compare(TYPE, left, right)

Compares two blox containers (first compares lengths; if equal, a bit-by-bit comparison of the two is made)


bool blox_equal(TYPE, left, right)

Returns true if left and right compare equal


bool blox_less(TYPE, left, right)

Returns true if left compares less than right


bool blox_less_or_equal(TYPE, left, right)

Returns true if left compares less or equal to right


bool blox_greater(TYPE, left, right)

Returns true if left compares greater than right


bool blox_greater_or_equal(TYPE, left, right)

Returns true if left compares greater than or equal to right


typedef void* (*blox_allocator)(void*, size_t)


blox_allocator blox_realloc(blox_allocator reset)

Sets the default allocator for all blox objects (must have the same interface as realloc)