summaryrefslogtreecommitdiff
path: root/flower/list.cc
diff options
context:
space:
mode:
Diffstat (limited to 'flower/list.cc')
-rw-r--r--flower/list.cc87
1 files changed, 50 insertions, 37 deletions
diff --git a/flower/list.cc b/flower/list.cc
index 741e4ee97c..ce5e366cc8 100644
--- a/flower/list.cc
+++ b/flower/list.cc
@@ -34,51 +34,64 @@ List<T>::OK() const
assert(!lp);
}
+
template<class T>
-Cursor<T>
-List<T>::top()
+inline
+List<T>::~List()
{
-#if 0
- // ?? waarvoor is deze if ?
- if ( top_ ) // equivalent: if ( size_ )
- {
- Link<T>* t = top_->previous();
- assert( t != top_ ); // silly link
- while ( t )
- {
- assert(false); // this is even more silly.
- top_ = t;
- t = top_->previous();
- }
- }
-#endif
-
-// list empty: Cursor not ok()
- return Cursor<T>( *this, top_ );
+ Cursor<T> next(*this);
+ for ( Cursor<T> c( *this ); c.ok(); c = next ) {
+ next = c;
+ next++;
+ remove( c );
+ }
}
-
template<class T>
-Cursor<T>
-List<T>::bottom()
+inline void
+List<T>::add( const T& thing, Cursor<T> after_me )
{
- /* wat is dit voor zooi? kan dit niet weg?
+ 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();
+ }
- (invarianten!)
- */
- if ( bottom_ ) // equivalent: if ( size_ )
- {
- Link<T>* b = bottom_->next();
- assert( b != bottom_ ); // silly link
- while ( b )
- {
- bottom_ = b;
- b = bottom_->next();
- }
- }
- // list empty: Cursor not ok()
- return Cursor<T>( *this, bottom_ );
+ 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_++;
+
+}
#endif