source file of the GNU LilyPond music typesetter
- (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#define CONS_HH
+#include <assert.h>
+
template<class T>
class Cons
{
{
public:
Killing_cons (T *t, Cons<T> *p)
- : Cons<T>( t,p)
+ : Cons<T> ( t,p)
{
}
virtual ~Killing_cons ();
return knip;
}
+template<class T> int cons_list_size (Cons<T> *l)
+{
+ int i=0;
+ while (l)
+ {
+ l = l->next_;
+ i++;
+ }
+ return i;
+}
+
+
+
+
+
+template<class T>
+Cons<T> * last_cons (Cons<T> * head)
+{
+ while (head && head->next_)
+ {
+ head = head->next_;
+ }
+ return head;
+}
+
/**
Invariants:
- (*tail_) is either the head_ pointer, or a next_ pointer from the list.
+ (*tail_) is either the head_ pointer, or a next_ pointer from the list.
**tail_ == NULL
*/
{
public:
Cons<T> * head_;
- Cons<T> ** tail_;
- Cons_list () { init_list (); }
- void init_list () {head_ =0; tail_ = &head_; }
+ Cons<T> ** nil_pointer_address_;
+ Cons_list ()
+ {
+ init ();
+ }
+ void init ()
+ {
+ head_ =0;
+ nil_pointer_address_ = &head_;
+ }
+ void append (T *c)
+ {
+ append (new Cons<T> (c,0));
+ }
void append (Cons<T> *c)
{
assert (!c->next_);
- *tail_ = c;
- while (*tail_)
- tail_ = &(*tail_)->next_;
+ *nil_pointer_address_ = c;
+ while (*nil_pointer_address_)
+ nil_pointer_address_ = & (*nil_pointer_address_)->next_;
}
/**
PRE: *pp should either be the head_ pointer, or the next_ pointer
*/
Cons<T> *remove_cons (Cons<T> **pp)
{
- if (&(*pp)->next_ == tail_)
- tail_ = pp;
+ if (& (*pp)->next_ == nil_pointer_address_)
+ nil_pointer_address_ = pp;
return ::remove_cons (pp);
}
+
+ /// junk everything after the first I elements.
+ void truncate (int i)
+ {
+ Cons<T> **p = &head_;
+ for (; *p && i; p = & ((*p)->next_))
+ {
+ i--;
+ }
+
+ if (*p)
+ {
+ delete *p;
+ *p = 0;
+ }
+ nil_pointer_address_ = p;
+ }
+
void junk ()
{
delete head_;
head_ =0;
}
- ~Cons_list () { junk (); }
+ ~Cons_list ()
+ {
+ junk ();
+ }
+ int size ()
+ {
+ return cons_list_size (head_);
+ }
};
void
clone_killing_cons_list (Cons_list<T>&, Cons<T> *src);
-template<class T> int cons_list_size_i (Cons<T> *l)
-{
- int i=0;
- while (l)
- {
- l = l->next_;
- i++;
- }
- return i;
-}
-
-
-
-
#endif /* CONS_HH */