Annotation of researchv10no/ipc/mgrs/ns/ordered.c, revision 1.1

1.1     ! root        1: #include <fio.h>
        !             2: #include <string.h>
        !             3: #include <libc.h>
        !             4: #include "dbtypes.h"
        !             5: 
        !             6: #define MAXDEPTH 32
        !             7: 
        !             8: /*
        !             9:  *  free the pointer list
        !            10:  */
        !            11: Ordered::~Ordered()
        !            12: {
        !            13:        if(ptr) {
        !            14:                free((char *)ptr);
        !            15:        }
        !            16: }
        !            17: 
        !            18: /*
        !            19:  *  Create the head of an ordered list.  It has `l' pointers and all
        !            20:  *  point nowhere.
        !            21:  */
        !            22: Ordered::Ordered(int l)
        !            23: {
        !            24:        int i;
        !            25: 
        !            26:        if(l>MAXDEPTH)
        !            27:                l = MAXDEPTH;
        !            28:        level = l-1;
        !            29:        ptr = (Ordered **)malloc(l*sizeof(Ordered *));
        !            30:        for(i=0; i<l; i++)
        !            31:                ptr[i] = (Ordered *)0;
        !            32: }
        !            33: 
        !            34: /*
        !            35:  *  insert a node into a list
        !            36:  */
        !            37: void
        !            38: Ordered::insert(Ordered *o)
        !            39: {
        !            40:        register Ordered *cp;
        !            41:        register int i;
        !            42:        Ordered *cptr[MAXDEPTH];
        !            43: 
        !            44:        /*
        !            45:         *  start all search pointers at the list head
        !            46:         */
        !            47:        cptr[o->level] = o;
        !            48: 
        !            49:        /*
        !            50:         *  find the last entry <= this one
        !            51:         */
        !            52:        for(i=o->level; i>=0; i--){
        !            53:                while(cp=cptr[i]->ptr[i]){
        !            54:                        if(cp->compare(this)>0)
        !            55:                                break;
        !            56:                        cptr[i] = cp;
        !            57:                }
        !            58:                if(i>0)
        !            59:                        cptr[i-1] = cptr[i];
        !            60:        }
        !            61: 
        !            62:        /*
        !            63:         *  pick a depth 
        !            64:         */
        !            65:        level = o->level+1;
        !            66:        i = nrand((1<<level)-1)+1;
        !            67:        for(; i; i = i>>1)
        !            68:                level--;
        !            69: 
        !            70:        /*
        !            71:         *  chain it after current nodes
        !            72:         */
        !            73:        ptr = (Ordered **)malloc((level+1)*sizeof(Ordered *));
        !            74:        for(i=0; i<=level; i++) {
        !            75:                ptr[i] = cptr[i]->ptr[i];
        !            76:                cptr[i]->ptr[i] = this;
        !            77:        }
        !            78: }
        !            79: 
        !            80: /*
        !            81:  *  search an ordered list
        !            82:  */
        !            83: Ordered *
        !            84: Ordered::search(Ordered *o)
        !            85: {
        !            86:        register int i, rv;
        !            87:        Ordered *cptr[MAXDEPTH];
        !            88: 
        !            89:        /*
        !            90:         *  start all search pointers at the list head
        !            91:         */
        !            92:        cptr[o->level] = o;
        !            93: 
        !            94:        /*
        !            95:         *  Find the first entry matching this key.  Note that
        !            96:         *  we return only if we find a match at level 0.  Otherwise
        !            97:         *  we may not find the first match.
        !            98:         */
        !            99:        for(i=o->level; i>=0; i--){
        !           100:                while(cptr[i]->ptr[i]){
        !           101:                        rv = cptr[i]->ptr[i]->compare(this);
        !           102:                        if(rv==0 && i==0)
        !           103:                                return cptr[i]->ptr[i];
        !           104:                        if(rv>=0)
        !           105:                                break;
        !           106:                        cptr[i] = cptr[i]->ptr[i];
        !           107:                }
        !           108:                if(i>0)
        !           109:                        cptr[i-1] = cptr[i];
        !           110:        }
        !           111: 
        !           112:        return (Ordered *)0;
        !           113: }
        !           114: 
        !           115: /*
        !           116:  *  output an ordered list
        !           117:  */
        !           118: void
        !           119: Ordered::printlist(int fd)
        !           120: {
        !           121:        Ordered *o;
        !           122: 
        !           123:        for(o=ptr[0]; o; o=o->ptr[0]){
        !           124:                Fprint(fd, "%d: ", o->level);
        !           125:                o->print(fd);
        !           126:                Fprint(fd, "\n");
        !           127:        }
        !           128: }
        !           129: 
        !           130: /*
        !           131:  *  output an ordered list element
        !           132:  */
        !           133: void
        !           134: Ordered::print(int fd)
        !           135: {
        !           136:        Fprint(fd, "element");
        !           137: }
        !           138: 
        !           139: /*
        !           140:  *  compare two ordered list elements
        !           141:  */
        !           142: int
        !           143: Ordered::compare(Ordered *o)
        !           144: {
        !           145:        return o-this;
        !           146: }

unix.superglobalmegacorp.com

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