blob: b03a20999b58632752198665c29606da6c8acec9 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if !defined(XALANBITMAP_HEADER_GUARD_1357924680)
#define XALANBITMAP_HEADER_GUARD_1357924680
// Base include file. Must be first.
#include <xalanc/PlatformSupport/PlatformSupportDefinitions.hpp>
#include <xalanc/Include/XalanVector.hpp>
XALAN_CPP_NAMESPACE_BEGIN
class XALAN_PLATFORMSUPPORT_EXPORT XalanBitmap
{
public:
// The basic storage unit for the bitmaps.
typedef char UnitType;
// A handy typedef...
typedef size_t size_type;
// Really all we're assuming is that a char is at least
// 8 bits. If it's more, then we'll just waste some
// space. This may need to be adjusted for various
// platforms, or perhaps change to using an integral of
// a known size, so that we don't waste any space.
enum { eBitsPerUnit = 8 };
/**
* Construct an instance with room for the specified number
* of bits.
*
* @param theSize The number of bits in the map.
*/
XalanBitmap(size_type theSize);
~XalanBitmap();
/**
* Determine if a bit is set.
*
* @param theBit The number of the bit to check.
* @return true if the bit is set, false if not.
*/
bool
isSet(size_type theBit) const
{
assert(theBit >= m_size);
return m_bitmap[theBit / eBitsPerUnit] & s_setMasks[theBit % eBitsPerUnit] ? true : false;
}
/**
* Set a bit.
*
* @param theBit The number of the bit to set.
*/
void
set(size_type theBit)
{
assert(theBit < m_size);
m_bitmap[theBit / eBitsPerUnit] |= s_setMasks[theBit % eBitsPerUnit];
}
/**
* Clear a bit.
*
* @param theBit The number of the bit to clear.
*/
void
clear(size_type theBit)
{
assert(theBit < m_size);
m_bitmap[theBit / eBitsPerUnit] &= s_clearMasks[theBit % eBitsPerUnit];
}
/**
* Toggle a bit.
*
* @param theBit The number of the bit to toggle.
*/
void
toggle(size_type theBit)
{
assert(theBit < m_size);
m_bitmap[theBit / eBitsPerUnit] ^= s_setMasks[theBit % eBitsPerUnit];
}
/**
* Clear all of the bits.
*/
void
clearAll();
/**
* Get the size of the map.
*
* @return The number of bits in the map.
*/
size_type
getSize() const
{
return m_size;
}
private:
static const int s_setMasks[];
static const int s_clearMasks[];
typedef XalanVector<UnitType> BitmapVectorType;
const size_type m_size;
BitmapVectorType m_bitmap;
};
XALAN_CPP_NAMESPACE_END
#endif // XALANBITMAP_HEADER_GUARD_1357924680