/* Sparse Arrays for Objective C dispatch tables Copyright (C) 1993, 1995, 1996, 2004, 2009 Free Software Foundation, Inc. Contributed by Kresten Krab Thorup. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC 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 General Public License for more details. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ #ifndef __sarray_INCLUDE_GNU #define __sarray_INCLUDE_GNU #include "thr.h" #define OBJC_SPARSE2 /* 2-level sparse array */ /* #define OBJC_SPARSE3 */ /* 3-level sparse array */ #ifdef OBJC_SPARSE2 extern const char* __objc_sparse2_id; #endif #ifdef OBJC_SPARSE3 extern const char* __objc_sparse3_id; #endif #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ extern int nbuckets; /* for stats */ extern int nindices; extern int narrays; extern int idxsize; /* An unsigned integer of same size as a pointer */ #define SIZET_BITS (sizeof(size_t)*8) #if defined(__sparc__) || defined(OBJC_SPARSE2) #define PRECOMPUTE_SELECTORS #endif #ifdef OBJC_SPARSE3 /* Buckets are 8 words each */ #define BUCKET_BITS 3 #define BUCKET_SIZE (1< indices[x.off.ioffset]-> buckets[x.off.boffset]-> elems[x.off.eoffset]; #else /* OBJC_SPARSE2 */ return array->buckets[x.off.boffset]->elems[x.off.eoffset]; #endif /* OBJC_SPARSE2 */ #else /* not PRECOMPUTE_SELECTORS */ #ifdef OBJC_SPARSE3 return array-> indices[indx/INDEX_CAPACITY]-> buckets[(indx/BUCKET_SIZE)%INDEX_SIZE]-> elems[indx%BUCKET_SIZE]; #else /* OBJC_SPARSE2 */ return array->buckets[indx/BUCKET_SIZE]->elems[indx%BUCKET_SIZE]; #endif /* not OBJC_SPARSE3 */ #endif /* not PRECOMPUTE_SELECTORS */ } static inline void* sarray_get_safe(struct sarray* array, sidx indx) { if(soffset_decode(indx) < array->capacity) return sarray_get(array, indx); else return (array->empty_bucket->elems[0]); } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __sarray_INCLUDE_GNU */