Annotation of researchv10no/cmd/cfront/libstring/list.h, revision 1.1

1.1     ! root        1: #ifndef listdeclare
        !             2: #ifndef GENERICH
        !             3: #include <generic.h>
        !             4: #endif
        !             5: #include <stream.h>
        !             6: 
        !             7: #ifndef TRUE
        !             8: #define FALSE  0
        !             9: #define TRUE   (!FALSE)
        !            10: #endif
        !            11: 
        !            12: #ifndef NULL
        !            13: #define NULL   0
        !            14: #endif
        !            15: 
        !            16: #ifndef BIT_DEFINED
        !            17: #define BIT_DEFINED
        !            18: typedef int    bit;
        !            19: #endif
        !            20: 
        !            21: struct lnk {
        !            22:        lnk*    nxt;
        !            23:        lnk*    prv;
        !            24:        void    init(lnk* p, lnk* s) { prv = p; nxt = s; }
        !            25:                lnk() {}
        !            26:                ~lnk() {}
        !            27: };
        !            28: struct LstHead {
        !            29:        lnk     *t;     // tail
        !            30:        lnk     *h() { return t ? t->nxt : 0; }
        !            31:        int     sz;
        !            32:        lnk     *cache;         // a recently retrieved link
        !            33:        int     cacheNo;        // its index or garbage if cache == NULL
        !            34:        int     refCount;
        !            35:                LstHead() { sz = 0; cache = t = NULL; }
        !            36:                virtual ~LstHead();
        !            37:        void    insert(lnk*);   // used by put() and unget()
        !            38:        void    unget(lnk* nl) { insert(nl); cacheNo++; }
        !            39:        void    put(lnk* nl) { insert(nl); t = nl; }
        !            40:        lnk*    get();
        !            41:        lnk*    unput();
        !            42:        lnk*    getAt(int);
        !            43: };
        !            44: struct lstiter;
        !            45: struct List {
        !            46:        friend lstiter;
        !            47:        lstiter *fI;
        !            48:        LstHead *it;
        !            49:        virtual void    sepWork();
        !            50:        void    separate() { if (it->refCount > 1) sepWork(); }
        !            51:        int     length() const { return it->sz; }
        !            52:                List() { fI = NULL; }
        !            53:                List(List& x) { fI = NULL; it = x.it; it->refCount++; }
        !            54:                ~List();
        !            55:        lnk*    tail() const { return it->t; }
        !            56:        lnk*    head() const { return it->h(); }
        !            57:        lstiter*        firstIt() { return fI; }
        !            58:        void    newIt(lstiter*, int=0);
        !            59:        void    removeIt(lstiter*);
        !            60:                operator void*() { return length() ? this : 0; }
        !            61:        List&   operator=(List&);
        !            62:        List&   unget(lnk*);
        !            63:        List&   put(lnk*);
        !            64:        lnk*    get();
        !            65:        lnk*    unput();
        !            66: };
        !            67: struct lstiter {
        !            68:        friend  List;
        !            69:        lnk     *pred;
        !            70:        List    *aList;
        !            71:        lstiter *nextIt;
        !            72:        int     index;
        !            73:                lstiter(List&, int =0);
        !            74:                lstiter(lstiter&);
        !            75:                ~lstiter();
        !            76:        List    *theList() { return aList; }
        !            77:        lstiter&        operator=(lstiter&);
        !            78:        bit     operator==(lstiter& oo) {
        !            79:                                return aList == oo.aList &&
        !            80:                                index == oo.index; }
        !            81:        bit     atEnd() { return index == aList->length(); }
        !            82:        bit     r_atEnd() { return index == 0 ; }
        !            83:        lnk*    next();
        !            84:        lnk*    r_next();
        !            85:        lnk*    peek();
        !            86:        lnk*    r_peek();
        !            87:        void    insert(lnk*);
        !            88:        void    r_insert(lnk*);
        !            89:        lnk*    remove();
        !            90:        lnk*    r_remove();
        !            91:        void    reset(int =0);
        !            92:        void    r_reset(int i=0) { reset(aList->length() - i); }
        !            93: };
        !            94: 
        !            95: extern "C" {
        !            96:        extern int abort();
        !            97: }
        !            98: 
        !            99: #define lnnk(type) name2(type,lnnk)
        !           100: #define list(type) name2(type,_list)
        !           101: #define ListHead(type) name2(type,ListHead)
        !           102: #define listiterator(type) name2(type,_list_iterator)
        !           103: #define listsubitem(type) name2(type,listsubitem)
        !           104: #define plist(type) name2(type,P_list)
        !           105: #define plistiterator(type) name2(type,P_list_iterator)
        !           106: #define plistsubitem(type) name2(type,Plistsubitem)
        !           107: #define CMPF(type) name2(type,CMPFN)
        !           108: #define CMPFP(type) name2(type,CMPFNP)
        !           109: 
        !           110: #define listdeclare(type)                                                      \
        !           111: extern GPT errorhandler(list,type);                                            \
        !           112: extern GPT set_handler(list,type,GPT);                                         \
        !           113: extern GPT errorhandler(listiterator,type);                                    \
        !           114: extern GPT set_handler(listiterator,type,GPT);                                 \
        !           115: class list(type);                                                              \
        !           116: class lnnk(type);                                                              \
        !           117: class ListHead(type);                                                          \
        !           118: class listiterator(type);                                                      \
        !           119: class listsubitem(type);                                                       \
        !           120: typedef int    (*CMPF(type))(type&, type&);                                    \
        !           121: ostream&       operator<<(ostream&, list(type)&);                              \
        !           122: class lnnk(type) : public lnk {                                                        \
        !           123:        friend ListHead(type);                                                  \
        !           124:        friend list(type);                                                      \
        !           125:        friend listsubitem(type);                                               \
        !           126:        friend listiterator(type);                                              \
        !           127:        friend ostream& operator<<(ostream&, list(type)&);                      \
        !           128:        friend void voidP_list_sort_internal(voidP_list&, CMPF(voidP));         \
        !           129:        type    val;                                                            \
        !           130:                lnnk(type)(type& pp) : val(pp) {}                               \
        !           131:                ~lnnk(type)() {}                                                \
        !           132: };                                                                             \
        !           133: class ListHead(type) : public LstHead {                                                \
        !           134:        friend list(type);                                                      \
        !           135:                ListHead(type)() {}                                             \
        !           136:                ~ListHead(type)();                                              \
        !           137:        lnnk(type)      *tail() { return (lnnk(type)*)t; }                      \
        !           138:        lnnk(type)      *head() { return (lnnk(type)*)h(); }                    \
        !           139:        bit     firstX(type&);                                                  \
        !           140:        bit     lastX(type&);                                                   \
        !           141: };                                                                             \
        !           142: class list(type) : public List {                                               \
        !           143:        lnnk(type)      *tail() const { return (lnnk(type)*)List::tail(); }     \
        !           144:        lnnk(type)      *head() const { return (lnnk(type)*)List::head(); }     \
        !           145:        void    init() { it = new ListHead(type); it->refCount = 1; }           \
        !           146:        void    sepWork();                                                      \
        !           147: public:                                                                                \
        !           148:        friend ostream& operator<<(ostream&, list(type)&);                      \
        !           149:        friend void voidP_list_sort_internal(voidP_list&, CMPF(voidP));         \
        !           150:                list(type)() { init(); }                                        \
        !           151:                list(type)(list(type)& x) : List(x) {}                          \
        !           152:                ~list(type)() {}                                                \
        !           153:                operator const void*() const { return length() ? this : 0; }    \
        !           154:        bit     operator==(list(type)&) const;                                  \
        !           155:        bit     operator!=(list(type)& x) const { return !(*this == x); }       \
        !           156:        list(type)&     operator=(list(type)& ll) { return (list(type)&)        \
        !           157:                (*(List*)this = (List&)ll); }                                   \
        !           158:        list(type)&     put(type &x) { return   (list(type)&)                   \
        !           159:                                 List::put(new lnnk(type)(x)); }                \
        !           160:        list(type)&     put(list(type)&);       /* append */                    \
        !           161:        list(type)&     operator+=(list(type)& oo) { return put(oo); }          \
        !           162:        list(type)&     operator+=(type& t) { return put(t); }                  \
        !           163:        list(type)      operator+(list(type)& ll) { list(type) ans = *this;     \
        !           164:                                ans += ll; return ans; }                        \
        !           165:        list(type)      operator+(type& t) { list(type) ans = *this;            \
        !           166:                                ans += t; return ans; }                         \
        !           167:        bit     unputX(type &t);                                                \
        !           168:        bit     unput();                                                        \
        !           169:        bit     getX(type&);            /* get */                               \
        !           170:        bit     get();          /* get */                                       \
        !           171:        list(type)&     unget(type &x) { return (list(type)&)                   \
        !           172:                                 List::unget(new lnnk(type)(x)); }              \
        !           173:        list(type)&     unget(list(type)&);     /* prepend */                   \
        !           174:        bit     firstX(type& t) { return                                        \
        !           175:                        ((ListHead(type)*)it)->firstX(t); }                     \
        !           176:        bit     lastX(type& t) { return                                         \
        !           177:                        ((ListHead(type)*)it)->lastX(t); }                      \
        !           178: /* getAt(0) returns the head of the list */                                    \
        !           179:        type    getAt(int ii) { return ((lnnk(type)*)it->getAt(ii))->val; }     \
        !           180:        inline listsubitem(type)        operator[](unsigned ii);                \
        !           181:                list(type)(type& x) { init(); put(x); }                         \
        !           182:                list(type)(type& x, type& y) { init(); put(x); put(y); }        \
        !           183:                list(type)(type& x, type& y, type& z) { init(); put(x); put(y); \
        !           184:                        put(z); }                                               \
        !           185:                list(type)(type& x, type& y, type& z, type& w) { init();        \
        !           186:                        put(x); put(y); put(z); put(w); }                       \
        !           187:        void    sort(CMPF(type));                                               \
        !           188: };                                                                             \
        !           189: class listiterator(type) : public lstiter {                                    \
        !           190:        friend listsubitem(type);                                               \
        !           191:        friend list(type);                                                      \
        !           192: public:                                                                                \
        !           193:                listiterator(type)(list(type)& a, int i=0) :                    \
        !           194:                        lstiter(*(List*)&a, i) {}                               \
        !           195:                listiterator(type)(listiterator(type)& a) :                     \
        !           196:                        lstiter(*(lstiter*)&a) {}                               \
        !           197:                ~listiterator(type)() {}                                        \
        !           198:        listiterator(type)&     operator=(listiterator(type)& a) { return       \
        !           199:                        (listiterator(type)&)(*(lstiter*)this = (lstiter&)a); } \
        !           200:        bit     nextX(type&);                                                   \
        !           201:        bit     nextX(type*&);                                                  \
        !           202:        bit     next() { return lstiter::next() != 0; }                         \
        !           203:        bit     r_nextX(type&);                                                 \
        !           204:        bit     r_nextX(type*&);                                                \
        !           205:        bit     r_next() { return lstiter::r_next() != 0; }                     \
        !           206:        bit     peekX(type&);                                                   \
        !           207:        bit     peekX(type*&);                                                  \
        !           208:        bit     peek() { return !atEnd(); }                                     \
        !           209:        bit     r_peekX(type&);                                                 \
        !           210:        bit     r_peekX(type*&);                                                \
        !           211:        bit     r_peek() { return !r_atEnd(); }                                 \
        !           212: /* remove -- deletes current from list */                                      \
        !           213:        bit     remove();                                                       \
        !           214:        bit     r_remove();                                                     \
        !           215:        bit     removeX(type&);                                                 \
        !           216:        bit     r_removeX(type&);                                               \
        !           217: /* insert -- put it at the left of the pointer */                              \
        !           218:        void    insert(type& x) { lstiter::insert(new lnnk(type)(x)); }         \
        !           219:        void    r_insert(type& x) { lstiter::r_insert(new lnnk(type)(x)); }     \
        !           220:        bit     replace(type&);                                                 \
        !           221:        bit     r_replace(type&);                                               \
        !           222: };                                                                             \
        !           223: class listsubitem(type) : public listiterator(type) {                          \
        !           224: public:                                                                                \
        !           225:        listsubitem(type)(list(type)& t, unsigned i) :                          \
        !           226:                         listiterator(type)(t, i) {}                            \
        !           227:        listsubitem(type)(listsubitem(type)& a) :                               \
        !           228:                listiterator(type)((listiterator(type)&)a) {}                   \
        !           229:        ~listsubitem(type)() {}                                                 \
        !           230:        type&   operator=(type& x) { r_replace(x); return x; }                  \
        !           231:        operator type();                                                        \
        !           232: };                                                                             \
        !           233: inline listsubitem(type)                                                       \
        !           234: list(type)::operator[](unsigned ii)                                            \
        !           235: {                                                                              \
        !           236:        return listsubitem(type)(*this, ii);                                    \
        !           237: }
        !           238: 
        !           239: typedef void*  voidP;
        !           240: listdeclare(voidP)
        !           241: 
        !           242: #define plistdeclare(type)                                                     \
        !           243: extern GPT errorhandler(Plist,type);                                           \
        !           244: extern GPT set_handler(Plist,type,GPT);                                                \
        !           245: extern GPT errorhandler(Plistiterator,type);                                   \
        !           246: extern GPT set_handler(Plistiterator,type,GPT);                                        \
        !           247: class plist(type);                                                             \
        !           248: typedef int    (*CMPFP(type))(type*&, type*&);                                 \
        !           249: ostream&       operator<<(ostream&, plist(type)&);                             \
        !           250: class plistiterator(type);                                                     \
        !           251: class plistsubitem(type);                                                      \
        !           252: class plist(type) : public voidP_list {                                                \
        !           253: public:                                                                                \
        !           254:        friend ostream& operator<<(ostream&, plist(type)&);                     \
        !           255:                plist(type)() {}                                                \
        !           256:                plist(type)(type* x) : voidP_list((voidP) x) {}                 \
        !           257:                plist(type)(type* x, type* y) :                                 \
        !           258:                        voidP_list((voidP) x, (voidP) y) {}                     \
        !           259:                plist(type)(type* x, type* y, type* z) :                        \
        !           260:                                voidP_list((voidP) x, (voidP) y, (voidP) z) {}  \
        !           261:                plist(type)(type* x, type* y, type* z, type* w) :               \
        !           262:                    voidP_list ((voidP) x, (voidP) y, (voidP) z, (voidP) w) {}  \
        !           263:                plist(type)(plist(type)& ll) :                                  \
        !           264:                        voidP_list((voidP_list&) ll) {}                         \
        !           265:                ~plist(type)() {}                                               \
        !           266:                operator const void*() const                                    \
        !           267:                        { return voidP_list::operator void*(); }                \
        !           268:        bit     operator==(plist(type)& ll) { return ((voidP_list&)*this ==     \
        !           269:                        (voidP_list&)ll); }                                     \
        !           270:        plist(type)&    operator=(plist(type)& ll) { return (plist(type)&)      \
        !           271:                ((voidP_list&)*this = (voidP_list&)ll); }                       \
        !           272:        plist(type)     operator+(plist(type)& ll) {                            \
        !           273:                return (plist(type)&)((voidP_list&)*this + (voidP_list&)ll); }  \
        !           274:        plist(type)     operator+(type* t) {                                    \
        !           275:                return (plist(type)&) ((voidP_list&)*this + (voidP)t); }        \
        !           276:        plist(type)&    put(type *t) { return (plist(type)&)                    \
        !           277:                voidP_list::put((voidP)t); }                                    \
        !           278:        plist(type)&    put(plist(type)& ll) { return (plist(type)&)            \
        !           279:                voidP_list::put((voidP_list&)ll); }                             \
        !           280:        plist(type)&    operator+=(plist(type)& oo) { return put(oo); }         \
        !           281:        plist(type)&    operator+=(type* t) { return put(t); }                  \
        !           282:        bit     unputX(type *&t) { return voidP_list::unputX((voidP&)t); }      \
        !           283:        bit     unput() { return voidP_list::unput(); }                         \
        !           284:        bit     getX(type *&t) { return voidP_list::getX((voidP&)t); }          \
        !           285:        bit     get() { return voidP_list::get(); }                             \
        !           286:        plist(type)&    unget(type *x) { return (plist(type)&)                  \
        !           287:                voidP_list::unget((voidP)x); }                                  \
        !           288:        plist(type)&    unget(plist(type)& ll) { return (plist(type)&)          \
        !           289:                voidP_list::unget((voidP_list&)ll); }                           \
        !           290:        bit     firstX(type *&t) { return voidP_list::firstX((voidP&)t); }      \
        !           291:        bit     lastX(type *&t) { return voidP_list::lastX((voidP&)t); }        \
        !           292: /* getAt(0) returns the head of the list */                                    \
        !           293:        type*   getAt(int ii) { return (type *) voidP_list::getAt(ii); }        \
        !           294:        inline plistsubitem(type)       operator[](unsigned ii);                \
        !           295:        void    sort(CMPFP(type) pf) { voidP_list::sort((CMPF(voidP))pf); }     \
        !           296: };                                                                             \
        !           297: class plistiterator(type) : public voidP_list_iterator {                       \
        !           298: public:                                                                                \
        !           299:                plistiterator(type)(plist(type)& a, int i=0) :                  \
        !           300:                                        ((voidP_list&)a, i) {}                  \
        !           301:                plistiterator(type)(plistiterator(type)& a) :                   \
        !           302:                        ((voidP_list_iterator&)a) {}                            \
        !           303:                ~plistiterator(type)() {}                                       \
        !           304:        plistiterator(type)&    operator=(plistiterator(type)& a) { return      \
        !           305:                        (plistiterator(type)&)((voidP_list_iterator&)*this =    \
        !           306:                        (voidP_list_iterator&)a); }                             \
        !           307:        bit     nextX(type *&t) { return                                        \
        !           308:                        voidP_list_iterator::nextX((voidP&)t); }                \
        !           309:        bit     nextX(type **&t) { return                                       \
        !           310:                        voidP_list_iterator::nextX((voidP*&)t); }               \
        !           311:        bit     next() { return voidP_list_iterator::next(); }                  \
        !           312:        bit     r_nextX(type *&t) { return                                      \
        !           313:                        voidP_list_iterator::r_nextX((voidP&)t); }              \
        !           314:        bit     r_nextX(type **&t) { return                                     \
        !           315:                        voidP_list_iterator::r_nextX((voidP*&)t); }             \
        !           316:        bit     r_next() { return voidP_list_iterator::r_next(); }              \
        !           317:        bit     peekX(type *&t) { return                                        \
        !           318:                        voidP_list_iterator::peekX((voidP&)t); }                \
        !           319:        bit     peekX(type **&t) { return                                       \
        !           320:                        voidP_list_iterator::peekX((voidP*&)t); }               \
        !           321:        bit     peek() { return voidP_list_iterator::peek(); }                  \
        !           322:        bit     r_peekX(type *&t) { return                                      \
        !           323:                        voidP_list_iterator::r_peekX((voidP&)t); }              \
        !           324:        bit     r_peekX(type **&t) { return                                     \
        !           325:                        voidP_list_iterator::r_peekX((voidP*&)t); }             \
        !           326:        bit     r_peek() { return voidP_list_iterator::r_peek(); }              \
        !           327:        bit     remove() { return voidP_list_iterator::remove(); }              \
        !           328:        bit     r_remove() { return voidP_list_iterator::r_remove(); }          \
        !           329:        bit     removeX(type *&x) { return                                      \
        !           330:                        voidP_list_iterator::removeX((voidP&)x); }              \
        !           331:        bit     r_removeX(type *&x) { return                                    \
        !           332:                        voidP_list_iterator::r_removeX((voidP&)x); }            \
        !           333:        void    insert(type *&x) { voidP_list_iterator::insert((voidP&)x); }    \
        !           334:        void    r_insert(type *&x) {                                            \
        !           335:                        voidP_list_iterator::r_insert((voidP&)x); }             \
        !           336:        void    replace(type *x) { voidP_list_iterator::replace((voidP)x); }    \
        !           337:        void    r_replace(type *x) {                                            \
        !           338:                        voidP_list_iterator::r_replace((voidP)x); }             \
        !           339: };                                                                             \
        !           340: class plistsubitem(type) : public voidPlistsubitem {                           \
        !           341: public:                                                                                \
        !           342:        plistsubitem(type)(plist(type)& t, int i) :                             \
        !           343:                        voidPlistsubitem ((voidP_list&)t, i) {}                 \
        !           344:        plistsubitem(type)(plistsubitem(type)&ll) :                             \
        !           345:                        voidPlistsubitem ((voidPlistsubitem&)ll){}              \
        !           346:        ~plistsubitem(type)() {}                                                \
        !           347:        type*&  operator=(type *&t) { return                                    \
        !           348:                        (type*&) ((voidPlistsubitem&)*this =(voidP&)t); }       \
        !           349:        operator type*() { return (type*) voidPlistsubitem::operator voidP(); } \
        !           350: };                                                                             \
        !           351: inline                                                                         \
        !           352: plistsubitem(type)                                                             \
        !           353: plist(type)::operator[](unsigned ii)                                           \
        !           354: {                                                                              \
        !           355:        return plistsubitem(type)(*this, ii);                                   \
        !           356: }
        !           357: 
        !           358: 
        !           359: #define listimplement(type)                                                    \
        !           360: GPT errorhandler(list,type) = genericerror;                                    \
        !           361: GPT errorhandler(listiterator,type) = genericerror;                            \
        !           362: bit                                                                            \
        !           363: ListHead(type)::firstX(type& v)                                                        \
        !           364: {                                                                              \
        !           365:        lnnk(type)      *aLink = (lnnk(type) *)LstHead::h();                    \
        !           366:        return aLink ? (v = aLink->val, TRUE) : FALSE;                          \
        !           367: }                                                                              \
        !           368: bit                                                                            \
        !           369: ListHead(type)::lastX(type& v)                                                 \
        !           370: {                                                                              \
        !           371:        lnnk(type)      *aLink = (lnnk(type) *)LstHead::t;                      \
        !           372:        return aLink ? (v = aLink->val, TRUE) : FALSE;                          \
        !           373: }                                                                              \
        !           374: ListHead(type)::~ListHead(type)()                                              \
        !           375: {                                                                              \
        !           376:        lnnk(type)      *temp;                                                  \
        !           377:        while (temp = (lnnk(type) *)LstHead::get())                             \
        !           378:                delete temp;                                                    \
        !           379: }                                                                              \
        !           380: bit                                                                            \
        !           381: listiterator(type)::remove()                                                   \
        !           382: {                                                                              \
        !           383:        lnnk(type)      *aLink = (lnnk(type) *)lstiter::remove();               \
        !           384:        return aLink ? (delete aLink, TRUE) : FALSE;                            \
        !           385: }                                                                              \
        !           386: bit                                                                            \
        !           387: listiterator(type)::removeX(type &x)                                           \
        !           388: {                                                                              \
        !           389:        lnnk(type)      *aLink = (lnnk(type) *)lstiter::remove();               \
        !           390:        return aLink ? (x = aLink->val, delete aLink, TRUE) : FALSE;            \
        !           391: }                                                                              \
        !           392: bit                                                                            \
        !           393: listiterator(type)::r_remove()                                                 \
        !           394: {                                                                              \
        !           395:        lnnk(type)      *aLink = (lnnk(type) *)lstiter::r_remove();             \
        !           396:        return aLink ? (delete aLink, TRUE) : FALSE;                            \
        !           397: }                                                                              \
        !           398: bit                                                                            \
        !           399: listiterator(type)::r_removeX(type &x)                                         \
        !           400: {                                                                              \
        !           401:        lnnk(type)      *aLink = (lnnk(type) *)lstiter::r_remove();             \
        !           402:        return aLink ? (x = aLink->val, delete aLink, TRUE) : FALSE;            \
        !           403: }                                                                              \
        !           404: bit                                                                            \
        !           405: listiterator(type)::nextX(type& t)                                             \
        !           406: {                                                                              \
        !           407:        return atEnd() ? FALSE :                                                \
        !           408:            (t = ((lnnk(type)*)lstiter::next())->val, TRUE);                    \
        !           409: }                                                                              \
        !           410: bit                                                                            \
        !           411: listiterator(type)::nextX(type*& t)                                            \
        !           412: {                                                                              \
        !           413:        return atEnd() ? FALSE :                                                \
        !           414:            (theList()->separate(), t = &((lnnk(type)*)lstiter::next())->val,   \
        !           415:                                TRUE);                                          \
        !           416: }                                                                              \
        !           417: bit                                                                            \
        !           418: listiterator(type)::r_nextX(type& t)                                           \
        !           419: {                                                                              \
        !           420:        return r_atEnd() ? FALSE :                                              \
        !           421:            (t = ((lnnk(type)*)lstiter::r_next())->val, TRUE);                  \
        !           422: }                                                                              \
        !           423: bit                                                                            \
        !           424: listiterator(type)::r_nextX(type*& t)                                          \
        !           425: {                                                                              \
        !           426:        return r_atEnd() ? FALSE :                                              \
        !           427:            (theList()->separate(), t = &((lnnk(type)*)lstiter::r_next())->val, \
        !           428:                                TRUE);                                          \
        !           429: }                                                                              \
        !           430: bit                                                                            \
        !           431: listiterator(type)::r_peekX(type& t)                                           \
        !           432: {                                                                              \
        !           433:        return r_atEnd() ? FALSE :                                              \
        !           434:            (t = ((lnnk(type)*)lstiter::r_peek())->val, TRUE);                  \
        !           435: }                                                                              \
        !           436: bit                                                                            \
        !           437: listiterator(type)::r_peekX(type*& t)                                          \
        !           438: {                                                                              \
        !           439:        return r_atEnd() ? FALSE :                                              \
        !           440:            (theList()->separate(), t = &((lnnk(type)*)lstiter::r_peek())->val, \
        !           441:                                TRUE);                                          \
        !           442: }                                                                              \
        !           443: bit                                                                            \
        !           444: listiterator(type)::peekX(type& t)                                             \
        !           445: {                                                                              \
        !           446:        return atEnd() ? FALSE :                                                \
        !           447:            (t = ((lnnk(type)*)lstiter::peek())->val, TRUE);                    \
        !           448: }                                                                              \
        !           449: bit                                                                            \
        !           450: listiterator(type)::peekX(type*& t)                                            \
        !           451: {                                                                              \
        !           452:        return atEnd() ? FALSE :                                                \
        !           453:            (theList()->separate(), t = &((lnnk(type)*)lstiter::peek())->val,   \
        !           454:                                TRUE);                                          \
        !           455: }                                                                              \
        !           456: bit                                                                            \
        !           457: listiterator(type)::replace(type& x)                                           \
        !           458: {                                                                              \
        !           459:        return r_atEnd() ? FALSE :                                              \
        !           460:            (theList()->separate(), ((lnnk(type)*)lstiter::r_peek())->val = x,  \
        !           461:                                TRUE);                                          \
        !           462: }                                                                              \
        !           463: bit                                                                            \
        !           464: listiterator(type)::r_replace(type& x)                                         \
        !           465: {                                                                              \
        !           466:        return atEnd() ? FALSE :                                                \
        !           467:            (theList()->separate(), ((lnnk(type)*)lstiter::peek())->val = x,    \
        !           468:                                TRUE);                                          \
        !           469: }                                                                              \
        !           470: bit                                                                            \
        !           471: list(type)::operator==(list(type)& x) const                                    \
        !           472: {                                                                              \
        !           473:        if ( length() != x.length() )                                           \
        !           474:                return FALSE;                                                   \
        !           475:        if ( length() == 0 )                                                    \
        !           476:                return TRUE;                                                    \
        !           477:        lnnk(type)      *mine = (lnnk(type) *)head();                           \
        !           478:        lnnk(type)      *yours = (lnnk(type) *)x.head();                        \
        !           479:        for ( int i = length(); i--; )                                          \
        !           480:                if ( mine->val == yours->val ) {                                \
        !           481:                        mine = (lnnk(type) *)mine->nxt;                         \
        !           482:                        yours = (lnnk(type) *)yours->nxt;                       \
        !           483:                } else                                                          \
        !           484:                        return FALSE;                                           \
        !           485:        return TRUE;                                                            \
        !           486: }                                                                              \
        !           487: bit                                                                            \
        !           488: list(type)::getX(type& t)                                                      \
        !           489: {                                                                              \
        !           490:        lnnk(type)      *aLink = (lnnk(type) *)List::get();                     \
        !           491:        return aLink ? (t = aLink->val, delete aLink, TRUE) : FALSE;            \
        !           492: }                                                                              \
        !           493: bit                                                                            \
        !           494: list(type)::get()                                                              \
        !           495: {                                                                              \
        !           496:        lnnk(type)      *aLink = (lnnk(type) *)List::get();                     \
        !           497:        return aLink ? (delete aLink, TRUE) : FALSE;                            \
        !           498: }                                                                              \
        !           499: bit                                                                            \
        !           500: list(type)::unputX(type& t)                                                    \
        !           501: {                                                                              \
        !           502:        lnnk(type)      *aLink = (lnnk(type) *)List::unput();                   \
        !           503:        return aLink ? (t = aLink->val, delete aLink, TRUE) : FALSE;            \
        !           504: }                                                                              \
        !           505: bit                                                                            \
        !           506: list(type)::unput()                                                            \
        !           507: {                                                                              \
        !           508:        lnnk(type)      *aLink = (lnnk(type) *)List::unput();                   \
        !           509:        return aLink ? (delete aLink, TRUE) : FALSE;                            \
        !           510: }                                                                              \
        !           511: list(type)&                                                                    \
        !           512: list(type)::put(list(type)& a)                                                 \
        !           513: {                                                                              \
        !           514:        if (a.length()) {                                                       \
        !           515:                type    t;                                                      \
        !           516:                listiterator(type)      ita(a);                                 \
        !           517:                while (ita.nextX(t))                                            \
        !           518:                        put(t);                                                 \
        !           519:        }                                                                       \
        !           520:        return *this;                                                           \
        !           521: }                                                                              \
        !           522: list(type)&                                                                    \
        !           523: list(type)::unget(list(type)& a)                                               \
        !           524: {                                                                              \
        !           525:        if (a.length()) {                                                       \
        !           526:                type    t;                                                      \
        !           527:                listiterator(type)      ita(a);                                 \
        !           528:                ita.r_reset();                                                  \
        !           529:                while (ita.r_nextX(t))                                          \
        !           530:                        unget(t);                                               \
        !           531:        }                                                                       \
        !           532:        return *this;                                                           \
        !           533: }                                                                              \
        !           534: listsubitem(type)::operator type()                                             \
        !           535: {                                                                              \
        !           536:        type    t;                                                              \
        !           537:        peekX(t);                                                               \
        !           538:        return t;                                                               \
        !           539: }                                                                              \
        !           540: void                                                                           \
        !           541: list(type)::sepWork()                                                          \
        !           542: {                                                                              \
        !           543:        it->refCount--;                                                         \
        !           544:        ListHead(type)  *newLst = new ListHead(type);                           \
        !           545:        if (tail()) {                                                           \
        !           546:                for (lnnk(type) *oldLnk = (lnnk(type) *)head();;                \
        !           547:                                oldLnk = (lnnk(type) *)oldLnk->nxt) {           \
        !           548:                        lnnk(type)      *newLnk;                                \
        !           549:                        newLst->put(newLnk = new lnnk(type)(oldLnk->val));      \
        !           550:                        /* only be one or two listiterators (I hope) */         \
        !           551:                        for (listiterator(type) *anIt =                         \
        !           552:                            (listiterator(type) *)firstIt(); anIt;              \
        !           553:                            anIt = (listiterator(type) *)anIt->nextIt) {        \
        !           554:                                if (anIt->pred == oldLnk) {                     \
        !           555:                                        anIt->pred = newLnk;                    \
        !           556:                                }                                               \
        !           557:                        }                                                       \
        !           558:                        if ( oldLnk == tail() )                                 \
        !           559:                                break;                                          \
        !           560:                }                                                               \
        !           561:        }                                                                       \
        !           562:        it = newLst;                                                            \
        !           563:        it->refCount = 1;                                                       \
        !           564: }                                                                              \
        !           565: void                                                                           \
        !           566: list(type)::sort(CMPF(type) cmp)                                               \
        !           567: {                                                                              \
        !           568:        if (length() < 2) return;                                               \
        !           569:        separate();                                                             \
        !           570:        voidP_list_sort_internal(*(voidP_list*)this, (CMPF(voidP))cmp);         \
        !           571:        for (listiterator(type) *anIt =                                         \
        !           572:            (listiterator(type) *)firstIt(); anIt;                              \
        !           573:            anIt = (listiterator(type) *)anIt->nextIt)                          \
        !           574:                anIt->reset();                                                  \
        !           575: }
        !           576: 
        !           577: #define listoutimplement(type)                                                 \
        !           578: ostream&                                                                       \
        !           579: operator<<(ostream& oo, list(type)& ll)                                                \
        !           580: {                                                                              \
        !           581:        oo<<"(";                                                                \
        !           582:        if ( ll.length() ) {                                                    \
        !           583:                listiterator(type)      it(ll);                                 \
        !           584:                type    t;                                                      \
        !           585:                it.nextX(t);                                                    \
        !           586:                oo<<t;                                                          \
        !           587:                while (it.nextX(t))                                             \
        !           588:                        oo << " " << t;                                         \
        !           589:        } else                                                                  \
        !           590:                oo<<"EMPTYLIST";                                                \
        !           591:        oo<<")";                                                                \
        !           592:        return oo;                                                              \
        !           593: }
        !           594: 
        !           595: #endif
        !           596: 
        !           597: #define plistimplement(type)                                                   \
        !           598: GPT errorhandler(Plist,type) = genericerror;                                   \
        !           599: GPT errorhandler(Plistiterator,type) = genericerror;
        !           600: 
        !           601: #define plistoutimplement(type)                                                        \
        !           602: ostream&       operator<<(ostream& oo, plist(type)& ll)                        \
        !           603: {                                                                              \
        !           604:        oo<<"(";                                                                \
        !           605:        if ( ll.length() ) {                                                    \
        !           606:                plistiterator(type)     it(ll);                                 \
        !           607:                type    *t;                                                     \
        !           608:                it.nextX(t);                                                    \
        !           609:                oo<<t;                                                          \
        !           610:                while (it.nextX(t))                                             \
        !           611:                        oo << " " << t;                                         \
        !           612:        } else                                                                  \
        !           613:                oo<<"EMPTYLIST";                                                \
        !           614:        oo<<")";                                                                \
        !           615:        return oo;                                                              \
        !           616: }
        !           617: 

unix.superglobalmegacorp.com

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