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