зеркало из https://github.com/mozilla/gecko-dev.git
188 строки
5.7 KiB
C++
188 строки
5.7 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public
|
|
* License Version 1.1 (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.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
#ifndef _FAST_BITMATRIX_H_
|
|
#define _FAST_BITMATRIX_H_
|
|
|
|
#include "Fundamentals.h"
|
|
#include "Pool.h"
|
|
|
|
class FastBitSet;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// FastBitMatrix
|
|
//
|
|
// !!!! A FastBitMatrix cannot have a null number of rows nor a null
|
|
// !!!! number of column.
|
|
//
|
|
|
|
class FastBitMatrix
|
|
{
|
|
private:
|
|
|
|
Uint32* bits; // Array of words to store the bits.
|
|
Uint32 sizeInWords; // Number of words allocated.
|
|
Uint8 rowShift; // A row is (1 << shift) words wide.
|
|
Uint32 rowSizeInWords; // Number of used words in a row.
|
|
#ifdef DEBUG_LOG
|
|
Uint32 nCols; // Number of column in this matrix.
|
|
#endif
|
|
|
|
|
|
FastBitMatrix(const FastBitMatrix&); // No copy constructor.
|
|
|
|
// Return the offset to the first word on this row.
|
|
Uint32 getRowOffset(Uint32 row) const {return row << rowShift;}
|
|
// Return the offset to word containing column from the begining of the row.
|
|
Uint32 getWordOffsetFromBeginOfRow(Uint32 column) const {return column >> 5;}
|
|
// Return the offset of the word containing (row, column).
|
|
Uint32 getWordOffset(Uint32 row, Uint32 column) const {return getRowOffset(row) + getWordOffsetFromBeginOfRow(column);}
|
|
// Return the offset of the bit a column from the begining of the word containing column.
|
|
Uint32 getBitOffset(Uint32 column) const {return column & 31;}
|
|
|
|
public:
|
|
// This is not a valid bitmatrix. The method sizeTo must be called before any
|
|
// use of this instance.
|
|
FastBitMatrix() : sizeInWords(0), rowShift(0) {}
|
|
|
|
// Allocate a new matrix.
|
|
inline FastBitMatrix(Pool& pool, Uint32 nRows, Uint32 nCols);
|
|
|
|
// Resize the matrix.
|
|
void sizeTo(Pool& pool, Uint32 nRows, Uint32 nCols);
|
|
// Resize the matrix and clear all bits.
|
|
inline void sizeToAndClear(Pool& pool, Uint32 nRows, Uint32 nCols);
|
|
|
|
// Return a pointer to the row bits.
|
|
inline Uint32* getRowBits(Uint32 row) const {return &bits[getRowOffset(row)];}
|
|
|
|
// Clear all the bits in the matrix.
|
|
inline void clear();
|
|
// Clear the bit at (row, column).
|
|
void clear(Uint32 row, Uint32 column) {PR_ASSERT(sizeInWords); bits[getWordOffset(row, column)] &= ~(1<<getBitOffset(column));}
|
|
// Clear the row
|
|
void clear(Uint32 row);
|
|
// Set all the bits in the matrix.
|
|
inline void set();
|
|
// Set the bit at (row, column).
|
|
void set(Uint32 row, Uint32 column) {PR_ASSERT(sizeInWords); bits[getWordOffset(row, column)] |= (1<<getBitOffset(column));}
|
|
// Set the row.
|
|
void set(Uint32 row);
|
|
// Test the bit at (row, column).
|
|
bool test(Uint32 row, Uint32 column) const {PR_ASSERT(sizeInWords); return (bits[getWordOffset(row, column)]>>getBitOffset(column))&1;}
|
|
|
|
// And rows src1 & src2 to row dst
|
|
void andRows(Uint32 src1, Uint32 src2, Uint32 dst);
|
|
// And row src & the bitset x to row dst
|
|
void andRows(Uint32 src, const FastBitSet& x, Uint32 dst);
|
|
// Or rows src1 & src2 to row dst
|
|
void orRows(Uint32 src1, Uint32 src2, Uint32 dst);
|
|
// Or row src & the bitset x to row dst
|
|
void orRows(Uint32 src, const FastBitSet& x, Uint32 dst);
|
|
// Copy row src to row dst.
|
|
void copyRows(Uint32 src, Uint32 dst);
|
|
// Copy the bitset x to the row dst.
|
|
void copyRows(const FastBitSet& x, Uint32 dst);
|
|
// Copy the row x to the bitset x.
|
|
void copyRows(Uint32 src, FastBitSet& x);
|
|
// Compare the rows x and y.
|
|
bool compareRows(Uint32 x, Uint32 y) const;
|
|
|
|
// Arithmetic operators.
|
|
FastBitMatrix& operator |= (const FastBitMatrix& x);
|
|
FastBitMatrix& operator &= (const FastBitMatrix& x);
|
|
FastBitMatrix& operator ^= (const FastBitMatrix& x);
|
|
FastBitMatrix& operator -= (const FastBitMatrix& x);
|
|
|
|
// Comparison operators.
|
|
friend bool operator == (const FastBitMatrix& x, const FastBitMatrix& y);
|
|
friend bool operator != (const FastBitMatrix& x, const FastBitMatrix& y) {return !(x == y);}
|
|
|
|
// Copy operator.
|
|
FastBitMatrix& operator = (const FastBitMatrix& x);
|
|
|
|
#ifdef DEBUG_LOG
|
|
// Print the matrix.
|
|
void printPretty(FILE* f) const;
|
|
// Print the diffs with the given matrix.
|
|
void printDiff(FILE* f, const FastBitMatrix& x) const;
|
|
#endif /* DEBUG_LOG */
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Inlines
|
|
|
|
|
|
//
|
|
// Set all the bits in the matrix.
|
|
//
|
|
inline void FastBitMatrix::set()
|
|
{
|
|
PR_ASSERT(sizeInWords);
|
|
|
|
Uint32* ptr = bits;
|
|
Int32 count = sizeInWords - 1;
|
|
register Uint32 ones = Uint32(~0);
|
|
|
|
do
|
|
ptr[count] = ones;
|
|
while(--count >= 0);
|
|
}
|
|
|
|
//
|
|
// Clear all the bits in the matrix.
|
|
//
|
|
inline void FastBitMatrix::clear()
|
|
{
|
|
PR_ASSERT(sizeInWords);
|
|
|
|
Uint32* ptr = bits;
|
|
Int32 count = sizeInWords - 1;
|
|
register Uint32 zeros = Uint32(0);
|
|
|
|
do
|
|
ptr[count] = zeros;
|
|
while(--count >= 0);
|
|
}
|
|
|
|
//
|
|
// Resize the matrix and clear all the bits.
|
|
//
|
|
inline void FastBitMatrix::sizeToAndClear(Pool& pool, Uint32 nRows, Uint32 nCols)
|
|
{
|
|
sizeTo(pool, nRows, nCols);
|
|
clear();
|
|
}
|
|
|
|
//
|
|
// Resize the new matrix and clear its content.
|
|
//
|
|
inline FastBitMatrix::FastBitMatrix(Pool& pool, Uint32 nRows, Uint32 nCols) : sizeInWords(0)
|
|
{
|
|
PR_ASSERT(nRows && nCols);
|
|
sizeToAndClear(pool, nRows, nCols);
|
|
}
|
|
|
|
|
|
#endif /* _FAST_BITMATRIX_H_ */
|
|
|