зеркало из https://github.com/mozilla/pjs.git
136 строки
3.0 KiB
C++
136 строки
3.0 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.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "FastBitMatrix.h"
|
|
#include "FastBitSet.h"
|
|
#include "prlog.h"
|
|
|
|
bool
|
|
operator == (const FastBitMatrix& x, const FastBitMatrix& y)
|
|
{
|
|
if ((x.nCols != y.nCols) || (x.nRows != y.nRows))
|
|
return false;
|
|
|
|
PRUint32 nCols = x.nCols;
|
|
PRUint32 nRows = x.nRows;
|
|
for (PRUint32 r = 0; r < nRows; r++)
|
|
{
|
|
FastBitSet xRow(x.getRow(r), nCols);
|
|
FastBitSet yRow(y.getRow(r), nCols);
|
|
|
|
if (xRow != yRow)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void FastBitMatrix::
|
|
reserve(PRUint32 r, PRUint32 c)
|
|
{
|
|
PRUint32 nWordsOnARow = FBS_ROUNDED_WORDS(c);
|
|
nRows = r;
|
|
nCols = c;
|
|
|
|
if ((nWordsOnARow & (nWordsOnARow - 1)) == 0)
|
|
{
|
|
PR_FLOOR_LOG2(rowShift, nWordsOnARow);
|
|
}
|
|
else
|
|
{
|
|
PR_FLOOR_LOG2(rowShift, nWordsOnARow);
|
|
rowShift++;
|
|
}
|
|
|
|
assert(rowShift < 32);
|
|
|
|
nWords = r << rowShift;
|
|
if (pool != NULL)
|
|
words = new(*pool) PRUint32[nWords];
|
|
else
|
|
words = new PRUint32[nWords];
|
|
}
|
|
|
|
void FastBitMatrix::
|
|
reserveOrUpdate(PRUint32 r, PRUint32 c)
|
|
{
|
|
PRUint32 nWordsOnARow = FBS_ROUNDED_WORDS(c);
|
|
PRUint32 neededWords;
|
|
nRows = r;
|
|
nCols = c;
|
|
|
|
if ((nWordsOnARow & (nWordsOnARow - 1)) == 0)
|
|
{
|
|
PR_FLOOR_LOG2(rowShift, nWordsOnARow);
|
|
}
|
|
else
|
|
{
|
|
PR_FLOOR_LOG2(rowShift, nWordsOnARow);
|
|
rowShift++;
|
|
}
|
|
assert(rowShift < 32);
|
|
neededWords = r << rowShift;
|
|
if (nWords < neededWords)
|
|
{
|
|
if ((words != NULL) && (pool == NULL)) delete words;
|
|
nWords = neededWords;
|
|
if (pool != NULL)
|
|
words = new(*pool) PRUint32[nWords];
|
|
else
|
|
words = new PRUint32[nWords];
|
|
}
|
|
}
|
|
|
|
void FastBitMatrix::
|
|
copy(PRUint32* src)
|
|
{
|
|
PRUint32 *ptr = words;
|
|
PRUint32* limit = &words[nRows << rowShift];
|
|
while (ptr < limit) *ptr++ = *src++;
|
|
}
|
|
|
|
#ifdef DEBUG_LOG
|
|
void FastBitMatrix::
|
|
printPretty(FILE* f)
|
|
{
|
|
fprintf(f, "[\n");
|
|
for (PRUint32 i = 0; i < nRows; i++)
|
|
{
|
|
fprintf(stdout, " ");
|
|
FastBitSet row(&words[i << rowShift], nCols);
|
|
row.printPretty(f);
|
|
}
|
|
fprintf(stdout, "]\n");
|
|
}
|
|
|
|
void FastBitMatrix::
|
|
printDiff(FILE *f, const FastBitMatrix& x)
|
|
{
|
|
PR_ASSERT((x.nCols == nCols) && (x.nRows == nRows));
|
|
|
|
fprintf(f, "[\n");
|
|
for (PRUint32 i = 0; i < nRows; i++)
|
|
{
|
|
fprintf(stdout, " ");
|
|
FastBitSet row(&words[i << rowShift], nCols);
|
|
FastBitSet xRow(&x.words[i << rowShift], nCols);
|
|
row.printDiff(f, xRow);
|
|
}
|
|
fprintf(stdout, "]\n");
|
|
}
|
|
#endif
|