/* -*- 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 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 Set_CType; // // Set_CType x; // x.Add(ctAlpha); // x has the attribute alpha // x.Add(ctVoul); // x has the attribute Voul // // template 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<>3] &= ~(1<< (v & 7)); } // // Add Enum to the set // void Add( SetEnum v ){ //bits[v/8] |= 1<>3] |= 1<< (v & 7); } }; #endif #endif