You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
4.7 KiB

/* -*- coding: utf-8 -*-
* ----------------------------------------------------------------------
* Copyright © 2011-2013, RedJack, LLC.
* All rights reserved.
*
* Please see the COPYING file in this distribution for license details.
* ----------------------------------------------------------------------
*/
#ifndef LIBCORK_DS_ARRAY_H
#define LIBCORK_DS_ARRAY_H
#include <libcork/core/api.h>
#include <libcork/core/callbacks.h>
#include <libcork/core/types.h>
/*-----------------------------------------------------------------------
* Resizable arrays
*/
struct cork_array_priv;
struct cork_raw_array {
void *items;
size_t size;
struct cork_array_priv *priv;
};
CORK_API void
cork_raw_array_init(struct cork_raw_array *array, size_t element_size);
CORK_API void
cork_raw_array_done(struct cork_raw_array *array);
CORK_API void
cork_raw_array_set_callback_data(struct cork_raw_array *array,
void *user_data, cork_free_f free_user_data);
CORK_API void
cork_raw_array_set_init(struct cork_raw_array *array, cork_init_f init);
CORK_API void
cork_raw_array_set_done(struct cork_raw_array *array, cork_done_f done);
CORK_API void
cork_raw_array_set_reuse(struct cork_raw_array *array, cork_init_f reuse);
CORK_API void
cork_raw_array_set_remove(struct cork_raw_array *array, cork_done_f remove);
CORK_API size_t
cork_raw_array_element_size(const struct cork_raw_array *array);
CORK_API void
cork_raw_array_clear(struct cork_raw_array *array);
CORK_API void *
cork_raw_array_elements(const struct cork_raw_array *array);
CORK_API void *
cork_raw_array_at(const struct cork_raw_array *array, size_t index);
CORK_API size_t
cork_raw_array_size(const struct cork_raw_array *array);
CORK_API bool
cork_raw_array_is_empty(const struct cork_raw_array *array);
CORK_API void
cork_raw_array_ensure_size(struct cork_raw_array *array, size_t count);
CORK_API void *
cork_raw_array_append(struct cork_raw_array *array);
CORK_API int
cork_raw_array_copy(struct cork_raw_array *dest,
const struct cork_raw_array *src,
cork_copy_f copy, void *user_data);
/*-----------------------------------------------------------------------
* Type-checked resizable arrays
*/
#define cork_array(T) \
struct { \
T *items; \
size_t size; \
struct cork_array_priv *priv; \
}
#define cork_array_element_size(arr) (sizeof((arr)->items[0]))
#define cork_array_elements(arr) ((arr)->items)
#define cork_array_at(arr, i) ((arr)->items[(i)])
#define cork_array_size(arr) ((arr)->size)
#define cork_array_is_empty(arr) ((arr)->size == 0)
#define cork_array_to_raw(arr) ((struct cork_raw_array *) (void *) (arr))
#define cork_array_init(arr) \
(cork_raw_array_init(cork_array_to_raw(arr), cork_array_element_size(arr)))
#define cork_array_done(arr) \
(cork_raw_array_done(cork_array_to_raw(arr)))
#define cork_array_set_callback_data(arr, ud, fud) \
(cork_raw_array_set_callback_data(cork_array_to_raw(arr), (ud), (fud)))
#define cork_array_set_init(arr, i) \
(cork_raw_array_set_init(cork_array_to_raw(arr), (i)))
#define cork_array_set_done(arr, d) \
(cork_raw_array_set_done(cork_array_to_raw(arr), (d)))
#define cork_array_set_reuse(arr, r) \
(cork_raw_array_set_reuse(cork_array_to_raw(arr), (r)))
#define cork_array_set_remove(arr, r) \
(cork_raw_array_set_remove(cork_array_to_raw(arr), (r)))
#define cork_array_clear(arr) \
(cork_raw_array_clear(cork_array_to_raw(arr)))
#define cork_array_copy(d, s, c, ud) \
(cork_raw_array_copy(cork_array_to_raw(d), cork_array_to_raw(s), (c), (ud)))
#define cork_array_ensure_size(arr, count) \
(cork_raw_array_ensure_size(cork_array_to_raw(arr), (count)))
#define cork_array_append(arr, element) \
(cork_raw_array_append(cork_array_to_raw(arr)), \
((arr)->items[(arr)->size - 1] = (element), (void) 0))
#define cork_array_append_get(arr) \
(cork_raw_array_append(cork_array_to_raw(arr)), \
&(arr)->items[(arr)->size - 1])
/*-----------------------------------------------------------------------
* Builtin array types
*/
CORK_API void
cork_raw_pointer_array_init(struct cork_raw_array *array, cork_free_f free);
#define cork_pointer_array_init(arr, f) \
(cork_raw_pointer_array_init(cork_array_to_raw(arr), (f)))
struct cork_string_array {
const char **items;
size_t size;
struct cork_array_priv *priv;
};
CORK_API void
cork_string_array_init(struct cork_string_array *array);
CORK_API void
cork_string_array_append(struct cork_string_array *array, const char *str);
CORK_API void
cork_string_array_copy(struct cork_string_array *dest,
const struct cork_string_array *src);
#endif /* LIBCORK_DS_ARRAY_H */