Overview
Comment: | Add refpool. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
8ec09e82ac241bb8ed7de05fcc7a294d |
User & Date: | js 2012-04-22 13:09:52 |
Context
2012-04-22
| ||
13:18 | Don't install tests. check-in: e5f3d00d30 user: js tags: trunk | |
13:09 | Add refpool. check-in: 8ec09e82ac user: js tags: trunk | |
12:50 | Add -Werror and -pipe if when using GCC. check-in: b18f80cc04 user: js tags: trunk | |
Changes
Changes to src/Makefile.
1 2 3 4 | SHARED_LIB = ${LIB_PREFIX}corefw${LIB_SUFFIX} LIB_MAJOR = 0 LIB_MINOR = 0 | | | | | | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SHARED_LIB = ${LIB_PREFIX}corefw${LIB_SUFFIX} LIB_MAJOR = 0 LIB_MINOR = 0 SRCS = array.c \ class.c \ map.c \ object.c \ range.c \ refpool.c \ string.c INCLUDES = ${SRCS:.c=.h} \ corefw.h \ hash.h include ../buildsys.mk |
Changes to src/object.c.
︙ | ︙ | |||
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "object.h" void* cfw_new(CFWClass *class, ...) { CFWObject *obj; if ((obj = malloc(class->size)) == NULL) | > > | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <assert.h> #include "object.h" #include "refpool.h" void* cfw_new(CFWClass *class, ...) { CFWObject *obj; if ((obj = malloc(class->size)) == NULL) |
︙ | ︙ | |||
46 47 48 49 50 51 52 53 54 55 56 57 58 59 | if (!class->ctor(obj, args)) { cfw_unref(obj); return NULL; } va_end(args); } return obj; } void* cfw_ref(void *ptr) { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | if (!class->ctor(obj, args)) { cfw_unref(obj); return NULL; } va_end(args); } return obj; } void* cfw_new_p(CFWClass *class, ...) { CFWObject *obj; assert(class != cfw_refpool); if ((obj = malloc(class->size)) == NULL) return NULL; obj->cls = class; obj->ref_cnt = 1; if (class->ctor != NULL) { va_list args; va_start(args, class); if (!class->ctor(obj, args)) { cfw_unref(obj); return NULL; } va_end(args); } if (!cfw_refpool_add(obj)) { cfw_unref(obj); return NULL; } return obj; } void* cfw_ref(void *ptr) { |
︙ | ︙ |
Changes to src/object.h.
︙ | ︙ | |||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 | typedef struct CFWObject { CFWClass *cls; int ref_cnt; } CFWObject; extern CFWClass *cfw_object; extern void* cfw_new(CFWClass*, ...); extern void* cfw_ref(void*); extern void cfw_unref(void*); extern void cfw_free(void*); extern bool cfw_equal(void*, void*); extern uint32_t cfw_hash(void*); extern void* cfw_copy(void*); | > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | typedef struct CFWObject { CFWClass *cls; int ref_cnt; } CFWObject; extern CFWClass *cfw_object; extern void* cfw_new(CFWClass*, ...); extern void* cfw_new_p(CFWClass*, ...); extern void* cfw_ref(void*); extern void cfw_unref(void*); extern void cfw_free(void*); extern bool cfw_equal(void*, void*); extern uint32_t cfw_hash(void*); extern void* cfw_copy(void*); |
︙ | ︙ |
Added src/refpool.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /* * Copyright (c) 2012, Jonathan Schleifer <js@webkeks.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include <assert.h> #include "object.h" #include "refpool.h" #include "array.h" struct CFWRefPool { CFWObject obj; void **data; size_t size; CFWRefPool *prev, *next; }; static CFWRefPool *top; static bool ctor(void *ptr, va_list args) { CFWRefPool *pool = ptr; pool->data = NULL; pool->size = 0; if (top != NULL) { pool->prev = top; top->next = pool; } else pool->prev = NULL; pool->next = NULL; top = pool; return true; } static void dtor(void *ptr) { CFWRefPool *pool = ptr; size_t i; if (pool->next != NULL) cfw_unref(pool->next); for (i = 0; i < pool->size; i++) cfw_unref(pool->data[i]); if (pool->data != NULL) free(pool->data); top = pool->prev; } bool cfw_refpool_add(void *ptr) { void **ndata; assert(top != NULL); if (top->data != NULL) ndata = realloc(top->data, (top->size + 1) * sizeof(void*)); else ndata = malloc((top->size + 1) * sizeof(void*)); if (ndata == NULL) return false; ndata[top->size++] = ptr; top->data = ndata; return true; } static CFWClass class = { .name = "CFWRefPool", .size = sizeof(CFWRefPool), .ctor = ctor, .dtor = dtor }; CFWClass *cfw_refpool = &class; |
Added src/refpool.h.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* * Copyright (c) 2012, Jonathan Schleifer <js@webkeks.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __COREFW_REFPOOL_H__ #define __COREFW_REFPOOL_H__ #include "class.h" typedef struct CFWRefPool CFWRefPool; extern CFWClass *cfw_refpool; extern bool cfw_refpool_add(void*); #endif |
Changes to tests/tests.c.
︙ | ︙ | |||
23 24 25 26 27 28 29 30 31 32 33 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include "object.h" #include "string.h" #include "array.h" #include "map.h" | > | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include "object.h" #include "refpool.h" #include "string.h" #include "array.h" #include "map.h" static void print_map(CFWMap *map) { cfw_map_iter_t iter; cfw_map_iter(map, &iter); cfw_map_iter_next(&iter); |
︙ | ︙ | |||
53 54 55 56 57 58 59 | fputs("}\n", stdout); } int main() { | | > < < | | | | | < | | | | > | | < | > | < | | > > > < | | > | | < | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | fputs("}\n", stdout); } int main() { CFWRefPool *p; CFWArray *a; CFWString *s, *s2; CFWMap *m; size_t i; p = cfw_new(cfw_refpool); a = cfw_new_p(cfw_array, cfw_new_p(cfw_string, "Hallo"), cfw_new_p(cfw_string, " Welt"), cfw_new_p(cfw_string, "!"), NULL); s = cfw_new(cfw_string, NULL); for (i = 0; i < cfw_array_size(a); i++) cfw_string_append(s, cfw_array_get(a, i)); cfw_unref(p); puts(cfw_string_c(s)); p = cfw_new(cfw_refpool); s2 = cfw_new_p(cfw_string, "ll"); printf("%zd\n", cfw_string_find(s, s2, cfw_range_all)); cfw_unref(p); cfw_unref(s); p = cfw_new(cfw_refpool); m = cfw_new_p(cfw_map, cfw_new_p(cfw_string, "Hallo"), cfw_new_p(cfw_string, "Welt!"), cfw_new_p(cfw_string, "Test"), cfw_new_p(cfw_string, "success!"), NULL); print_map(m); cfw_map_set(m, cfw_new_p(cfw_string, "Hallo"), cfw_new_p(cfw_string, "Test")); print_map(m); cfw_map_set(m, cfw_new_p(cfw_string, "Hallo"), NULL); print_map(m); cfw_unref(p); return 0; } |