blob: 26f480105f6be48d809e3d8156344479818c679b [file] [log] [blame]
/* $Id$
*
*/
#ifndef __PJPP_HASH_H__
#define __PJPP_HASH_H__
#include <pj++/types.hpp>
#include <pj/hash.h>
class PJ_Hash_Table
{
public:
class iterator
{
public:
iterator() {}
explicit iterator(pj_hash_table_t *h, pj_hash_iterator_t *i) : ht_(h), it_(i) {}
iterator(const iterator &rhs) : ht_(rhs.ht_), it_(rhs.it_) {}
void operator++() { it_ = pj_hash_next(ht_, it_); }
bool operator==(const iterator &rhs) { return ht_ == rhs.ht_ && it_ == rhs.it_; }
iterator & operator=(const iterator &rhs) { ht_=rhs.ht_; it_=rhs.it_; return *this; }
private:
pj_hash_table_t *ht_;
pj_hash_iterator_t it_val_;
pj_hash_iterator_t *it_;
friend class PJ_Hash_Table;
};
static PJ_Hash_Table *create(PJ_Pool *pool, unsigned size)
{
return (PJ_Hash_Table*) pj_hash_create(pool->pool_(), size);
}
static pj_uint32_t calc(pj_uint32_t initial_hval, const void *key, unsigned keylen)
{
return pj_hash_calc(initial_hval, key, keylen);
}
pj_hash_table_t *hash_table_()
{
return (pj_hash_table_t*)this;
}
void *get(const void *key, unsigned keylen)
{
return pj_hash_get(this->hash_table_(), key, keylen);
}
void set(PJ_Pool *pool, const void *key, unsigned keylen, void *value)
{
pj_hash_set(pool->pool_(), this->hash_table_(), key, keylen, value);
}
unsigned count()
{
return pj_hash_count(this->hash_table_());
}
iterator begin()
{
iterator it(this->hash_table_(), NULL);
it.it_ = pj_hash_first(this->hash_table_(), &it.it_val_);
return it;
}
iterator end()
{
return iterator(this->hash_table_(), NULL);
}
};
#endif /* __PJPP_HASH_H__ */