/* $Id$
 *
 */
#ifndef __PJPP_POOL_H__
#define __PJPP_POOL_H__

#include <pj/pool.h>

class PJ_Pool
{
public:
    const char *getobjname() const
    {
	return pj_pool_getobjname(this->pool_());
    }

    pj_pool_t *pool_()
    {
	return (pj_pool_t*)this;
    }

    const pj_pool_t *pool_() const
    {
	return (const pj_pool_t*)this;
    }

    void release()
    {
	pj_pool_release(this->pool_());
    }

    void reset()
    {
	pj_pool_reset(this->pool_());
    }

    pj_size_t get_capacity()
    {
	pj_pool_get_capacity(this->pool_());
    }

    pj_size_t get_used_size()
    {
	pj_pool_get_used_size(this->pool_());
    }

    void *alloc(pj_size_t size)
    {
	return pj_pool_alloc(this->pool_(), size);
    }

    void *calloc(pj_size_t count, pj_size_t elem)
    {
	return pj_pool_calloc(this->pool_(), count, elem);
    }
};

class PJ_Caching_Pool
{
public:
    void init(pj_size_t max_capacity,
	      const pj_pool_factory_policy *pol=&pj_pool_factory_default_policy)
    {
	pj_caching_pool_init(&cp_, pol, max_capacity);
    }

    void destroy()
    {
	pj_caching_pool_destroy(&cp_);
    }

    PJ_Pool *create_pool(const char *name, pj_size_t initial_size, pj_size_t increment_size, pj_pool_callback *callback)
    {
	return (PJ_Pool*) (*cp_.factory.create_pool)(&cp_.factory, name, initial_size, increment_size, callback);
    }

    void release_pool( PJ_Pool *pool )
    {
	pj_pool_release(pool->pool_());
    }

private:
    pj_caching_pool cp_;
};

#endif	/* __PJPP_POOL_H__ */
