blob: d08221c985a32617fee807ae5e707012cccdd485 [file] [log] [blame]
// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
//
// This file is part of GNU uCommon C++.
//
// GNU uCommon C++ is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU uCommon C++ 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 Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with GNU uCommon C++. If not, see <http://www.gnu.org/licenses/>.
/**
* A simple class to perform bitmap manipulation.
* Bitmaps are used to manage bit-aligned objects, such as network cidr
* addresses. This header introduces a common bitmap management class
* for the ucommon library.
* @file ucommon/bitmap.h
*/
#ifndef _UCOMMON_BITMAP_H_
#define _UCOMMON_BITMAP_H_
#ifndef _UCOMMON_CONFIG_H_
#include <ucommon/platform.h>
#endif
NAMESPACE_UCOMMON
/**
* A class to access bit fields in external bitmaps. The actual bitmap this
* object manipulates may not be stored in the object. Bitmaps may be
* referenced on special memory mapped or i/o bus based devices or other
* structures that have varying data word sizes which may differ from the
* default cpu bus size. The bitmap class can be set to the preferred memory
* bus size of the specific external bitmap being used. Bitmap size may also
* be relevant when accessing individual bits in memory mapped device registers
* where performing reference and manipulations may change the state of the
* device and hence must be aligned with the device register being effected.
*
* This class offers only the most basic bit manipulations, getting and
* setting individual bits in the bitmap. More advanced bit manipulations
* and other operations can be created in derived classes.
* @author David Sugar <dyfet@gnutelephony.org>
*/
class __EXPORT bitmap
{
protected:
size_t size;
typedef union
{
void *a;
uint8_t *b;
uint16_t *w;
uint32_t *l;
uint64_t *d;
} addr_t;
addr_t addr;
public:
/**
* Specify data word size to use in accessing a bitmap.
*/
typedef enum {
BMALLOC, /**< Use default cpu size */
B8, /**< Accessing a bitmap on 8 bit bus device */
B16, /**< Accessing a bitmap on a 16 bit device */
B32, /**< Accessing a bitmap on a 32 bit device */
B64, /**< Accessing a bitmap on a 64 bit device */
BMIN = BMALLOC,
BMAX = B64
} bus_t;
protected:
bus_t bus;
unsigned memsize(void) const;
public:
/**
* Create an object to reference the specified bitmap.
* @param addr of the bitmap in mapped memory.
* @param length of the bitmap being accessed in bits.
* @param size of the memory bus or manipulation to use.
*/
bitmap(void *addr, size_t length, bus_t size = B8);
/**
* Create a bitmap to manipulate locally. This bitmap is created
* as part of the object itself, and uses the BMALLOC bus mode.
* @param length of bitmap to create in bits.
*/
bitmap(size_t length);
/**
* Destroy bitmap manipulation object. If a bitmap was locally
* created with the alternate constructor, that bitmap will also be
* removed from memory.
*/
~bitmap();
/**
* Clear (zero) all the bits in the bitmap.
*/
void clear(void);
/**
* Get the value of a "bit" in the bitmap.
* @param offset to bit in map to get.
* @return true if bit is set.
*/
bool get(size_t offset) const;
/**
* Set an individual bit in the bitmask.
* @param offset to bit in map to change.
* @param value to change specified bit to.
*/
void set(size_t offset, bool value);
};
END_NAMESPACE
#endif