diff options
Diffstat (limited to 'flower/list.cc')
-rw-r--r-- | flower/list.cc | 87 |
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 |