lilypond-0.0.27
[lilypond.git] / flower / cursor.tcc
blob3d2116c46f826b28350b39ba3fa41f4ec58feb8e
1 #ifndef CURSOR_CC
2 #define CURSOR_CC
4 #include "cursor.hh"
5 #include <assert.h>
7 template<class T>
8  void
9 Cursor<T>::backspace()
11     Cursor<T> c(*this);
12     c--;        
13     list_.remove( *this );
16 template<class T>
17  void
18 Cursor<T>::del()
20     Cursor<T> c(*this);
21     c++;
22     list_.remove( *this );    
23     *this = c;
27 template<class T>
28 Cursor<T> 
29 Cursor<T>::operator -=( int j )    
31     while (j--)
32         (*this)--;
33     return *this;
35 template<class T>
36 Cursor<T> 
37 Cursor<T>::operator +=( int j )    
39     while (j++)
40         (*this)++;
41     return *this;
44 template<class T>
45 Cursor<T> 
46 Cursor<T>::operator +( int i ) const    
48     Cursor<T> r = *this;
50     if (i<0)
51         return r -(-i);
53     while (i--)
54         r++;
56     return r;
59 template<class T>
60 Cursor<T>
61 Cursor<T>::operator -( int i ) const
63     Cursor<T> r = *this;
64     if (i<0)
65         return r +(-i);
67     while (i--)
68         r--;
69     
70     return r;
73   warning:  can't use Cursor::operator == (Cursor),
74   since it uses Cursor::operator-(Cursor)
75  */
76 template<class T>
77 int
78 Cursor<T>::operator-(Cursor<T> rhs) const
80     assert(rhs.list == list);
81     int dif = 0;
83     // search from *this on further up (positive difference)
84     Cursor<T> c(*this);
85     while (c.ok() && c.pointer_ != rhs.pointer_) {
86         c--;
87         dif++;
88     }
89     
90     if (c.ok())
91         goto gotcha;            // so, sue me.
93     // search in direction of bottom. (negative diff)
94     dif =0;
95     c=*this;    
96     while (c.ok() && c.pointer_ !=rhs.pointer_) {
97         dif --;
98         c++;
99     }
100     assert(c.ok());
102 gotcha:
103     assert((*this - dif).pointer_ == c.pointer_);
104     return dif;
107 #endif