/* Copyright (C) 2009 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program 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.
*/
#ifndef _ANDROID_UTILS_REFSET_H
#define _ANDROID_UTILS_REFSET_H

#include "android/utils/compiler.h"
#include <android/utils/vector.h>

ANDROID_BEGIN_HEADER

/* this implements a set of addresses in memory.
 * NULL cannot be stored in the set.
 */

typedef struct {
    AVECTOR_DECL(void*,buckets);
    int iteration;
} ARefSet;

AINLINED void
arefSet_init( ARefSet*  s )
{
    AVECTOR_INIT(s,buckets);
}

AINLINED void
arefSet_done( ARefSet*  s )
{
    AVECTOR_DONE(s,buckets);
}

AINLINED void
arefSet_clear( ARefSet*  s )
{
    AVECTOR_CLEAR(s,buckets);
    s->iteration = 0;
}

AINLINED int
arefSet_count( ARefSet*  s )
{
    return (int) AVECTOR_SIZE(s,buckets);
}

extern ABool  arefSet_has( ARefSet*  s, void*  item );
extern void   arefSet_add( ARefSet*  s, void*  item );
extern void   arefSet_del( ARefSet*  s, void*  item );

extern void   _arefSet_removeDeferred( ARefSet* s );

#define  AREFSET_DELETED ((void*)~(size_t)0)

#define  AREFSET_FOREACH(_set,_item,_statement) \
    do { \
        int  __refset_nn = 0; \
        int  __refset_max = (_set)->max_buckets; \
        (_set)->iteration += 2; \
        for ( ; __refset_nn < __refset_max; __refset_nn++ ) { \
            void*  __refset_item = (_set)->buckets[__refset_nn]; \
            if (__refset_item == NULL || __refset_item == AREFSET_DELETED) \
                continue; \
            _item = __refset_item; \
            _statement; \
        } \
        (_set)->iteration -= 2; \
        if ((_set)->iteration == 1) \
            _arefSet_removeDeferred(_set); \
    } while (0)

ANDROID_END_HEADER

#endif /* _ANDROID_UTILS_REFSET_H */
