зеркало из https://github.com/mozilla/gecko-dev.git
189 строки
3.7 KiB
C
189 строки
3.7 KiB
C
|
/* -*- Mode: C++; tab-width: 8; 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.
|
||
|
*/
|
||
|
|
||
|
|
||
|
// TABS 3
|
||
|
//
|
||
|
// Bits array implementation
|
||
|
//
|
||
|
// Lloyd W. Tabb
|
||
|
//
|
||
|
#ifndef _bits_h_
|
||
|
#define _bits_h_
|
||
|
|
||
|
//
|
||
|
//
|
||
|
|
||
|
#ifdef min
|
||
|
#undef min
|
||
|
#endif
|
||
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||
|
#ifdef max
|
||
|
#undef max
|
||
|
#endif
|
||
|
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||
|
|
||
|
class BitReference {
|
||
|
public:
|
||
|
uint8 *m_pBits;
|
||
|
uint8 m_mask;
|
||
|
BitReference(uint8* pBits, uint8 mask){
|
||
|
m_pBits = pBits;
|
||
|
m_mask = mask;
|
||
|
}
|
||
|
|
||
|
int operator= (int i){
|
||
|
*m_pBits = (i ? *m_pBits | m_mask : *m_pBits & ~m_mask);
|
||
|
return !!i;
|
||
|
}
|
||
|
|
||
|
operator int(void){
|
||
|
return !!(*m_pBits & m_mask);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#if 00 /* some compiler don't seem to handle this type of template */
|
||
|
|
||
|
|
||
|
template <int iSize>
|
||
|
class TBitArray {
|
||
|
private:
|
||
|
uint8 m_Bits[iSize/8+1];
|
||
|
public:
|
||
|
BitArray(){
|
||
|
memset(&m_Bits,0, iSize/8+1);
|
||
|
}
|
||
|
|
||
|
BitReference operator [] (int i){
|
||
|
return BitReference(&m_Bits[i >> 3], 1 << (i & 7));
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define BIT_ARRAY_END -1
|
||
|
|
||
|
class CBitArray {
|
||
|
private:
|
||
|
uint8 *m_Bits;
|
||
|
long size;
|
||
|
public:
|
||
|
//
|
||
|
// This constructor is unused, and link clashes with
|
||
|
// CBitArray(long n, int iFirst, ...) for some Cfront based
|
||
|
// compilers (HP, SGI 5.2, ...)...djw
|
||
|
//
|
||
|
#if 0
|
||
|
CBitArray(long n=0) : m_Bits(0), size(0) {
|
||
|
if( n ){
|
||
|
SetSize(n);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Call this constructor with a maximum number, a series of bits and
|
||
|
// BIT_ARRAY_END for example: CBitArray a(100, 1 ,4 9 ,7, BIT_ARRAY_END);
|
||
|
//
|
||
|
// CBitArray::CBitArray(long n, int iFirst, ...) is now edtutil.cpp.
|
||
|
// Had to move it into a C++ file so that it could be non-inline.
|
||
|
// varargs/inline is a non-portable combo...djw
|
||
|
//
|
||
|
CBitArray(long n, int iFirst, ...);
|
||
|
|
||
|
void SetSize(long n);
|
||
|
|
||
|
long Size(){ return size; }
|
||
|
|
||
|
BitReference operator [] (int i){
|
||
|
XP_ASSERT(i >= 0 && i < size );
|
||
|
return BitReference(&m_Bits[i >> 3], 1 << (i & 7));
|
||
|
}
|
||
|
|
||
|
void ClearAll();
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#if 00
|
||
|
//
|
||
|
// This template will generate a Set that can contain all possible values.
|
||
|
// for an enum. Sets are created empty.
|
||
|
//
|
||
|
// ASSUMES:
|
||
|
// all enum elements are contiguous.
|
||
|
//
|
||
|
// EXAMPLE:
|
||
|
//
|
||
|
// enum CType {
|
||
|
// ctAlpha,
|
||
|
// ctVoul,
|
||
|
// ctDigit,
|
||
|
// ctPunctuation,
|
||
|
//
|
||
|
// ctMax,
|
||
|
// };
|
||
|
//
|
||
|
// typedef TSet<CType,ctMax> Set_CType;
|
||
|
//
|
||
|
// Set_CType x;
|
||
|
// x.Add(ctAlpha); // x has the attribute alpha
|
||
|
// x.Add(ctVoul); // x has the attribute Voul
|
||
|
//
|
||
|
//
|
||
|
template <class SetEnum, int setMax>
|
||
|
class TSet {
|
||
|
char bits[setMax/8+1];
|
||
|
public:
|
||
|
TSet(){
|
||
|
memset(bits,0,sizeof(bits));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// check to see if enum value is in the set
|
||
|
//
|
||
|
int In( SetEnum v ){
|
||
|
return !!(bits[v>>3] & (1<<(v & 7)));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Remove Enum from the set
|
||
|
//
|
||
|
void Remove( SetEnum v ){
|
||
|
// bits[v/8] &= ~(1<<v%8);
|
||
|
bits[v>>3] &= ~(1<< (v & 7));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Add Enum to the set
|
||
|
//
|
||
|
void Add( SetEnum v ){
|
||
|
//bits[v/8] |= 1<<v%8;
|
||
|
bits[v>>3] |= 1<< (v & 7);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|