diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-01-20 13:41:10 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-01-20 13:41:10 +0000 |
| commit | 2eee382a62a909d5a3f2f5eda94f30fe68fd5335 (patch) | |
| tree | b0b0d513535895f244214aebf6358e172b8dce6d /src/runtime/c/gu/list.h | |
| parent | b9728357126f8b9a6311cca17d9f0dcc2a7bfb9b (diff) | |
initial import of the C runtime
Diffstat (limited to 'src/runtime/c/gu/list.h')
| -rw-r--r-- | src/runtime/c/gu/list.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/src/runtime/c/gu/list.h b/src/runtime/c/gu/list.h new file mode 100644 index 000000000..f2add157f --- /dev/null +++ b/src/runtime/c/gu/list.h @@ -0,0 +1,140 @@ +/* + * Copyright 2010 University of Helsinki. + * + * This file is part of libgu. + * + * Libgu is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Libgu is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with libgu. If not, see <http://www.gnu.org/licenses/>. + */ + +/** @file + * + * Lists. + */ + +#ifndef GU_LIST_H_ +#define GU_LIST_H_ + +#include <gu/mem.h> + + +#define GuList(t) \ + struct { \ + const int len; \ + t elems[]; \ + } + +void* gu_list_alloc(GuPool* pool, size_t base_size, size_t elem_size, + int n_elems, size_t alignment); + +#define gu_new_list(t, pool, n) \ + ((t*) gu_list_alloc(pool, \ + sizeof(t), \ + sizeof(((t*)NULL)->elems[0]), \ + (n), \ + gu_flex_alignof(t))) + +static inline int +gu_list_length(const void* list) +{ + return *(const int*) list; +} + +#define gu_list_elems(lst) \ + ((lst)->elems) + +#define gu_list_index(lst, i) \ + (gu_list_elems(lst)[i]) + +typedef GuList(void*) GuPointers; +//typedef GuList(uint8_t) GuBytes; + +typedef GuList(int) GuInts; + + +#define GuListN(t_, len_) \ + struct { \ + int len; \ + t elems[len_]; \ + } + +#define gu_list_(qual_, t_, ...) \ + ((qual_ GuList(t_) *) \ + ((qual_ GuListN(t_, (sizeof((t_[]){__VA_ARGS__}) / sizeof(t_)))[]){ \ + __VA_ARGS__ \ + })) + +#define gu_list(t_, ...) \ + gu_list_(, t_, __VA_ARGS__) + +#define gu_clist(t_, ...) \ + gu_list_(const, t_, __VA_ARGS__) + +#define GuSList(t) \ + const struct { \ + int len; \ + t* elems; \ + } + +#define GU_SLIST_0 { .len = 0, .elems = NULL } + +#define GU_SLIST(t, ...) \ + { \ + .len = GU_ARRAY_LEN(t,GU_ID({__VA_ARGS__})), \ + .elems = ((t[]){__VA_ARGS__}) \ + } + + +#include <gu/type.h> + +// +// list +// + +typedef const struct GuListType GuListType, GuType_GuList; + +struct GuListType { + GuType_abstract abstract_base; + size_t size; + size_t align; + GuType* elem_type; + ptrdiff_t elems_offset; +}; + +#define GU_TYPE_INIT_GuList(k_, t_, elem_type_) { \ + .abstract_base = GU_TYPE_INIT_abstract(k_, t_, _), \ + .size = sizeof(t_), \ + .align = gu_alignof(t_), \ + .elem_type = elem_type_, \ + .elems_offset = offsetof(t_, elems) \ +} + +extern GU_DECLARE_KIND(GuList); + +void* +gu_list_type_alloc(GuListType* ltype, int n_elems, GuPool* pool); + +void* +gu_list_type_index(GuListType* ltype, void* list, int i); + +#include <gu/str.h> + + +typedef GuList(GuStr) GuStrs; +typedef GuStrs* GuStrsP; + +extern GU_DECLARE_TYPE(GuStrs, GuList); +extern GU_DECLARE_TYPE(GuStrsP, pointer); + + +#endif // GU_LIST_H_ |
