DoubleLinkedList.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 3920 6197499978a0
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3920
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2016 by eXept Software AG
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ NameSpace: Smalltalk }"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
LinkedList subclass:#DoubleLinkedList
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:''
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Collections-Linked'
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!DoubleLinkedList class methodsFor:'documentation'!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
copyright
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 COPYRIGHT (c) 2016 by eXept Software AG
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
              All Rights Reserved
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 This software is furnished under a license and may be used
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 only in accordance with the terms of that license and with the
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 be provided or otherwise made available to, or used by, any
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 other person.  No title to or ownership of the software is
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 hereby transferred.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
examples
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
                                                                        [exBegin]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    |l|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    l addLast:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    l addLast:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    l addLast:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    l addLast:'four'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    l inspect
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
                                                                        [exEnd]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
                                                                        [exBegin]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    |l|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    l := LinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    l addLast:(ValueDoubleLink new value:'one').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    l addLast:(ValueDoubleLink new value:'two').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    l addLast:(ValueDoubleLink new value:'three').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    l addLast:(ValueDoubleLink new value:'four').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    (l at:3) value inspect.        'slow operation for large lists'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
                                                                        [exEnd]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
                                                                        [exBegin]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    |l link|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    l := LinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    l addLast:(ValueDoubleLink new value:'one').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    l addLast:(ValueDoubleLink new value:'two').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    l addLast:(ValueDoubleLink new value:'three').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    l addLast:(ValueDoubleLink new value:'four').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    link := l removeFirst.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    l addLast:link.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    l inspect.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
                                                                        [exEnd]
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
! !
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!DoubleLinkedList methodsFor:'adding & removing'!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
add:aLinkOrAnyOtherObject
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    "adds aLink to the end of the sequence. Returns aLink"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    |newLink|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    newLink := aLinkOrAnyOtherObject asDoubleLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    newLink nextLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    newLink previousLink:lastLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    lastLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
        firstLink := newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    ] ifFalse: [
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
        lastLink nextLink:newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    lastLink := newLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    numberOfNodes := numberOfNodes + 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    ^ newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
     |l e1 e2|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
     e2 := l add:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
     self assert:(l lastLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
     self assert:(e2 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
add:aLinkOrAnyOtherObject after:aLinkOrValue
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    |linkToAddAfter newLink this nextLink|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    aLinkOrValue asDoubleLink == aLinkOrValue ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
        linkToAddAfter := aLinkOrValue
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
        this := firstLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
        [this notNil and:[this value ~~ aLinkOrAnyOtherObject]] whileTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
            this := this nextLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
        this isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
            ^ self addLast:aLinkOrAnyOtherObject
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
        linkToAddAfter := this.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    newLink := aLinkOrAnyOtherObject asDoubleLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
    newLink nextLink:(nextLink := linkToAddAfter nextLink).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    newLink previousLink:linkToAddAfter.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    linkToAddAfter nextLink:newLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    nextLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
        lastLink := newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
        nextLink previousLink:newLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    numberOfNodes := numberOfNodes + 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    ^ newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
     |l e1 e2 e3 e2_5 e4|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
     e2 := l add:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
     e3 := l add:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
     e2_5 := l add:'twoPointFife' after:e2.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
     self assert:(e2 nextLink == e2_5).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
     self assert:(e2_5 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
     self assert:(e3 previousLink == e2_5).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
     self assert:(e2_5 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
     e4 := l add:'four' after:e3.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
     self assert:(e2 nextLink == e2_5).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
     self assert:(e2_5 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
     self assert:(e3 nextLink == e4).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
     self assert:(e4 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
     self assert:(l lastLink == e4).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
     self assert:(e4 previousLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
     self assert:(e3 previousLink == e2_5).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
     self assert:(e2_5 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
addFirst:aLinkOrAnyOtherObject
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    "adds aLink to the beginning of the sequence. Returns aLink"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    |newLink|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    newLink := aLinkOrAnyOtherObject asDoubleLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    newLink nextLink:firstLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    firstLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
        lastLink := newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    ] ifFalse: [
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
        firstLink previousLink:newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    firstLink := newLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    numberOfNodes := numberOfNodes + 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    ^ newLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
     |l e1 e0|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
     e0 := l addFirst:'zero'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
     self assert:(l firstLink == e0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
     self assert:(l lastLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
     self assert:(e0 nextLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
     self assert:(e1 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
     self assert:(e0 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
     self assert:(e1 previousLink == e0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
remove:aLinkOrValue ifAbsent:exceptionBlock
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    "remove the argument, aLinkOrValue from the sequence and return it;
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
     if absent, evaluate the exceptionBlock."
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    |linkToRemove this nextLink previousLink|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    aLinkOrValue asDoubleLink == aLinkOrValue ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
        linkToRemove := aLinkOrValue
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
        this := firstLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        [this notNil and:[this value ~= aLinkOrValue]] whileTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
            this := this nextLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
        this isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
            ^ exceptionBlock value
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
        linkToRemove := this.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    nextLink := linkToRemove nextLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    previousLink := linkToRemove previousLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    nextLink notNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
        nextLink previousLink:previousLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
        lastLink := previousLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    previousLink notNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
        previousLink nextLink:nextLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
        firstLink := nextLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    numberOfNodes := numberOfNodes - 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    ^ linkToRemove
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
     |l e1 e2 e3 e2_5 e4|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
     e2 := l add:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
     e3 := l add:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
     l remove:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
     self assert:(e1 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
     self assert:(e3 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
     l remove:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
     self assert:(l firstLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
     self assert:(e3 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
     l remove:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
     self assert:(l size == 0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
removeFirst
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
    "remove and return the first node from the sequence"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    |link|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    firstLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
        ^ self emptyCollectionError
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    link := firstLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    firstLink := firstLink nextLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    firstLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
        lastLink := nil
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
    ] ifFalse:[ 
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
        firstLink previousLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    ].        
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    link nextLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
    link previousLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    numberOfNodes := numberOfNodes - 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    ^ link
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
     |l v1 v2 v3 e1 e2 e3 e2_5 e4|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
     e2 := l add:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
     e3 := l add:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
     l removeFirst.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
     self assert:(l firstLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
     self assert:(e2 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
     l removeFirst.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
     self assert:(l firstLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
     self assert:(e3 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
     l removeFirst.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
     self assert:(l size == 0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
removeIdentical:aLinkOrValue ifAbsent:exceptionBlock
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    "remove the argument, aLinkOrValue from the sequence and return it;
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
     if absent, evaluate the exceptionBlock."
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
    |linkToRemove this nextLink previousLink|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
    aLinkOrValue asDoubleLink == aLinkOrValue ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
        linkToRemove := aLinkOrValue
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
        this := firstLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
        [this notNil and:[this value ~~ aLinkOrValue]] whileTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
            this := this nextLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
        this isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
            ^ exceptionBlock value
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
        ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
        linkToRemove := this.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    nextLink := linkToRemove nextLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    previousLink := linkToRemove previousLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    nextLink notNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
        nextLink previousLink:previousLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
        lastLink := previousLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    previousLink notNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
        previousLink nextLink:nextLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
    ] ifFalse:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
        firstLink := nextLink
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
    numberOfNodes := numberOfNodes - 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
    ^ linkToRemove
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
     |l v1 v2 v3 e1 e2 e3 e2_5 e4|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
     e1 := l add:(v1 := 'one').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
     e2 := l add:(v2 := 'two').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
     e3 := l add:(v3 := 'three').
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
     l removeIdentical:v2.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
     self assert:(e1 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
     self assert:(e3 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
     l removeIdentical:v1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
     self assert:(l firstLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
     self assert:(e3 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
     l removeIdentical:v3.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
     self assert:(l size == 0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
removeLast
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
    "remove and return the last node from the sequence"
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
    |link|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
    lastLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
        ^ self emptyCollectionError
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
    ].
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    link := lastLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
    lastLink := lastLink previousLink.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
    lastLink isNil ifTrue:[
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
        firstLink := nil
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
    ] ifFalse:[ 
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
        lastLink nextLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
    ].        
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
    link nextLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
    link previousLink:nil.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
    numberOfNodes := numberOfNodes - 1.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
    ^ link
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
     |l v1 v2 v3 e1 e2 e3 e2_5 e4|
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
     l := DoubleLinkedList new.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
     e1 := l add:'one'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
     e2 := l add:'two'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
     e3 := l add:'three'.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
     self assert:(e2 nextLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
     self assert:(e3 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
     self assert:(l lastLink == e3).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
     self assert:(e3 previousLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
     l removeLast.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
     self assert:(e1 nextLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
     self assert:(e2 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
     self assert:(l lastLink == e2).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
     self assert:(e2 previousLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
     l removeLast.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
     self assert:(l firstLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
     self assert:(e1 nextLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
     self assert:(l lastLink == e1).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
     self assert:(e1 previousLink isNil).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
     l removeLast.
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
     self assert:(l size == 0).
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
    "
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
! !
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
!DoubleLinkedList class methodsFor:'documentation'!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
version
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
    ^ '$Header$'
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
!
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
version_CVS
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
    ^ '$Header$'
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
! !
6197499978a0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486