summaryrefslogtreecommitdiff
path: root/flower/list.inl
blob: 8396156b6a1546e19561cc14e24928dbe1b3a437 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// -*-c++-*-
#ifndef LIST_INL
#define LIST_INL
template<class T>
inline
List<T>::List()
{
    top_ = bottom_ = 0;
    size_ = 0;
}

template<class T>
inline
List<T>::List( const T& thing )
{
    top_ = bottom_ = 0;
    size_ = 0;
    add( thing, Cursor<T>( *this, bottom_ ) );
}

template<class T>
inline
List<T>::~List()
{
    Cursor<T> next(*this);
    for ( Cursor<T> c( *this ); c.ok(); c = next ) {
	next = c;
	next++;
	remove( c );
    }
}

template<class T>
inline void
List<T>::add( const T& thing, Cursor<T> after_me )
{
#if 0
    if ( after_me.ok() )
	after_me.pointer()->add( thing );
    else if ( size_ )
        bottom().pointer()->add( thing );
    else
        bottom_ = top_ = new Link<T>( thing );
#endif
    
    if (!size_) {		// not much choice if list is empty
        bottom_ = top_ = new Link<T>( thing );
    } else {			// add at aprioprate place
	Link<T> *p =  ( after_me.ok() ) ?
	    after_me.pointer() : bottom().pointer();
	p->add(thing);
	if (p == bottom_)	// adjust bottom_ if necessary.
	    bottom_ = p->next();
    }

    size_++;
}
/** 

  Procedure:
  \begin{itemize}
  \item if #after_me# is #ok()#, add after #after_me#, else
  \item if list !empty simply add to bottom, else
  \item list is empty: create first \Ref{Link} and initialize 
  #bottom_# and #top_#.
  \end{itemize}
*/

template<class T>
inline void
List<T>::insert( const T& thing, Cursor<T> before_me )
{
    if (!size_) {
	bottom_ = top_ = new Link<T>( thing );
    } else {
	Link<T> *p = 
	    (before_me.ok())?
	    before_me.pointer() : top().pointer();

	p->insert(thing);
	if (p == top_)
	    top_ = p->previous();
    }
	
    size_++;
#if 0 // rewrite hwn 16/9		
    if ( before_me.ok() )
        before_me.pointer()->insert( thing );
    else if ( size_ )
	top().pointer()->insert( thing );
    else
	bottom_ = top_ = new Link<T>( thing );
    size_++;
#endif
}

template<class T>
inline void
List<T>::remove( Cursor<T> me )
{
    if ( me.ok() ){
	Link<T> *lp = me.pointer();	
	lp->remove(*this);
	delete lp;
        size_--;
    }
}

template<class T>
inline int
List<T>::size() const
{ 
    return size_;
}

template<class T>
inline
PointerList<T>::PointerList() :
    List<T>()
{
}

template<class T>
inline
PointerList<T>::PointerList( const T& thing ) :
    List<T>( thing )
{
}

template<class T>
inline
PointerList<T>::~PointerList()
{
    Cursor<T> next(*this);
    for ( Cursor<T> c( *this ); c.ok(); c = next ) {
	next = c;
	next++;
	remove( c );		// PointerList::remove deletes the  real data
    }
}

template<class T>
inline void
PointerList_print( PointerList<T> const & l  ) 
{
    List<T>& promises_to_be_const = (List<T>&) l;
    for ( Cursor<T> c( promises_to_be_const ); c.ok(); c++ )
        (*c)->print();  
}


#endif