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

1.1     ! root        1: /*ident        "@(#)ctrans:src/Block.h 1.2" */
        !             2: 
        !             3: #ifndef BLOCK_H
        !             4: #define BLOCK_H
        !             5: #include <new.h>
        !             6: 
        !             7: PT_names
        !             8:        Block(T)        Block_ T
        !             9: PT_end
        !            10: 
        !            11: PT_define Blockdeclare(T)
        !            12: 
        !            13: class Block(T) {
        !            14: public:
        !            15:        unsigned size() const { return n; }
        !            16:        unsigned size(unsigned);
        !            17:        Block(T)() { n = 0; p = 0; }
        !            18:        Block(T)(unsigned k) { n = 0; p = 0; size(k); }
        !            19:        Block(T)(const Block(T)& b) { copy(b); }
        !            20:        ~Block(T)();
        !            21:        Block(T)& operator=(const Block(T)&);
        !            22:        operator T*() { return p; }
        !            23:        operator const T*() const { return p; }
        !            24:        T* end() { return p + n; }
        !            25:        const T* end() const { return p + n; }
        !            26:        T& operator[](int i) { return p[i]; }
        !            27:        const T& operator[](int i) const { return p[i]; }
        !            28:        int reserve(unsigned k) { return k<n || grow(k); }
        !            29:        void swap(Block(T)& b);
        !            30: private:
        !            31:        T* p;
        !            32:        unsigned n;
        !            33:        void move(T*, unsigned);
        !            34:        void transfer(T*, unsigned);
        !            35:        void clear(T*, unsigned);
        !            36:        void copy(const Block(T)&);
        !            37:        unsigned grow(unsigned);
        !            38:        static T* default_value();
        !            39: };
        !            40: 
        !            41: PT_end
        !            42: 
        !            43: PT_define Blockimplement(T)
        !            44: 
        !            45: unsigned Block(T)::size(unsigned k)
        !            46: {
        !            47:        if (k != n)
        !            48:                move(new T[k], k);
        !            49:        return n;
        !            50: }
        !            51: Block(T)::~Block(T)()
        !            52: {
        !            53:        delete[] p;
        !            54: }
        !            55: Block(T)& Block(T)::operator=(const Block(T)& b)
        !            56: {
        !            57:        delete[] p;
        !            58:        copy(b);
        !            59:        return *this;
        !            60: }
        !            61: 
        !            62: /* Clear k elements starting at v */
        !            63: void
        !            64: Block(T)::clear(T* v, unsigned k)
        !            65: {
        !            66:        register T* p = v;
        !            67:        register T* lim = v + k;
        !            68:        T* valptr = default_value();
        !            69:        while (p < lim) {
        !            70:                *p++ = *valptr;
        !            71:        }
        !            72: }
        !            73: 
        !            74: /* Make this a copy of b */
        !            75: void
        !            76: Block(T)::copy(const Block(T)& b)
        !            77: {
        !            78:        // assert (p is 0 or garbage)
        !            79:        p = new T[b.n];
        !            80:        if (p) {
        !            81:                n = b.n;
        !            82:                transfer(b.p, n);
        !            83:        } else
        !            84:                n = 0;
        !            85: }
        !            86: 
        !            87: /* Grow this Block by 1.5 until it can contain at least k+1 */
        !            88: unsigned
        !            89: Block(T)::grow(unsigned k)
        !            90: {
        !            91:        unsigned nn = n;
        !            92:        if (nn == 0)
        !            93:                nn++;
        !            94:        while (nn <= k)
        !            95:                nn += (nn >> 1) + 1;
        !            96:        T* np = new T[nn];
        !            97:        if (!np) {
        !            98:                nn = k+1;
        !            99:                np = new T[nn];
        !           100:        }
        !           101:        move(np, nn);
        !           102:        return n;
        !           103: }
        !           104: 
        !           105: /* Transfer len (or fewer) elements into this Block. */
        !           106: void
        !           107: Block(T)::transfer(T* source, unsigned len)
        !           108: {
        !           109:        register T* plim;
        !           110:        register T* pp = p;
        !           111:        register T* q = source;
        !           112: 
        !           113:        if (n > len) {
        !           114:                plim = p + len;
        !           115:                clear(plim, n - len);
        !           116:        } else
        !           117:                plim = p + n;
        !           118: 
        !           119:        while (pp < plim)
        !           120:                *pp++ = *q++;
        !           121: }
        !           122: 
        !           123: /*
        !           124:  * The contents of this Block now live in memory starting at np
        !           125:  * If np is 0, null out this Block.
        !           126:  */
        !           127: void
        !           128: Block(T)::move(T* np, unsigned nn)
        !           129: {
        !           130:        T* oldp = p;
        !           131:        unsigned oldn = n;
        !           132:        p = np;
        !           133:        if (np) {
        !           134:                n = nn;
        !           135:                transfer(oldp, oldn);
        !           136:        } else
        !           137:                n = 0;
        !           138:        delete[] oldp;
        !           139: }
        !           140: 
        !           141: /* Exchange the contents of this Block with another Block */
        !           142: void
        !           143: Block(T)::swap(Block(T)& b)
        !           144: {
        !           145:        T* bp = b.p;
        !           146:        unsigned bn = b.n;
        !           147:        b.p = p;
        !           148:        b.n = n;
        !           149:        p = bp;
        !           150:        n = bn;
        !           151: }
        !           152: 
        !           153: T*
        !           154: Block(T)::default_value() {
        !           155:        static T default_item;
        !           156:        return(&default_item);
        !           157: }
        !           158: 
        !           159: PT_end
        !           160: 
        !           161: 
        !           162: #endif

unix.superglobalmegacorp.com

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