]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/include/cons.hh
*** empty log message ***
[lilypond.git] / flower / include / cons.hh
index 6e62c4c865b97cec07ba92663c2e156928cc15cf..db922dba087f32742c85c87d824af98d1fd085b8 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1999--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 
@@ -11,6 +11,8 @@
 #define CONS_HH
 
 
+#include <assert.h>
+
 template<class T>
 class Cons
 {
@@ -38,7 +40,7 @@ class Killing_cons : public Cons<T>
 {
 public:
   Killing_cons (T *t, Cons<T> *p)
-    : Cons<T>( t,p)
+    : Cons<T> ( t,p)
     {
     }
   virtual ~Killing_cons ();
@@ -55,11 +57,36 @@ Cons<T> *remove_cons (Cons<T> **pp)
   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
  */
@@ -69,15 +96,26 @@ class Cons_list
 {
 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
@@ -85,17 +123,42 @@ public:
   */
   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_);
+    }
 };
 
 
@@ -105,19 +168,5 @@ template<class T>
 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 */