⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitset.h

📁 早期freebsd实现
💻 H
字号:
// This may look like C code, but it is really -*- C++ -*-/* Copyright (C) 1988 Free Software Foundation    written by Doug Lea (dl@rocky.oswego.edu)This file is part of the GNU C++ Library.  This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version.  This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE.  See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*/#ifndef _BitSet_h#ifdef __GNUG__#pragma interface#endif#define _BitSet_h 1#include <stream.h>#include <limits.h>#define BITSETBITS  (sizeof(short) * CHAR_BIT)struct BitSetRep{  unsigned short  len;          // number of shorts in s  unsigned short  sz;           // allocated slots  unsigned short  virt;         // virtual 0 or 1  unsigned short  s[1];         // bits start here};extern BitSetRep*   BitSetalloc(BitSetRep*, const unsigned short*,                                 int, int, int);extern BitSetRep*   BitSetcopy(BitSetRep*, const BitSetRep*);extern BitSetRep*   BitSetresize(BitSetRep*, int);extern BitSetRep*   BitSetop(const BitSetRep*, const BitSetRep*,                              BitSetRep*, char);extern BitSetRep*   BitSetcmpl(const BitSetRep*, BitSetRep*);extern BitSetRep    _nilBitSetRep;class BitSet;class BitSetBit{protected:  BitSet*            src;  unsigned long      pos; public:                     BitSetBit(BitSet* v, int p);                     BitSetBit(const BitSetBit& b);                    ~BitSetBit();                     operator int();  int                operator = (int b);  int                operator == (int b);  int                operator != (int b);};class BitSet{protected:  BitSetRep*          rep;  public:// constructors                     BitSet();                     BitSet(const BitSet&);                    ~BitSet();  void               operator =  (const BitSet& y);// equality & subset tests  friend int         operator == (const BitSet& x, const BitSet& y);  friend int         operator != (const BitSet& x, const BitSet& y);  friend int         operator <  (const BitSet& x, const BitSet& y);  friend int         operator <= (const BitSet& x, const BitSet& y);  friend int         operator >  (const BitSet& x, const BitSet& y);  friend int         operator >= (const BitSet& x, const BitSet& y);// operations on self  void               operator |= (const BitSet& y);  void               operator &= (const BitSet& y);  void               operator -= (const BitSet& y);  void               operator ^= (const BitSet& y);  void               complement();// individual bit manipulation  void               set(int pos);  void               set(int from, int to);  void               set(); // set all  void               clear(int pos);  void               clear(int from, int to);  void               clear(); // clear all  void               invert(int pos);  void               invert(int from, int to);  int                test(int pos) const;  int                test(int from, int to) const;  BitSetBit          operator [] (int i);  // iterators  int                first(int b = 1) const;  int                last(int b = 1) const;  int                next(int pos, int b = 1) const;  int                previous(int pos, int b = 1) const;// status  int                empty() const;  int                virtual_bit() const;  int                count(int b = 1) const;  // convertors & IO  friend BitSet      atoBitSet(const char* s,                                char f='0', char t='1', char star='*');  // BitSettoa is deprecated; do not use in new programs.  friend const char* BitSettoa(const BitSet& x,                                char f='0', char t='1', char star='*');  friend BitSet      shorttoBitSet(unsigned short w);  friend BitSet      longtoBitSet(unsigned long w);  friend ostream&    operator << (ostream& s, const BitSet& x);  void		     printon(ostream& s,			     char f='0', char t='1', char star='*') const;// procedural versions of operators  friend void        and(const BitSet& x, const BitSet& y, BitSet& r);  friend void        or(const BitSet& x, const BitSet& y, BitSet& r);  friend void        xor(const BitSet& x, const BitSet& y, BitSet& r);  friend void        diff(const BitSet& x, const BitSet& y, BitSet& r);  friend void        complement(const BitSet& x, BitSet& r);// misc  void      error(const char* msg) const;  int                OK() const;};typedef BitSet BitSetTmp;  BitSet      operator |  (const BitSet& x, const BitSet& y);  BitSet      operator &  (const BitSet& x, const BitSet& y);  BitSet      operator -  (const BitSet& x, const BitSet& y);  BitSet      operator ^  (const BitSet& x, const BitSet& y);  BitSet      operator ~  (const BitSet& x);// These are inlined regardless of optimizationinline int BitSet_index(int l){  return (unsigned)(l) / BITSETBITS;}inline int BitSet_pos(int l){  return l & (BITSETBITS - 1);}inline BitSet::BitSet() : rep(&_nilBitSetRep) {}inline BitSet::BitSet(const BitSet& x) :rep(BitSetcopy(0, x.rep)) {}inline BitSet::~BitSet() { if (rep != &_nilBitSetRep) delete rep; }inline void BitSet::operator =  (const BitSet& y){   rep = BitSetcopy(rep, y.rep);}inline int operator != (const BitSet& x, const BitSet& y) { return !(x == y); }inline int operator >  (const BitSet& x, const BitSet& y) { return y < x; }inline int operator >= (const BitSet& x, const BitSet& y) { return y <= x; }inline void and(const BitSet& x, const BitSet& y, BitSet& r){  r.rep =  BitSetop(x.rep, y.rep, r.rep, '&');}inline void or(const BitSet& x, const BitSet& y, BitSet& r){  r.rep =  BitSetop(x.rep, y.rep, r.rep, '|');}inline void xor(const BitSet& x, const BitSet& y, BitSet& r){  r.rep =  BitSetop(x.rep, y.rep, r.rep, '^');}inline void diff(const BitSet& x, const BitSet& y, BitSet& r){  r.rep =  BitSetop(x.rep, y.rep, r.rep, '-');}inline void complement(const BitSet& x, BitSet& r){  r.rep = BitSetcmpl(x.rep, r.rep);}#if defined(__GNUG__) && !defined(NO_NRV)inline BitSet operator & (const BitSet& x, const BitSet& y) return r{  and(x, y, r);}inline BitSet operator | (const BitSet& x, const BitSet& y) return r{  or(x, y, r);}inline BitSet operator ^ (const BitSet& x, const BitSet& y) return r{  xor(x, y, r);}inline BitSet operator - (const BitSet& x, const BitSet& y) return r{  diff(x, y, r);}inline BitSet operator ~ (const BitSet& x) return r{  ::complement(x, r);}#else /* NO_NRV */inline BitSet operator & (const BitSet& x, const BitSet& y) {  BitSet r; and(x, y, r); return r;}inline BitSet operator | (const BitSet& x, const BitSet& y) {  BitSet r; or(x, y, r); return r;}inline BitSet operator ^ (const BitSet& x, const BitSet& y) {  BitSet r; xor(x, y, r); return r;}inline BitSet operator - (const BitSet& x, const BitSet& y) {  BitSet r; diff(x, y, r); return r;}inline BitSet operator ~ (const BitSet& x) {  BitSet r; ::complement(x, r); return r;}#endifinline void BitSet::operator &= (const BitSet& y){  and(*this, y, *this);}inline void BitSet::operator |= (const BitSet& y){  or(*this, y, *this);}inline void BitSet::operator ^= (const BitSet& y){  xor(*this, y, *this);}inline void BitSet::operator -= (const BitSet& y){  diff(*this, y, *this);}inline void BitSet::complement(){  ::complement(*this, *this);}inline int BitSet::virtual_bit() const{  return rep->virt;}inline int BitSet::first(int b) const{  return next(-1, b);}inline int BitSet::test(int p) const{  if (p < 0) error("Illegal bit index");  int index = BitSet_index(p);  return (index >= rep->len)? rep->virt :          ((rep->s[index] & (1 << BitSet_pos(p))) != 0);}inline void BitSet::set(){  rep = BitSetalloc(rep, 0, 0, 1, 0);}inline BitSetBit::BitSetBit(const BitSetBit& b) :src(b.src), pos(b.pos) {}inline BitSetBit::BitSetBit(BitSet* v, int p){  src = v;  pos = p;}inline BitSetBit::~BitSetBit() {}inline BitSetBit::operator int(){  return src->test(pos);}inline int BitSetBit::operator = (int b){  if (b) src->set(pos); else src->clear(pos); return b;}inline int BitSetBit::operator == (int b){  return src->test(pos) == b;}inline int BitSetBit::operator != (int b){  return src->test(pos) != b;}inline BitSetBit BitSet::operator [] (int i){  if (i < 0) error("illegal bit index");  return BitSetBit(this, i);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -