• This repository has been archived on 27/May/2021
  • Stars
    star
    436
  • Rank 99,877 (Top 2 %)
  • Language
    C
  • License
    MIT License
  • Created over 10 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A type-safe dynamic array implementation for C

vec

A type-safe dynamic array implementation for C.

Installation

The vec.c and vec.h files can be dropped into an existing C project and compiled along with it.

Usage

Before using a vector it should first be initialised using the vec_init() function.

vec_int_t v;
vec_init(&v);
vec_push(&v, 123);
vec_push(&v, 456);

To access the elements of the vector directly the vector's data field can be used.

printf("%d\n", v.data[1]); /* Prints the value at index 1 */

The current length of the vector is stored in the length field of the vector

printf("%d\n", v.length); /* Prints the length of the vector */

When you are done with the vector the vec_deinit() function should be called on it. This will free any memory the vector allocated during use.

vec_deinit(&v);

Types

vec.h provides the following predefined vector types:

Contained Type Type name
void* vec_void_t
char* vec_str_t
int vec_int_t
char vec_char_t
float vec_float_t
double vec_double_t

To define a new vector type the vec_t() macro should be used:

/* Creates the type uint_vec_t for storing unsigned ints */
typedef vec_t(unsigned int) uint_vec_t;

Functions

All vector functions are macro functions. The parameter v in each function should be a pointer to the vec struct which the operation is to be performed on.

vec_t(T)

Creates a vec struct for containing values of type T.

/* Typedefs the struct `fp_vec_t` as a container for type FILE* */
typedef vec_t(FILE*) fp_vec_t;

vec_init(v)

Initialises the vector, this must be called before the vector can be used.

vec_deinit(v)

Deinitialises the vector, freeing the memory the vector allocated during use; this should be called when we're finished with a vector.

vec_push(v, val)

Pushes a value to the end of the vector. Returns 0 if the operation was successful, otherwise -1 is returned and the vector remains unchanged.

vec_pop(v)

Removes and returns the value at the end of the vector.

vec_splice(v, start, count)

Removes the number of values specified by count, starting at the index start.

vec_splice(&v, 2, 4); /* Removes the values at indices 2, 3, 4 and 5 */

vec_swapsplice(v, start, count)

Removes the number of values specified by count, starting at the index start; the removed values are replaced with the last count values of the vector. This does not preserve ordering but is O(1).

vec_insert(v, idx, val)

Inserts the value val at index idx shifting the elements after the index to make room for the new value.

/* Inserts the value 123 at the beginning of the vec */
vec_insert(&v, 0, 123);

Returns 0 if the operation was successful, otherwise -1 is returned and the vector remains unchanged.

vec_sort(v, fn)

Sorts the values of the vector; fn should be a qsort-compatible compare function.

vec_swap(v, idx1, idx2)

Swaps the values at the indices idx1 and idx2 with one another.

vec_truncate(v, len)

Truncates the vector's length to len. If len is greater than the vector's current length then no change is made.

vec_clear(v)

Clears all values from the vector reducing the vector's length to 0.

vec_first(v)

Returns the first value in the vector. This should not be used on an empty vector.

vec_last(v)

Returns the last value in the vector. This should not be used on an empty vector.

vec_reserve(v, n)

Reserves capacity for at least n elements in the given vector; if n is less than the current capacity then vec_reserve() does nothing. Returns 0 if the operation was successful, otherwise -1 is returned and the vector remains unchanged.

vec_compact(v)

Reduces the vector's capacity to the smallest size required to store its current number of values. Returns 0 if the operation is successful, otherwise -1 is returned and the vector remains unchanged.

vec_pusharr(v, arr, count)

Pushes the contents of the array arr to the end of the vector. count should be the number of elements in the array.

vec_extend(v, v2)

Appends the contents of the v2 vector to the v vector.

vec_find(v, val, idx)

Finds the first occurrence of the value val in the vector. idx should be an int where the value's index will be written; idx is set to -1 if val could not be found in the vector.

vec_remove(v, val)

Removes the first occurrence of the value val from the vector. If the val is not contained in the vector then vec_remove() does nothing.

vec_reverse(v)

Reverses the order of the vector's values in place. For example, a vector containing 4, 5, 6 would contain 6, 5, 4 after reversing.

vec_foreach(v, var, iter)

Iterates the values of the vector from the first to the last. var should be a variable of the vector's contained type where the value will be stored with each iteration. iter should be an int used to store the index during iteration.

/* Iterates and prints the value and index of each value in the float vec */
int i; float val;
vec_foreach(&v, val, i) {
  printf("%d : %f\n", i, val);
}

vec_foreach_rev(v, var, iter)

Iterates the values of the vector from the last to the first. See vec_foreach()

vec_foreach_ptr(v, var, iter)

Iterates the value pointers of the vector from first to last. var should be a variable of the vector's contained type's pointer. See vec_foreach().

/* Iterates and prints the value and index of each value in the float vector */
int i; float *val;
vec_foreach_ptr(&v, val, i) {
  printf("%d : %f\n", i, *val);
}

vec_foreach_ptr_rev(v, var, iter)

Iterates the value pointers of the vector from last to first. See vec_foreach_ptr()

License

This library is free software; you can redistribute it and/or modify it under the terms of the MIT license. See LICENSE for details.

More Repositories

1

lite

A lightweight text editor written in Lua
Lua
7,287
star
2

microui

A tiny immediate-mode UI library
C
3,124
star
3

log.c

A simple logging library implemented in C99
C
2,472
star
4

json.lua

A lightweight JSON library for Lua
Lua
1,734
star
5

dyad

Asynchronous networking for C
C
1,437
star
6

fe

A tiny, embeddable language implemented in ANSI C
C
1,277
star
7

lume

Lua functions geared towards gamedev
Lua
945
star
8

classic

Tiny class module for Lua
Lua
799
star
9

lovedos

A framework for making 2D DOS games in Lua
C
666
star
10

map

A type-safe hash map implementation for C
C
558
star
11

microtar

A lightweight tar library written in ANSI C
C
423
star
12

flux

A fast, lightweight tweening library for Lua
Lua
366
star
13

lite-plugins

Plugins for the lite text editor
Lua
346
star
14

ini

A tiny ANSI C library for loading .ini config files
C
315
star
15

log.lua

A tiny logging module for Lua
Lua
296
star
16

lovebird

A browser-based debug console for LÖVE
Lua
286
star
17

lurker

Auto-swaps changed Lua files in a running LÖVE project
Lua
268
star
18

kit

A tiny library for making small games with big pixels
C
240
star
19

aq

A lightweight framework for creating audio toys
C
236
star
20

uuid4

A tiny C library for generating uuid4 strings
C
214
star
21

sfd

A small C library for opening a file dialog
C
171
star
22

sandbird

A tiny embeddable HTTP server written in C89
C
169
star
23

cmixer

Portable ANSI C audio mixer for games
C
168
star
24

aria

A tiny, embeddable lisp-shaped language implemented in C89
C
166
star
25

juno

Framework for making 2D games with chunky pixels in Lua
C
160
star
26

tick

Lua module for delaying function calls
Lua
123
star
27

dmt

Dynamic memory tracker for C
C
105
star
28

autobatch

Small LÖVE module to automate the use of SpriteBatches
Lua
103
star
29

lite-colors

Colors themes for the lite text editor
Lua
99
star
30

cembed

A small utility for embedding files in a C header
C
93
star
31

doq

A small tool for creating single-file html documents
C
82
star
32

lovebpm

A LÖVE library for syncing events to the BPM of an audio track
Lua
76
star
33

coil

A tiny cooperative threading module for Lua
Lua
71
star
34

shash

A simple, lightweight spatial hash for Lua
Lua
66
star
35

console

A console plugin for the lite text editor
Lua
58
star
36

atlas

A small utility for generating a texture atlas
C
41
star
37

gifwriter

A Nim library for writing animated GIFs
C
18
star
38

rxi.github.io

HTML
17
star
39

cmixer_sdl2-nim

Tiny Nim library for using cmixer with sdl2
Nim
3
star
40

cmixer-nim

Nim wrapper for cmixer, A lightweight audio mixer for games
C
3
star
41

crate

2
star