1 /* weak.h -*- mode:c; coding:utf-8; -*- 2 * 3 * Copyright (c) 2010-2021 Takashi Kato <ktakashi@ymail.com> 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 22 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $Id: $ 29 */ 30 #ifndef SAGITTARIUS_PRIVATE_WEAK_H_ 31 #define SAGITTARIUS_PRIVATE_WEAK_H_ 32 33 #include "sagittariusdefs.h" 34 #include "clos.h" 35 36 SG_CLASS_DECL(Sg_WeakVectorClass); 37 SG_CLASS_DECL(Sg_WeakHashTableClass); 38 #define SG_CLASS_WEAK_VECTOR (&Sg_WeakVectorClass) 39 #define SG_CLASS_WEAK_HASHTABLE (&Sg_WeakHashTableClass) 40 typedef struct SgWeakVectorRec 41 { 42 SG_HEADER; 43 long size; 44 void *pointers; /* opaque */ 45 } SgWeakVector; 46 47 #define SG_WEAK_VECTOR(obj) ((SgWeakVector*)(obj)) 48 #define SG_WEAK_VECTORP(obj) SG_XTYPEP(obj,SG_CLASS_WEAK_VECTOR) 49 50 /* weak box for weak hashtable */ 51 SG_CLASS_DECL(Sg_WeakBoxClass); 52 #define SG_CLASS_WEAK_BOX (&Sg_WeakBoxClass) 53 #define SG_WEAK_BOX(obj) ((SgWeakBox*)(obj)) 54 #define SG_WEAK_BOXP(obj) SG_XTYPEP(obj, SG_CLASS_WEAK_BOX) 55 struct SgWeakBoxRec 56 { 57 SG_HEADER; 58 void *ptr; 59 int registered; 60 }; 61 typedef struct SgWeakBoxRec SgWeakBox; 62 63 #include "hashtable.h" 64 65 /* This should not be part of enum. remove entry when the value is GCed */ 66 #define SG_WEAK_REMOVE (1L<<2) 67 typedef enum { 68 SG_WEAK_KEY = (1L<<0), 69 SG_WEAK_VALUE = (1L<<1), 70 SG_WEAK_BOTH = (SG_WEAK_KEY | SG_WEAK_VALUE), 71 /* if key is removed then entry should be removed as well */ 72 /* SG_WEAK_REMOVE_KEY = (SG_WEAK_REMOVE | SG_WEAK_KEY), */ 73 SG_WEAK_REMOVE_VALUE = (SG_WEAK_REMOVE | SG_WEAK_VALUE), 74 SG_WEAK_REMOVE_BOTH = (SG_WEAK_REMOVE | SG_WEAK_KEY | SG_WEAK_VALUE), 75 } SgWeakness; 76 77 typedef struct SgWeakHashTableRec 78 { 79 SgHashTable parent; /* sub class of hashtable */ 80 SgWeakness weakness; 81 SgObject defaultValue; 82 SgHashProc *hasher; 83 SgHashCompareProc *compare; 84 unsigned int goneEntries; 85 } SgWeakHashTable; 86 87 typedef SgHashIter SgWeakHashIter; 88 89 #define SG_WEAK_HASHTABLE(obj) ((SgWeakHashTable*)obj) 90 #define SG_WEAK_HASHTABLE_P(obj) SG_XTYPEP(obj, SG_CLASS_WEAK_HASHTABLE) 91 #define SG_WEAK_HASHTABLE_CORE(obj) (&SG_HASHTABLE(obj)->core) 92 #define SG_WEAK_HASHTABLE_TYPE(obj) (SG_HASHTABLE(obj)->type) 93 #define SG_WEAK_HASHTABLE_WEAKNESS(obj) (SG_WEAK_HASHTABLE(obj)->weakness) 94 #define SG_WEAK_HASHTABLE_DEFAULT_VALUE(obj) \ 95 (SG_WEAK_HASHTABLE(obj)->defaultValue) 96 97 SG_CDECL_BEGIN 98 99 /* weak vector */ 100 SG_EXTERN SgObject Sg_MakeWeakVector(long size); 101 SG_EXTERN SgObject Sg_WeakVectorRef(SgWeakVector *v, 102 long index, SgObject fallback); 103 SG_EXTERN SgObject Sg_WeakVectorSet(SgWeakVector *v, 104 long index, SgObject value); 105 106 /* weak box */ 107 SG_EXTERN SgWeakBox* Sg_MakeWeakBox(void *value); 108 SG_EXTERN int Sg_WeakBoxEmptyP(SgWeakBox *wbox); 109 SG_EXTERN void Sg_WeakBoxSet(SgWeakBox *wbox, void *value); 110 SG_EXTERN void* Sg_WeakBoxRef(SgWeakBox *wbox); 111 112 /* weak hash */ 113 SG_EXTERN SgObject Sg_MakeWeakHashTableSimple(SgHashType type, 114 SgWeakness weakness, 115 long initSize, 116 SgObject defaultValue); 117 SG_EXTERN SgObject Sg_MakeWeakHashTable(SgObject hasher, 118 SgObject compare, 119 SgWeakness weakness, 120 long initSize, 121 SgObject defaultValue); 122 SG_EXTERN SgObject Sg_WeakHashTableCopy(SgWeakHashTable *table); 123 SG_EXTERN SgObject Sg_WeakHashTableRef(SgWeakHashTable *table, 124 SgObject key, SgObject fallback); 125 SG_EXTERN SgObject Sg_WeakHashTableSet(SgWeakHashTable *table, 126 SgObject key, SgObject value, int flag); 127 SG_EXTERN SgObject Sg_WeakHashTableDelete(SgWeakHashTable *table, 128 SgObject key); 129 SG_EXTERN SgObject Sg_WeakHashTableKeys(SgWeakHashTable *table); 130 SG_EXTERN SgObject Sg_WeakHashTableValues(SgWeakHashTable *table); 131 132 SG_EXTERN void Sg_WeakHashIterInit(SgWeakHashIter *iter, 133 SgWeakHashTable *table); 134 SG_EXTERN int Sg_WeakHashIterNext(SgWeakHashIter *iter, 135 SgObject *key, SgObject *value); 136 SG_EXTERN int Sg_WeakHashTableShrink(SgWeakHashTable *table); 137 138 SG_CDECL_END 139 140 #endif /* SAGITTARIUS_WEAK_H_ */ 141