Path: blob/devel/ElmerGUI/netgen/libsrc/general/bitarray.hpp
3206 views
#ifndef FILE_BitArray1#define FILE_BitArray23/**************************************************************************/4/* File: bitarray.hpp */5/* Author: Joachim Schoeberl */6/* Date: 01. Jun. 95 */7/**************************************************************************/89#include <limits.h>1011/**12data type BitArray1314BitArray is a compressed array of Boolean information. By Set and Clear15the whole array or one bit can be set or reset, respectively.16Test returns the state of the accoring bit.17No range checking is done.1819index ranges from 0 to size-120*/21class BitArray22{23INDEX size;24unsigned char * data;2526public:27BitArray ();28///29BitArray (INDEX asize);30///31~BitArray ();3233///34void SetSize (INDEX asize);35///36INDEX Size () const37{38return size;39}4041///42void Set ();43///44void Set (INDEX i)45{46data[Addr(i)] |= Mask(i);47}4849void Clear ();505152void Clear (INDEX i)53{54data[Addr(i)] &= ~Mask(i);55}5657bool Test (INDEX i) const58{59return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? true : false;60}6162///63void Invert ();64///65void And (const BitArray & ba2);66///67void Or (const BitArray & ba2);68private:69///70inline unsigned char Mask (INDEX i) const71{72return char(1) << (i % CHAR_BIT);73}74///75inline INDEX Addr (INDEX i) const76{77return (i / CHAR_BIT);78}7980///81BitArray & operator= (BitArray &);82///83BitArray (const BitArray &);84};85868788// print bitarray89inline ostream & operator<< (ostream & s, const BitArray & a)90{91for (int i = 1; i <= a.Size(); i++)92{93s << int (a.Test(i));94if (i % 40 == 0) s << "\n";95}96if (a.Size() % 40 != 0) s << "\n";97return s;98}99100101/*102inline103INDEX BitArray :: Size () const104{105return size;106}107108inline109unsigned char BitArray :: Mask (INDEX i) const110{111return char(1) << (i % CHAR_BIT);112}113114inline115INDEX BitArray :: Addr (INDEX i) const116{117return (i / CHAR_BIT);118}119inline120void BitArray :: Set (INDEX i)121{122data[Addr(i)] |= Mask(i);123}124125inline126void BitArray :: Clear (INDEX i)127{128data[Addr(i)] &= ~Mask(i);129}130131132inline133int BitArray :: Test (INDEX i) const134{135return (data[i / CHAR_BIT] & (char(1) << (i % CHAR_BIT) ) ) ? 1 : 0;136}137138*/139140141142143144145/**146data type BitArrayChar147148BitArray is an array of Boolean information. By Set and Clear149the whole array or one bit can be set or reset, respectively.150Test returns the state of the accoring bit.151No range checking is done.152*/153template <int BASE = 1>154class BitArrayChar155{156///157ARRAY<char,BASE> data;158159public:160///161BitArrayChar ()162{ ; }163///164BitArrayChar (int asize)165: data(asize)166{ ; }167///168~BitArrayChar ()169{ ; }170171///172void SetSize (int asize)173{ data.SetSize(asize); }174175///176inline int Size () const177{ return data.Size(); }178179///180void Set ();181///182inline void Set (int i)183{ data[i] = 1; }184///185void Clear ();186///187inline void Clear (int i)188{ data[i] = 0; }189///190inline int Test (int i) const191{ return data[i]; }192///193void Invert ();194///195void And (const BitArrayChar & ba2);196///197void Or (const BitArrayChar & ba2);198private:199/// copy bitarray is not supported200BitArrayChar & operator= (BitArrayChar &) { return *this; }201/// copy bitarray is not supported202BitArrayChar (const BitArrayChar &) { ; }203};204205206207208template <int BASE>209inline ostream & operator<< (ostream & s, const BitArrayChar<BASE> & a)210{211for (int i = BASE; i < a.Size()+BASE; i++)212{213s << a.Test(i);214if ( (i-BASE) % 40 == 39) s << "\n";215}216if (a.Size() % 40 != 0) s << "\n";217return s;218}219220221#endif222223224