Annotation of researchv10no/cmd/cfront/ptcfront/Bits.h, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:src/Bits.h  1.2" */
        !             2: 
        !             3: #ifndef _BITS_H
        !             4: #define _BITS_H
        !             5: 
        !             6: #include "Block.h"
        !             7: 
        !             8: typedef unsigned long Bits_chunk;
        !             9: static const int Bits_shift_ATTLC = 5;
        !            10: static const int Bits_len_ATTLC = 1 << Bits_shift_ATTLC;
        !            11: static const int Bits_mask_ATTLC = Bits_len_ATTLC - 1;
        !            12: 
        !            13: Blockdeclare(Bits_chunk)
        !            14: 
        !            15: class Bits {
        !            16: private:
        !            17:        Block(Bits_chunk) b;
        !            18:        unsigned n;
        !            19: 
        !            20:        // the chunk number that contains bit n
        !            21:        unsigned chunk(unsigned n) const {
        !            22:                return n >> Bits_shift_ATTLC;
        !            23:        }
        !            24: 
        !            25:        // the number of chunks needed to contain an n-bit string
        !            26:        unsigned bound(unsigned n) const {
        !            27:                return (n + Bits_len_ATTLC - 1) >> Bits_shift_ATTLC;
        !            28:        }
        !            29: 
        !            30:        // a pointer to the (non-existent) chunk immediately
        !            31:        // after the last one in this Bits
        !            32:        Bits_chunk* limit() {
        !            33:                return b + bound(n);
        !            34:        }
        !            35:        const Bits_chunk* limit() const {
        !            36:                return b + bound(n);
        !            37:        }
        !            38: 
        !            39:        // turn off unused high-order bits in the high-order chunk
        !            40:        void normalize() {
        !            41:                register int ct = n & Bits_mask_ATTLC;
        !            42:                if (ct)
        !            43:                        b[chunk(n)] &= ~(~Bits_chunk(0) << ct);
        !            44:        }
        !            45: 
        !            46:        int compare(const Bits&) const;
        !            47:        int equal(const Bits&) const;
        !            48: 
        !            49: public:
        !            50:        Bits() { n = 0; }
        !            51:        Bits(Bits_chunk, unsigned = 1);
        !            52:        unsigned size() const { return n; }
        !            53:        unsigned size(unsigned);
        !            54:        friend Bits operator& (const Bits&, const Bits&);
        !            55:        friend Bits operator| (const Bits&, const Bits&);
        !            56:        friend Bits operator^ (const Bits&, const Bits&);
        !            57:        friend Bits operator~ (const Bits&);
        !            58:        friend Bits operator<< (const Bits&, int);
        !            59:        friend Bits operator>> (const Bits&, int);
        !            60:        friend int operator< (const Bits&, const Bits&);
        !            61:        friend int operator> (const Bits&, const Bits&);
        !            62:        friend int operator<= (const Bits&, const Bits&);
        !            63:        friend int operator>= (const Bits&, const Bits&);
        !            64:        friend int operator== (const Bits&, const Bits&);
        !            65:        friend int operator!= (const Bits&, const Bits&);
        !            66:        Bits& operator&= (const Bits&);
        !            67:        Bits& operator|= (const Bits&);
        !            68:        Bits& operator^= (const Bits&);
        !            69:        Bits& operator<<= (int);
        !            70:        Bits& operator>>= (int);
        !            71:        Bits& compl();
        !            72:        Bits& concat(const Bits&);
        !            73:        Bits& set(unsigned i) {
        !            74:                if (i < n)
        !            75:                        b[chunk(i)] |= Bits_chunk(1) << (i&Bits_mask_ATTLC);
        !            76:                return *this;
        !            77:        }
        !            78:        Bits& set(unsigned i, unsigned long x) {
        !            79:                if (i < n) {
        !            80:                        register Bits_chunk* p = &b[chunk(i)];
        !            81:                        register Bits_chunk mask = Bits_chunk(1) << (i&Bits_mask_ATTLC);
        !            82:                        if (x)
        !            83:                                *p |= mask;
        !            84:                        else
        !            85:                                *p &= ~mask;
        !            86:                }
        !            87:                return *this;
        !            88:        }
        !            89:        Bits& reset(unsigned i) {
        !            90:                if (i < n)
        !            91:                        b[chunk(i)] &= ~(Bits_chunk(1) << (i&Bits_mask_ATTLC));
        !            92:                return *this;
        !            93:        }
        !            94:        Bits& compl(unsigned i) {
        !            95:                if (i < n)
        !            96:                        b[chunk(i)] ^= Bits_chunk(1) << (i&Bits_mask_ATTLC);
        !            97:                return *this;
        !            98:        }
        !            99:        unsigned count() const;
        !           100:        operator Bits_chunk() const;
        !           101:        int operator[] (unsigned i) const {
        !           102:                if (i >= n)
        !           103:                        return 0;
        !           104:                else
        !           105:                        return (b[chunk(i)] >> (i&Bits_mask_ATTLC)) & 1;
        !           106:        }
        !           107:        unsigned signif() const;
        !           108:        unsigned trim() { return size(signif()); }
        !           109: };
        !           110: 
        !           111: inline int
        !           112: operator< (const Bits& a, const Bits& b)
        !           113: {
        !           114:        return a.compare(b) < 0;
        !           115: }
        !           116: 
        !           117: inline int
        !           118: operator> (const Bits& a, const Bits& b)
        !           119: {
        !           120:        return a.compare(b) > 0;
        !           121: }
        !           122: 
        !           123: inline int
        !           124: operator<= (const Bits& a, const Bits& b)
        !           125: {
        !           126:        return a.compare(b) <= 0;
        !           127: }
        !           128: 
        !           129: inline int
        !           130: operator>= (const Bits& a, const Bits& b)
        !           131: {
        !           132:        return a.compare(b) >= 0;
        !           133: }
        !           134: 
        !           135: inline int
        !           136: operator== (const Bits& a, const Bits& b)
        !           137: {
        !           138:        return a.equal(b);
        !           139: }
        !           140: 
        !           141: inline int
        !           142: operator!= (const Bits& a, const Bits& b)
        !           143: {
        !           144:        return !a.equal(b);
        !           145: }
        !           146: 
        !           147: Bits concat(const Bits&, const Bits&);
        !           148: 
        !           149: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.