samples/effectivelist/src/org/apidesign/effectivelist/List.scala
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 30 Oct 2014 21:30:10 +0100
changeset 409 40cabcdcd2be
parent 402 e25dbfce40e9
permissions -rw-r--r--
Updating to NBMs from NetBeans 8.0.1 as some of them are required to run on JDK8
     1 package org.apidesign.effectivelist
     2 
     3 /** 
     4  * Implementation of add and remove efficient list. It has just one
     5  * restriction - its items need to carry additional information to help
     6  * the list to be effective. All items must extend trait {@link Listable}:
     7  * <pre>
     8  * <b>case class</b> Person(name : String) <b>extends</b> Listable[Person]
     9  * </pre>
    10  */
    11 // BEGIN: effectivelist.list
    12 final class List[T <: Listable[T]] {
    13   private var item : T = _
    14   private final var EMPTY : T = _
    15   
    16   final def get(index : Int) : T = {
    17     var pos : T = item;
    18     for (i <- 1 to index) {
    19       pos = pos.next;
    20       if (pos == item) {
    21         throw new IndexOutOfBoundsException()
    22       }
    23     }
    24     return pos
    25   }
    26   
    27   final def size() : Int = {
    28     if (item == EMPTY) {
    29       return 0
    30     }
    31     var size = 0
    32     var pos : T = item
    33     do {
    34       size = size + 1
    35       pos = pos.next
    36     } while (pos != item)
    37     return size
    38   }
    39   
    40   final def add(toAdd : T) : Boolean = {
    41     if (toAdd.prev != EMPTY) {
    42       return false
    43     }
    44     
    45     if (item == null) {
    46       item = toAdd
    47       toAdd.next = toAdd
    48       toAdd.prev = toAdd
    49       return true
    50     } else {
    51       toAdd.prev = item.prev
    52       item.prev.next = toAdd
    53       item.prev = toAdd
    54       toAdd.next = item
    55       return true
    56     }
    57   }
    58   final def remove(toRemove : T) : Boolean = {
    59     if (toRemove.prev == EMPTY) {
    60       return false
    61     } else {
    62       toRemove.prev.next = toRemove.next
    63       toRemove.next.prev = toRemove.prev;
    64       if (item.next == item) {
    65         item = EMPTY
    66       }
    67       if (item == toRemove) {
    68         item = toRemove.next
    69       }
    70       toRemove.next = EMPTY
    71       toRemove.prev = EMPTY
    72       return true
    73     }
    74   }
    75 }
    76 // END: effectivelist.list