14c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* Copyright (C) 2009 The Android Open Source Project 24c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** 34c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This software is licensed under the terms of the GNU General Public 44c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** License version 2, as published by the Free Software Foundation, and 54c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** may be copied, distributed, and modified under those terms. 64c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** 74c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** This program is distributed in the hope that it will be useful, 84c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** but WITHOUT ANY WARRANTY; without even the implied warranty of 94c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 104c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner** GNU General Public License for more details. 114c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner*/ 124c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#ifndef _ANDROID_UTILS_REFSET_H 134c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define _ANDROID_UTILS_REFSET_H 144c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 15f0c747e01328e713891f2fa66c4f9df64f580dc2David 'Digit' Turner#include "android/utils/compiler.h" 164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <android/utils/vector.h> 174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 18f0c747e01328e713891f2fa66c4f9df64f580dc2David 'Digit' TurnerANDROID_BEGIN_HEADER 19f0c747e01328e713891f2fa66c4f9df64f580dc2David 'Digit' Turner 204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* this implements a set of addresses in memory. 214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner * NULL cannot be stored in the set. 224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner */ 234c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnertypedef struct { 254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AVECTOR_DECL(void*,buckets); 26347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner int iteration; 274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} ARefSet; 284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED void 304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_init( ARefSet* s ) 314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AVECTOR_INIT(s,buckets); 334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED void 364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_done( ARefSet* s ) 374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 384c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner AVECTOR_DONE(s,buckets); 394c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 404c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 417a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' TurnerAINLINED void 427a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' TurnerarefSet_clear( ARefSet* s ) 437a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner{ 447a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner AVECTOR_CLEAR(s,buckets); 45347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner s->iteration = 0; 467a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner} 477a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner 484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED int 494c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_count( ARefSet* s ) 504c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{ 514c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner return (int) AVECTOR_SIZE(s,buckets); 524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} 534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern ABool arefSet_has( ARefSet* s, void* item ); 554c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void arefSet_add( ARefSet* s, void* item ); 564c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void arefSet_del( ARefSet* s, void* item ); 574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 58347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turnerextern void _arefSet_removeDeferred( ARefSet* s ); 59347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner 604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define AREFSET_DELETED ((void*)~(size_t)0) 614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define AREFSET_FOREACH(_set,_item,_statement) \ 634c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner do { \ 644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int __refset_nn = 0; \ 654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner int __refset_max = (_set)->max_buckets; \ 66347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner (_set)->iteration += 2; \ 674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner for ( ; __refset_nn < __refset_max; __refset_nn++ ) { \ 684c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner void* __refset_item = (_set)->buckets[__refset_nn]; \ 694c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner if (__refset_item == NULL || __refset_item == AREFSET_DELETED) \ 704c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner continue; \ 71347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner _item = __refset_item; \ 724c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner _statement; \ 734c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } \ 74347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner (_set)->iteration -= 2; \ 75347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner if ((_set)->iteration == 1) \ 76347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner _arefSet_removeDeferred(_set); \ 774c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner } while (0) 784c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner 79f0c747e01328e713891f2fa66c4f9df64f580dc2David 'Digit' TurnerANDROID_END_HEADER 80f0c747e01328e713891f2fa66c4f9df64f580dc2David 'Digit' Turner 814c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#endif /* _ANDROID_UTILS_REFSET_H */ 82