mirror of
https://github.com/zerotier/lf.git
synced 2026-05-22 16:24:00 -07:00
79 lines
1.9 KiB
C
79 lines
1.9 KiB
C
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*
|
|
* (c)2019-2021 ZeroTier, Inc.
|
|
* https://www.zerotier.com/
|
|
*/
|
|
|
|
#ifndef ZTLF_VECTOR_H
|
|
#define ZTLF_VECTOR_H
|
|
|
|
#include "common.h"
|
|
|
|
/* Vector for pointers */
|
|
|
|
struct ZTLF_Vector
|
|
{
|
|
void **v;
|
|
unsigned long size;
|
|
unsigned long cap;
|
|
};
|
|
|
|
static inline void ZTLF_Vector_Init(struct ZTLF_Vector *const vec,const unsigned long initialCapacity)
|
|
{
|
|
if (initialCapacity > 0) {
|
|
ZTLF_MALLOC_CHECK(vec->v = (void **)malloc(sizeof(void *) * initialCapacity));
|
|
} else {
|
|
vec->v = NULL;
|
|
}
|
|
vec->size = 0;
|
|
vec->cap = initialCapacity;
|
|
}
|
|
|
|
#define ZTLF_Vector_Append(vec,i) { \
|
|
if (unlikely((vec)->size >= (vec)->cap)) { \
|
|
(vec)->cap = ((vec)->cap) ? ((vec)->cap << 1) : 1024; \
|
|
ZTLF_MALLOC_CHECK((vec)->v = (void **)realloc((vec)->v,sizeof(void *) * (vec)->cap)); \
|
|
} \
|
|
(vec)->v[(vec)->size++] = (i); \
|
|
}
|
|
|
|
#define ZTLF_Vector_Clear(vec) (vec)->size = 0
|
|
|
|
#define ZTLF_Vector_Free(vec) if ((vec)->v) { free((vec)->v); }
|
|
|
|
/* Vector for 64-bit ints */
|
|
|
|
struct ZTLF_Vector_i64
|
|
{
|
|
int64_t *v;
|
|
unsigned long size;
|
|
unsigned long cap;
|
|
};
|
|
|
|
static inline void ZTLF_Vector_i64_Init(struct ZTLF_Vector_i64 *const vec,const unsigned long initialCapacity)
|
|
{
|
|
if (initialCapacity > 0) {
|
|
ZTLF_MALLOC_CHECK(vec->v = (int64_t *)malloc(sizeof(int64_t) * initialCapacity));
|
|
} else {
|
|
vec->v = NULL;
|
|
}
|
|
vec->size = 0;
|
|
vec->cap = initialCapacity;
|
|
}
|
|
|
|
#define ZTLF_Vector_i64_Append(vec,i) { \
|
|
if (unlikely((vec)->size >= (vec)->cap)) { \
|
|
(vec)->cap = ((vec)->cap) ? ((vec)->cap << 1) : 1024; \
|
|
ZTLF_MALLOC_CHECK((vec)->v = (int64_t *)realloc((vec)->v,sizeof(int64_t) * (vec)->cap)); \
|
|
} \
|
|
(vec)->v[(vec)->size++] = (i); \
|
|
}
|
|
|
|
#define ZTLF_Vector_i64_Clear(vec) (vec)->size = 0
|
|
|
|
#define ZTLF_Vector_i64_Free(vec) if ((vec)->v) { free((vec)->v); }
|
|
|
|
#endif
|