📄 bitstring.h
字号:
inline BitSubString::~BitSubString() {}inline BitPattern::BitPattern(const BitString& p, const BitString& m) :pattern(p), mask(m) {}inline BitPattern::BitPattern(const BitPattern& b) :pattern(b.pattern), mask(b.mask) {}inline BitPattern::BitPattern() {}inline BitPattern::~BitPattern() {}// procedural versions of operatorsinline void and(const BitString& x, const BitString& y, BitString& r){ r.rep = and(x.rep, y.rep, r.rep);}inline void or(const BitString& x, const BitString& y, BitString& r){ r.rep = or(x.rep, y.rep, r.rep);}inline void xor(const BitString& x, const BitString& y, BitString& r){ r.rep = xor(x.rep, y.rep, r.rep);}inline void diff(const BitString& x, const BitString& y, BitString& r){ r.rep = diff(x.rep, y.rep, r.rep);}inline void cat(const BitString& x, const BitString& y, BitString& r){ r.rep = cat(x.rep, y.rep, r.rep);}inline void cat(const BitString& x, unsigned int y, BitString& r){ r.rep = cat(x.rep, y, r.rep);}inline void rshift(const BitString& x, int y, BitString& r){ r.rep = lshift(x.rep, -y, r.rep);}inline void lshift(const BitString& x, int y, BitString& r){ r.rep = lshift(x.rep, y, r.rep);}inline void complement(const BitString& x, BitString& r){ r.rep = cmpl(x.rep, r.rep);}// operatorsinline BitString& BitString::operator &= (const BitString& y){ and(*this, y, *this); return *this;}inline BitString& BitString::operator |= (const BitString& y){ or(*this, y, *this); return *this;}inline BitString& BitString::operator ^= (const BitString& y){ xor(*this, y, *this); return *this;}inline BitString& BitString::operator <<= (int y){ lshift(*this, y, *this); return *this;}inline BitString& BitString::operator >>= (int y){ rshift(*this, y, *this); return *this;}inline BitString& BitString::operator -= (const BitString& y){ diff(*this, y, *this); return *this;}inline BitString& BitString::operator += (const BitString& y){ cat(*this, y, *this); return *this;}inline BitString& BitString::operator += (unsigned int y){ cat(*this, y, *this); return *this;}inline void BitString::complement(){ ::complement(*this, *this);}#if defined(__GNUG__) && !defined(_G_NO_NRV)inline BitString operator & (const BitString& x, const BitString& y) return r{ and(x, y, r);}inline BitString operator | (const BitString& x, const BitString& y) return r{ or(x, y, r);}inline BitString operator ^ (const BitString& x, const BitString& y) return r{ xor(x, y, r);}inline BitString operator << (const BitString& x, int y) return r{ lshift(x, y, r);}inline BitString operator >> (const BitString& x, int y) return r{ rshift(x, y, r);}inline BitString operator - (const BitString& x, const BitString& y) return r{ diff(x, y, r);}inline BitString operator + (const BitString& x, const BitString& y) return r{ cat(x, y, r);}inline BitString operator + (const BitString& x, unsigned int y) return r{ cat(x, y, r);}inline BitString operator ~ (const BitString& x) return r{ complement(x, r);}#else /* NO_NRV */inline BitString operator & (const BitString& x, const BitString& y) { BitString r; and(x, y, r); return r;}inline BitString operator | (const BitString& x, const BitString& y) { BitString r; or(x, y, r); return r;}inline BitString operator ^ (const BitString& x, const BitString& y) { BitString r; xor(x, y, r); return r;}inline BitString operator << (const BitString& x, int y) { BitString r; lshift(x, y, r); return r;}inline BitString operator >> (const BitString& x, int y) { BitString r; rshift(x, y, r); return r;}inline BitString operator - (const BitString& x, const BitString& y) { BitString r; diff(x, y, r); return r;}inline BitString operator + (const BitString& x, const BitString& y) { BitString r; cat(x, y, r); return r;}inline BitString operator + (const BitString& x, unsigned int y) { BitString r; cat(x, y, r); return r;}inline BitString operator ~ (const BitString& x) { BitString r; complement(x, r); return r;}#endif// status, matchinginline int BitString::length() const{ return rep->len;}inline int BitString::empty() const{ return rep->len == 0;}inline int BitString::index(const BitString& y, int startpos) const{ return search(startpos, rep->len, y.rep->s, 0, y.rep->len);}inline int BitString::index(const BitSubString& y, int startpos) const{ return search(startpos, rep->len, y.S.rep->s, y.pos, y.pos+y.len);}inline int BitString::contains(const BitString& y) const{ return search(0, rep->len, y.rep->s, 0, y.rep->len) >= 0;}inline int BitString::contains(const BitSubString& y) const{ return search(0, rep->len, y.S.rep->s, y.pos, y.pos+y.len) >= 0;}inline int BitString::contains(const BitString& y, int p) const{ return match(p, rep->len, 0, y.rep->s, 0, y.rep->len);}inline int BitString::matches(const BitString& y, int p) const{ return match(p, rep->len, 1, y.rep->s, 0, y.rep->len);}inline int BitString::contains(const BitSubString& y, int p) const{ return match(p, rep->len, 0, y.S.rep->s, y.pos, y.pos+y.len);}inline int BitString::matches(const BitSubString& y, int p) const{ return match(p, rep->len, 1, y.S.rep->s, y.pos, y.pos+y.len);}inline int BitString::contains(const BitPattern& r) const{ return r.search(rep->s, 0, rep->len) >= 0;}inline int BitString::contains(const BitPattern& r, int p) const{ return r.match(rep->s, p, rep->len, 0);}inline int BitString::matches(const BitPattern& r, int p) const{ return r.match(rep->s, p, rep->len, 1);}inline int BitString::index(const BitPattern& r, int startpos) const{ return r.search(rep->s, startpos, rep->len);}inline int BitSubString::length() const{ return len;}inline int BitSubString::empty() const{ return len == 0;}inline int operator != (const BitString& x, const BitString& y){ return !(x == y);}inline int operator>(const BitString& x, const BitString& y){ return y < x;}inline int operator>=(const BitString& x, const BitString& y){ return y <= x;}inline int BitString::first(unsigned int b) const{ return next(-1, b);}inline int BitString::last(unsigned int b) const{ return prev(rep->len, b);}inline int BitString::index(unsigned int bit, int startpos) const{ if (startpos >= 0) return next(startpos - 1, bit); else return prev(rep->len + startpos + 1, bit);}inline void BitString::right_trim(unsigned int b) { int nb = (b == 0)? 1 : 0; rep = BStr_resize(rep, prev(rep->len, nb) + 1);}inline void BitString::left_trim(unsigned int b){ int nb = (b == 0)? 1 : 0; int p = next(-1, nb); rep = BStr_alloc(rep, rep->s, p, rep->len, rep->len - p);}inline int BitString::test(int i) const{ return ((unsigned)(i) >= rep->len)? 0 : ((rep->s[BitStr_index(i)] & (1 << (BitStr_pos(i)))) != 0);}// subscriptinginline BitStrBit::BitStrBit(const BitStrBit& b) :src(b.src), pos(b.pos) {}inline BitStrBit::BitStrBit(BitString& v, int p) :src(v), pos(p) {}inline BitStrBit::~BitStrBit() {}inline BitStrBit::operator unsigned int() const{ return src.test(pos);}inline int BitStrBit::operator = (unsigned int b){ src.assign(pos, b); return b;}inline BitStrBit BitString::operator [] (int i){ if ((unsigned)(i) >= rep->len) error("illegal bit index"); return BitStrBit(*this, i);}inline BitSubString BitString::_substr(int first, int l){ if (first < 0 || l <= 0 || (unsigned)(first + l) > rep->len) return BitSubString(_nil_BitString, 0, 0) ; else return BitSubString(*this, first, l);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -