124 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef GIM_BITSET_H_INCLUDED
 | 
						|
#define GIM_BITSET_H_INCLUDED
 | 
						|
/*! \file gim_bitset.h
 | 
						|
\author Francisco Leon Najera
 | 
						|
*/
 | 
						|
/*
 | 
						|
-----------------------------------------------------------------------------
 | 
						|
This source file is part of GIMPACT Library.
 | 
						|
 | 
						|
For the latest info, see http://gimpact.sourceforge.net/
 | 
						|
 | 
						|
Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
 | 
						|
email: projectileman@yahoo.com
 | 
						|
 | 
						|
 This library is free software; you can redistribute it and/or
 | 
						|
 modify it under the terms of EITHER:
 | 
						|
   (1) The GNU Lesser General Public License as published by the Free
 | 
						|
       Software Foundation; either version 2.1 of the License, or (at
 | 
						|
       your option) any later version. The text of the GNU Lesser
 | 
						|
       General Public License is included with this library in the
 | 
						|
       file GIMPACT-LICENSE-LGPL.TXT.
 | 
						|
   (2) The BSD-style license that is included with this library in
 | 
						|
       the file GIMPACT-LICENSE-BSD.TXT.
 | 
						|
   (3) The zlib/libpng license that is included with this library in
 | 
						|
       the file GIMPACT-LICENSE-ZLIB.TXT.
 | 
						|
 | 
						|
 This library 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 files
 | 
						|
 GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
 | 
						|
 | 
						|
-----------------------------------------------------------------------------
 | 
						|
*/
 | 
						|
 | 
						|
#include "gim_array.h"
 | 
						|
 | 
						|
 | 
						|
#define GUINT_BIT_COUNT 32
 | 
						|
#define GUINT_EXPONENT 5
 | 
						|
 | 
						|
class gim_bitset
 | 
						|
{
 | 
						|
public:
 | 
						|
    gim_array<GUINT> m_container;
 | 
						|
 | 
						|
    gim_bitset()
 | 
						|
    {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    gim_bitset(GUINT bits_count)
 | 
						|
    {
 | 
						|
        resize(bits_count);
 | 
						|
    }
 | 
						|
 | 
						|
    ~gim_bitset()
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
	inline bool resize(GUINT newsize)
 | 
						|
	{
 | 
						|
		GUINT oldsize = m_container.size();
 | 
						|
		m_container.resize(newsize/GUINT_BIT_COUNT + 1,false);
 | 
						|
		while(oldsize<m_container.size())
 | 
						|
		{
 | 
						|
			m_container[oldsize] = 0;
 | 
						|
		}
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	inline GUINT size()
 | 
						|
	{
 | 
						|
		return m_container.size()*GUINT_BIT_COUNT;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void set_all()
 | 
						|
	{
 | 
						|
		for(GUINT i = 0;i<m_container.size();++i)
 | 
						|
		{
 | 
						|
			m_container[i] = 0xffffffff;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	inline void clear_all()
 | 
						|
	{
 | 
						|
	    for(GUINT i = 0;i<m_container.size();++i)
 | 
						|
		{
 | 
						|
			m_container[i] = 0;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	inline void set(GUINT bit_index)
 | 
						|
	{
 | 
						|
		if(bit_index>=size())
 | 
						|
		{
 | 
						|
			resize(bit_index);
 | 
						|
		}
 | 
						|
		m_container[bit_index >> GUINT_EXPONENT] |= (1 << (bit_index & (GUINT_BIT_COUNT-1)));
 | 
						|
	}
 | 
						|
 | 
						|
	///Return 0 or 1
 | 
						|
	inline char get(GUINT bit_index)
 | 
						|
	{
 | 
						|
		if(bit_index>=size())
 | 
						|
		{
 | 
						|
			return 0;
 | 
						|
		}
 | 
						|
		char value = m_container[bit_index >> GUINT_EXPONENT] &
 | 
						|
					 (1 << (bit_index & (GUINT_BIT_COUNT-1)));
 | 
						|
		return value;
 | 
						|
	}
 | 
						|
 | 
						|
	inline void clear(GUINT bit_index)
 | 
						|
	{
 | 
						|
	    m_container[bit_index >> GUINT_EXPONENT] &= ~(1 << (bit_index & (GUINT_BIT_COUNT-1)));
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif // GIM_CONTAINERS_H_INCLUDED
 |