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
154c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#include <android/utils/vector.h>
164c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
174c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner/* this implements a set of addresses in memory.
184c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner * NULL cannot be stored in the set.
194c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner */
204c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
214c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnertypedef struct {
224c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    AVECTOR_DECL(void*,buckets);
23347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner    int iteration;
244c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner} ARefSet;
254c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
264c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED void
274c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_init( ARefSet*  s )
284c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{
294c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    AVECTOR_INIT(s,buckets);
304c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner}
314c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
324c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED void
334c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_done( ARefSet*  s )
344c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{
354c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    AVECTOR_DONE(s,buckets);
364c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner}
374c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
387a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' TurnerAINLINED void
397a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' TurnerarefSet_clear( ARefSet*  s )
407a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner{
417a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner    AVECTOR_CLEAR(s,buckets);
42347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner    s->iteration = 0;
437a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner}
447a17b608de24e3aaf7d5ca030bb80a74dcc3baf9David 'Digit' Turner
454c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerAINLINED int
464c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' TurnerarefSet_count( ARefSet*  s )
474c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner{
484c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    return (int) AVECTOR_SIZE(s,buckets);
494c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner}
504c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
514c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern ABool  arefSet_has( ARefSet*  s, void*  item );
524c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void   arefSet_add( ARefSet*  s, void*  item );
534c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turnerextern void   arefSet_del( ARefSet*  s, void*  item );
544c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
55347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turnerextern void   _arefSet_removeDeferred( ARefSet* s );
56347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner
574c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AREFSET_DELETED ((void*)~(size_t)0)
584c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
594c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#define  AREFSET_FOREACH(_set,_item,_statement) \
604c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    do { \
614c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        int  __refset_nn = 0; \
624c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        int  __refset_max = (_set)->max_buckets; \
63347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner        (_set)->iteration += 2; \
644c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        for ( ; __refset_nn < __refset_max; __refset_nn++ ) { \
654c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            void*  __refset_item = (_set)->buckets[__refset_nn]; \
664c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            if (__refset_item == NULL || __refset_item == AREFSET_DELETED) \
674c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner                continue; \
68347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner            _item = __refset_item; \
694c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner            _statement; \
704c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner        } \
71347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner        (_set)->iteration -= 2; \
72347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner        if ((_set)->iteration == 1) \
73347753be1d6bb07249641c84c3c582113af81941David 'Digit' Turner            _arefSet_removeDeferred(_set); \
744c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner    } while (0)
754c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner
764c0f745dc80d392fddea23eb8d4d7d86425ce0c6David 'Digit' Turner#endif /* _ANDROID_UTILS_REFSET_H */
77