Annotation of researchv9/cmd/cfront/libC/generic/vector.h, revision 1.1

1.1     ! root        1: 
        !             2: #ifndef GENERICH
        !             3: #include <generic.h>
        !             4: #endif
        !             5: 
        !             6: #define vector(type) name2(type,vector)
        !             7: #define vectordeclare(type)                                                    \
        !             8: extern GPT errorhandler(vector,type);                                          \
        !             9: extern GPT set_handler(vector,type,GPT);                                       \
        !            10: class vector(type) {                                                           \
        !            11:        type* v;                                                                \
        !            12:        int sz;                                                                 \
        !            13: public:                                                                                \
        !            14:        vector(type)(int s)                                                     \
        !            15:        {       if (s<=0) callerror(vector,type,1,"bad vector size");           \
        !            16:                v = new type[sz=s];                                             \
        !            17:        }                                                                       \
        !            18:        ~vector(type)() { delete[sz] v; }                                       \
        !            19:        vector(type)(vector(type)&);                                            \
        !            20:        vector(type)& operator=(vector(type)&);                                 \
        !            21:        int size() { return sz; }                                               \
        !            22:        void set_size(int);                                                     \
        !            23:        type& elem(int i) { return v[i]; }                                      \
        !            24:        type& operator[](int i)                                                 \
        !            25:        {       if (i<0 || sz<=i)                                               \
        !            26:                        callerror(vector,type,2,"vector index out of range");   \
        !            27:                return v[i];                                                    \
        !            28:        }                                                                       \
        !            29: };
        !            30: 
        !            31: #define vectorimplement(type)                                                  \
        !            32: GPT errorhandler(vector,type) = genericerror;                                  \
        !            33: vector(type)::vector(type)(vector(type)& a)                                    \
        !            34: {                                                                              \
        !            35:        register i = a.sz;                                                      \
        !            36:        sz = i;                                                                 \
        !            37:        v = new type[i];                                                        \
        !            38:        register type* vv = &v[i];                                              \
        !            39:        register type* av = &a.v[i];                                            \
        !            40:        while (i--) *--vv = *--av;                                              \
        !            41: }                                                                              \
        !            42:                                                                                \
        !            43: vector(type)& vector(type)::operator=(vector(type)& a)                         \
        !            44: {                                                                              \
        !            45:        register i = a.sz;                                                      \
        !            46:        if (i != sz)                                                            \
        !            47:                callerror(vector,type,3,"different vector sizes in assignment");\
        !            48:        register type* vv = &v[i];                                              \
        !            49:        register type* av = &a.v[i];                                            \
        !            50:        while (i--) *--vv = *--av;                                              \
        !            51:        delete[i] v;                                                            \
        !            52:        return *this;                                                           \
        !            53: }                                                                              \
        !            54:                                                                                \
        !            55: void vector(type)::set_size(int s)                                             \
        !            56: {                                                                              \
        !            57:        if (s<=0) callerror(vector,type,4,"bad new vector size");               \
        !            58:        type* nv = new type[s];                                                 \
        !            59:        register i = (s<=sz)?s:sz;                                              \
        !            60:        register type* vv = &v[i];                                              \
        !            61:        register type* av = &nv[i];                                             \
        !            62:        while (i--) *--vv = *--av;                                              \
        !            63:        delete[sz] v;                                                           \
        !            64:        v = nv;                                                                 \
        !            65:        sz = s;                                                                 \
        !            66: }                                                                              \
        !            67:                                                                                \
        !            68: GPT set_handler(vector,type, GPT a)                                            \
        !            69: {                                                                              \
        !            70:        GPT oo = errorhandler(vector,type);                                     \
        !            71:        errorhandler(vector,type) = a;                                          \
        !            72:        return oo;                                                              \
        !            73: }
        !            74:        
        !            75:        
        !            76: 
        !            77: #define stack(type) name2(type,stack)
        !            78: 
        !            79: #define stackdeclare(type)                                                     \
        !            80: extern GPT errorhandler(stack,type);                                           \
        !            81: extern GPT set_handler(stack,type,GPT);                                                \
        !            82: class stack(type) : vector(type) {                                             \
        !            83:        int t;                                                                  \
        !            84: public:                                                                                \
        !            85:        stack(type)(int s) : (s) { t = 0; }                                     \
        !            86:        stack(type)(stack(type)& a) : ((vector(type)&)a) { t = a.t; }           \
        !            87:        void push(type& a)                                                      \
        !            88:        {       if (t==size()-1) callerror(stack,type,1,"stack overflow");      \
        !            89:                elem(++t) = a;                                                  \
        !            90:        }                                                                       \
        !            91:        type pop()                                                              \
        !            92:        {       if (t==0) callerror(stack,type,2,"stack underflow");            \
        !            93:                return elem(t--);                                               \
        !            94:        }                                                                       \
        !            95:        type& top()                                                             \
        !            96:        {       if (t==0) callerror(stack,type,3,"stack empty");                \
        !            97:                return elem(t);                                                 \
        !            98:        }                                                                       \
        !            99: };
        !           100: 
        !           101: #define stackimplement(type)                                                   \
        !           102: GPT errorhandler(stack,type);                                                  \
        !           103: GPT set_handler(stack,type, GPT a)                                             \
        !           104: {                                                                              \
        !           105:        GPT oo = errorhandler(stack,type);                                      \
        !           106:        errorhandler(stack,type) = a;                                           \
        !           107:        return oo;                                                              \
        !           108: }

unix.superglobalmegacorp.com

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