home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 4 / AACD04.ISO / AACD / Programming / lsEstuff / oldarraystuff / xliv.e < prev   
Encoding:
Text File  |  1999-09-16  |  5.7 KB  |  259 lines

  1. OPT MODULE
  2.  
  3. MODULE '*xli'
  4.  
  5. -> alla newArray#? behöver denna!!
  6.  
  7. EXPORT OBJECT xliv OF xli
  8. ENDOBJECT
  9.  
  10. EXPORT OBJECT xniv OF xni
  11.    value
  12. ENDOBJECT
  13.  
  14. ->OBJECT xnivMem
  15.  
  16.  
  17.  
  18.  
  19. PROC create_xniv(id) OF xliv
  20.    DEF xniv:PTR TO xniv
  21.    xniv := self.addTailFastNew(SIZEOF xniv)
  22.    xniv.id := id
  23. ENDPROC xniv
  24.  
  25. PROC delete_xniv(xniv:PTR TO xniv) OF xliv
  26.    self.fastDispose(xniv, SIZEOF xniv)
  27. ENDPROC
  28.  
  29. PROC getMaxVal() OF xliv
  30.    DEF n:PTR TO xniv, val=$80000000
  31.    n := self.first()
  32.    WHILE n
  33.       val := Max(val, n.value)
  34.       n := n.next
  35.    ENDWHILE
  36. ENDPROC val
  37.  
  38. PROC getMinVal() OF xliv
  39.    DEF n:PTR TO xniv, val=$40000000
  40.    n := self.first()
  41.    WHILE n
  42.       val := Min(val, n.value)
  43.       n := n.next
  44.    ENDWHILE
  45. ENDPROC val
  46.  
  47.  
  48. PROC getSumVal() OF xliv
  49.    DEF n:REG PTR TO xniv, val:REG
  50.    val:=NIL
  51.    n := self.first()
  52.    WHILE n
  53.       val := val + n.value
  54.       n := n.next
  55.    ENDWHILE
  56. ENDPROC val
  57.  
  58. PROC exchangeVal(id1, id2) OF xliv
  59.    DEF cn:REG PTR TO xniv
  60.    DEF n1:REG PTR TO xniv
  61.    DEF n2:REG PTR TO xniv
  62.    DEF temp
  63.    cn := self.first()
  64.    n1 := NIL
  65.    n2 := NIL
  66.    WHILE cn
  67.       IF cn.id = id1 THEN n1 := cn
  68.       IF cn.id = id2 THEN n2 := cn
  69.       IF n1
  70.        IF n2
  71.           temp := n1.value
  72.           n1.value := n2.value
  73.           n2.value := temp
  74.           RETURN 1
  75.        ENDIF
  76.       ENDIF
  77.       cn := cn.next
  78.    ENDWHILE
  79. ENDPROC NIL
  80.  
  81. PROC absAllVals() OF xliv
  82.    DEF n:REG PTR TO xniv
  83.    n := self.first()
  84.    WHILE n
  85.       n.value := Abs(n.value)
  86.       n := n.next
  87.    ENDWHILE
  88. ENDPROC
  89.  
  90. PROC notAllVals() OF xliv
  91.    DEF n:REG PTR TO xniv
  92.    n := self.first()
  93.    WHILE n
  94.       n.value := Not(n.value)
  95.       n := n.next
  96.    ENDWHILE
  97. ENDPROC
  98.  
  99. /* typically it could be called from a */
  100. /* background task periodically.. at LOW pri..*/
  101. PROC removeNILValueNodes() OF xliv
  102.    DEF n:REG PTR TO xniv
  103.    n := self.first()
  104.    WHILE n
  105.       IF n.value = NIL THEN self.delete_xniv(n)
  106.       n := n.next
  107.    ENDWHILE
  108. ENDPROC
  109.  
  110.  
  111. /* nodes in self gets its values from */
  112. /* nodes with the same id from the list supplied */
  113. /* nodes not present in this list but in the other */
  114. /* gets created ... it ofcource skips possible NIL nodes..*/
  115. PROC applyAllValuesFromXLIV(xliv:PTR TO xliv) OF xliv
  116.    DEF thisnode:REG PTR TO xniv
  117.    DEF thatnode:REG PTR TO xniv
  118.    thisnode
  119.    thatnode := xliv.first()
  120.    WHILE (thatnode)
  121.       IF thatnode.value <> NIL
  122.          thisnode := self.find(thatnode.id)
  123.          IF thisnode = NIL THEN thisnode := self.create_xniv(thatnode.id)
  124.          thisnode.value := thatnode.value
  125.       ENDIF
  126.       thatnode := thatnode.next
  127.    ENDWHILE
  128. ENDPROC
  129.  
  130. /* same as above, except only nodes with id:s */
  131. /* not found in self gets their value-field copied */
  132. PROC applyNewValuesFromXLIV(xliv:PTR TO xliv) OF xliv
  133.    DEF thisnode:REG PTR TO xniv
  134.    DEF thatnode:REG PTR TO xniv
  135.    thisnode
  136.    thatnode := xliv.first()
  137.    WHILE (thatnode)
  138.       IF thatnode.value <> NIL
  139.          thisnode := self.find(thatnode.id)
  140.          IF thisnode = NIL
  141.             thisnode := self.create_xniv(thatnode.id)
  142.             thisnode.value := thatnode.value
  143.          ENDIF
  144.       ENDIF
  145.       thatnode := thatnode.next
  146.    ENDWHILE
  147. ENDPROC
  148.  
  149. /* just adds amount to every nodes id-field */
  150. /* amount may ofcource be negative */
  151. PROC scrollAllNodeIDs(amount) OF xliv
  152.    DEF n:REG PTR TO xniv
  153.    DEF v:REG
  154.    v := amount
  155.    n := self.first()
  156.    WHILE n
  157.       n.id := (n.id) + v
  158.       n := n.next
  159.    ENDWHILE
  160. ENDPROC
  161.  
  162. /* positions not existing in self but */
  163. /* in the other list gets created and cpoied */
  164. /* ofcource ..:) */
  165. PROC valueAdditionFromXLIV(xliv:PTR TO xliv) OF xliv
  166.    DEF thisnode:REG PTR TO xniv
  167.    DEF thatnode:REG PTR TO xniv
  168.    thisnode
  169.    thatnode := xliv.first()
  170.    WHILE (thatnode)
  171.       IF thatnode.value <> NIL
  172.          thisnode := self.find(thatnode.id)
  173.          IF thisnode = NIL
  174.             thisnode := self.create_xniv(thatnode.id)
  175.             thisnode.value := thatnode.value
  176.          ELSE
  177.             thisnode.value := (thisnode.value) + thatnode.value
  178.          ENDIF
  179.       ENDIF
  180.       thatnode := thatnode.next
  181.    ENDWHILE
  182. ENDPROC
  183.  
  184. PROC valueSubtractionFromXLIV(xliv:PTR TO xliv) OF xliv
  185.    DEF thisnode:REG PTR TO xniv
  186.    DEF thatnode:REG PTR TO xniv
  187.    thisnode
  188.    thatnode := xliv.first()
  189.    WHILE (thatnode)
  190.       IF thatnode.value <> NIL
  191.          thisnode := self.find(thatnode.id)
  192.          IF thisnode = NIL
  193.             thisnode := self.create_xniv(thatnode.id)
  194.             thisnode.value := thatnode.value
  195.          ELSE
  196.             thisnode.value := (thisnode.value) - thatnode.value
  197.          ENDIF
  198.       ENDIF
  199.       thatnode := thatnode.next
  200.    ENDWHILE
  201. ENDPROC
  202.  
  203. EXPORT OBJECT xlivProcArgObj
  204.    pos
  205.    value
  206. ENDOBJECT
  207.  
  208. /* I LIKE IT!! := */
  209. PROC callProcForEachNode(proc, obj:PTR TO xlivProcArgObj) OF xliv
  210.    DEF n:PTR TO xniv
  211.    n := self.first()
  212.    WHILE n
  213.       obj.pos := n.id
  214.       obj.value := n.value
  215.       proc(obj)
  216.       n := n.next
  217.    ENDWHILE
  218. ENDPROC
  219.  
  220. /* moves (changes the id-field) */
  221. /* of a node. If new id already exists */
  222. /* the node of that will dissapear! */
  223. /* steps may be negative */
  224. PROC moveNodeByID(id, steps) OF xliv
  225.    DEF n:PTR TO xniv
  226.    DEF myself=NIL:PTR TO xniv
  227.    DEF newID
  228.    IF steps = NIL THEN RETURN NIL
  229.    newID := id + steps
  230.    n := self.first()
  231.    WHILE n
  232.       IF n.id = newID THEN self.delete_xniv(n)
  233.       IF n.id = id THEN myself := n
  234.       n := n.next
  235.    ENDWHILE
  236.    IF myself = NIL THEN RETURN NIL
  237.    myself.id := newID  
  238. ENDPROC myself
  239.  
  240. PROC scrollIDsFromNodeID(nodeID, steps) OF xliv
  241.    DEF n:REG PTR TO xniv
  242.    DEF id:REG
  243.    IF steps = NIL THEN RETURN NIL
  244.    id := nodeID
  245.    n := self.first()
  246.    IF steps < 0
  247.       WHILE n
  248.          IF n.id <= id THEN n.id := (n.id) + steps
  249.          n := n.next
  250.       ENDWHILE
  251.    ELSE
  252.       WHILE n
  253.          IF n.id >= id THEN n.id := (n.id) + steps
  254.          n := n.next
  255.       ENDWHILE
  256.    ENDIF
  257. ENDPROC
  258.  
  259.