home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 4 / AACD04.ISO / AACD / Programming / lsEstuff / nmIoList.e < prev    next >
Encoding:
Text File  |  1999-10-17  |  3.2 KB  |  137 lines

  1. OPT MODULE
  2.  
  3. MODULE 'leifoo/nm'
  4. MODULE 'leifoo/nmIList'
  5.  
  6. EXPORT OBJECT nmIoList OF nmIList ; ENDOBJECT
  7.  
  8. PROC oFind(id) OF nmIoList
  9.    DEF first:PTR TO nmI
  10.    DEF last:PTR TO nmI
  11.    DEF beg
  12.    DEF end
  13.    first := self.first()
  14.    last := self.last()
  15.    beg := id - first.id
  16.    end := last.id - id
  17.    IF (end < 0) OR (beg < 0)THEN RETURN NIL
  18.    IF end <= beg THEN RETURN self.findR(id)
  19. ENDPROC self.find(id)
  20.  
  21. PROC sort() OF nmIoList IS bubble(self)
  22.  
  23. PROC bubble(nmIoList:PTR TO nmIoList)
  24.    DEF n:PTR TO nmI
  25.    DEF nnext:PTR TO nmI
  26.    DEF useful
  27.    REPEAT
  28.       n := nmIoList.first()
  29.       useful := FALSE
  30.       WHILE n
  31.          nnext := n.next
  32.          IF nnext
  33.             IF n.id > nnext.id
  34.                nmIoList.remove(n)
  35.                nmIoList.insert(n, nnext)
  36.                useful := TRUE
  37.             ENDIF
  38.             n := n.next
  39.          ELSE
  40.             n := NIL
  41.          ENDIF
  42.       ENDWHILE
  43.    UNTIL useful = FALSE
  44. ENDPROC
  45.  
  46. PROC oInsert(nmI:PTR TO nmI) OF nmIoList
  47.    DEF n:PTR TO nmI
  48.    n := self.first()
  49.    IF n = NIL THEN RETURN self.addFirst(nmI)
  50.    IF n.id > nmI.id THEN RETURN self.addFirst(nmI)
  51.    WHILE n.id < nmI.id
  52.       n := n.next
  53.       IF n = NIL THEN RETURN self.addLast(nmI)
  54.    ENDWHILE
  55.    self.insert(nmI, n.prev)
  56. ENDPROC nmI
  57.  
  58. PROC cmpMap(nmIoList:PTR TO nmIoList) OF nmIoList
  59.    DEF thisnode:PTR TO nmI
  60.    DEF thatnode:PTR TO nmI
  61.    thisnode := self.first()
  62.    thatnode := nmIoList.first()
  63.    WHILE (thisnode OR thatnode)
  64.       IF thisnode.id <> thatnode.id THEN RETURN FALSE
  65.       thisnode := thisnode.next
  66.       thatnode := thatnode.next
  67.    ENDWHILE
  68. ENDPROC TRUE
  69.  
  70. /* merge two sorted lists into one */
  71. /* damn.. it seems a little complicated..  */
  72. /* does it have to be that much code ? */
  73. PROC oListMerge(oListToInsert:PTR TO nmIoList) OF nmIoList
  74.    DEF thisnode:PTR TO nmI
  75.    DEF thatnode:PTR TO nmI
  76.    thisnode := self.first()
  77.    thatnode := oListToInsert.first()
  78.    WHILE thatnode
  79.       IF thisnode
  80.          IF thisnode.id > thatnode.id
  81.             IF thisnode.prev
  82.                self.insert(thatnode, thisnode.prev)
  83.             ELSE
  84.                self.addFirst(thatnode)
  85.             ENDIF
  86.             thatnode := thatnode.next
  87.          ELSEIF thisnode.id = thatnode.id
  88.             self.insert(thatnode, thisnode)
  89.             thisnode := thisnode.next
  90.             thatnode := thatnode.next
  91.          ELSE -> thisnode.id < thatnode.id
  92.             thisnode := thisnode.next
  93.          ENDIF
  94.       ELSE
  95.          self.addLast(thatnode)
  96.          thatnode := thatnode.next
  97.       ENDIF
  98.    ENDWHILE
  99. ENDPROC
  100.  
  101. /* this one.. I dont know.. where do I get the ideas ? */
  102. PROC callProcCmpIDLists(eqproc, lesproc, bigproc, l1:PTR TO nmIoList, l2:PTR TO nmIoList)
  103.    DEF n1:PTR TO nmI
  104.    DEF n2:PTR TO nmI
  105.    n1 := l1.first()
  106.    n2 := l2.first()
  107.    WHILE n1 OR n2
  108.       IF n1.id > n2.id
  109.          bigproc(n1, n2)
  110.          n2 := n2.next
  111.       ELSEIF n1.id = n2.id
  112.          eqproc(n1, n2)
  113.          n1 := n1.next
  114.          n2 := n2.next
  115.       ELSE
  116.          lesproc(n1, n2)
  117.          n1 := n1.next
  118.       ENDIF
  119.    ENDWHILE
  120. ENDPROC
  121.  
  122. /* well.. its ordered .. right ? */
  123. PROC oGetMaxID() OF nmIoList
  124.    DEF n:PTR TO nmI
  125.    n := self.last()
  126.    IF n = NIL THEN RETURN NIL
  127. ENDPROC n.id
  128.  
  129. PROC oGetMinID() OF nmIoList
  130.    DEF n:PTR TO nmI
  131.    n := self.first()
  132.    IF n = NIL THEN RETURN NIL
  133. ENDPROC n.id
  134.  
  135.  
  136.  
  137.