2 moment.cc -- implement Moment
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "lily-guile.hh"
14 #include "ly-smobs.icc"
16 IMPLEMENT_UNSMOB (Moment
,moment
);
17 IMPLEMENT_SIMPLE_SMOBS (Moment
);
18 IMPLEMENT_TYPE_P (Moment
, "moment?");
21 Moment::mark_smob (SCM
)
28 Moment::smobbed_copy () const
30 Moment
* m
= new Moment (*this);
31 return m
->smobbed_self ();
36 Moment::print_smob (SCM s
, SCM port
, scm_print_state
*)
38 Moment
*r
= (Moment
*) gh_cdr (s
);
40 scm_puts ("#<Mom ", port
);
41 String
str (r
->str ());
42 scm_puts ((char *)str
.ch_C (), port
);
43 scm_puts (" >", port
);
49 TODO: add optional factor argument.
52 make_rational (SCM n
, SCM d
)
54 Moment
m (Rational (1,1));
56 if (SCM_INUMP (n
) && SCM_INUMP (d
))
58 m
= Moment (Rational (gh_scm2int (n
), gh_scm2int (d
)));
62 ::error ("make-moment takes two integer arguments. Using 1/1");
65 return m
.smobbed_copy ();
72 scm_c_define_gsubr ("make-moment", 2 , 0, 0, (Scheme_function_unknown
) make_rational
);
75 ADD_SCM_INIT_FUNC (moms
,init_moments
);
78 Moment::equal_p (SCM a
, SCM b
)
80 Moment
*m1
= unsmob_moment (a
);
81 Moment
*m2
= unsmob_moment (b
);
83 return (*m1
== *m2
) ? SCM_BOOL_T
: SCM_BOOL_F
;
86 /****************************************************************/
89 compare (Moment
const &a
, Moment
const &b
)
91 return Moment::compare (a
,b
);
95 Moment::compare (Moment
const &a
, Moment
const &b
)
97 int c
= Rational::compare (a
.main_part_
,b
.main_part_
);
101 return Rational::compare (a
.grace_part_
, b
.grace_part_
);
109 Moment::Moment (int m
)
111 main_part_
= Rational(m
);
112 grace_part_
= Rational( 0);
115 Moment::Moment (Rational m
, Rational g
)
121 Moment::Moment (Rational m
)
124 grace_part_
= Rational (0);
128 Moment::operator += (Moment
const &src
)
130 main_part_
+=src
.main_part_
;
131 grace_part_
+= src
.grace_part_
;
134 Moment::operator -= (Moment
const &src
)
136 main_part_
-= src
.main_part_
;
137 grace_part_
-= src
.grace_part_
;
141 only take the main part of SRC for multiplication.
144 Moment::operator *= (Moment
const &src
)
146 main_part_
*= src
.main_part_
;
147 grace_part_
*= src
.main_part_
;
151 only take the main part of SRC for multiplication.
154 Moment::operator /= (Moment
const &src
)
156 main_part_
/= src
.main_part_
;
157 grace_part_
/= src
.main_part_
;
162 Moment::operator Rational()
169 Moment::den () const { return main_part_
.den (); }
172 Moment::num () const { return main_part_
.num (); }
175 Moment::to_bool () const
177 return main_part_
|| grace_part_
;
181 Moment::set_infinite (int k
)
183 main_part_
.set_infinite (k
);
190 String s
= main_part_
.str ();
193 s
+= "G" + grace_part_
.str ();
199 Moment::operator - () const
202 m
.grace_part_
= -grace_part_
;
203 m
.main_part_
= -main_part_
;
208 operator << (ostream
&os
, Moment
const &m
)