2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1999--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
28 Moment::Moment (int m)
30 main_part_ = Rational (m);
31 grace_part_ = Rational (0);
34 Moment::Moment (Rational m, Rational g)
40 Moment::Moment (Rational m)
43 grace_part_ = Rational (0);
47 const char Moment::type_p_name_[] = "ly:moment?";
51 Moment::print_smob (SCM s, SCM port, scm_print_state *)
53 Moment *r = (Moment *) SCM_CELL_WORD_1 (s);
55 scm_puts ("#<Mom ", port);
56 string str = r->to_string ();
57 scm_puts ((char *)str.c_str (), port);
64 Moment::as_scheme () const
66 return scm_list_5 (ly_symbol2scm ("ly:make-moment"),
67 scm_from_int64 (main_part_.num ()),
68 scm_from_int64 (main_part_.den ()),
69 scm_from_int64 (grace_part_.num ()),
70 scm_from_int64 (grace_part_.den ()));
74 Moment::equal_p (SCM a, SCM b)
76 Moment *m1 = Moment::unsmob (a);
77 Moment *m2 = Moment::unsmob (b);
79 return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
83 compare (Moment const &a, Moment const &b)
85 return Moment::compare (a, b);
89 Moment::compare (Moment const &a, Moment const &b)
91 int c = Rational::compare (a.main_part_, b.main_part_);
95 return Rational::compare (a.grace_part_, b.grace_part_);
99 Moment::operator += (Moment const &src)
101 main_part_ += src.main_part_;
102 grace_part_ += src.grace_part_;
106 Moment::operator -= (Moment const &src)
108 main_part_ -= src.main_part_;
109 grace_part_ -= src.grace_part_;
112 /* Only take the main part of SRC for multiplication. */
114 Moment::operator *= (Moment const &src)
116 main_part_ *= src.main_part_;
117 grace_part_ *= src.main_part_;
120 /* Only take the main part of SRC for division. */
122 Moment::operator /= (Moment const &src)
124 main_part_ /= src.main_part_;
125 grace_part_ /= src.main_part_;
128 /* Only take the main part of SRC for division. */
130 Moment::operator %= (Moment const &src)
132 main_part_ %= src.main_part_;
133 grace_part_ %= src.main_part_;
139 /* TODO: ensure MSB == 0 here */
140 return main_part_.den ();
146 return main_part_.num ();
150 Moment::to_bool () const
152 return main_part_ || grace_part_;
156 Moment::set_infinite (int k)
158 main_part_.set_infinite (k);
162 Moment::to_string () const
164 string s = main_part_.to_string ();
166 s += "G" + grace_part_.to_string ();
171 Moment::operator - () const
174 m.grace_part_ = -grace_part_;
175 m.main_part_ = -main_part_;
179 #ifdef STREAM_SUPPORT
181 operator << (ostream &os, Moment const &m)
183 os << m.to_string ();
189 robust_scm2moment (SCM m, Moment d)
191 Moment *p = Moment::unsmob (m);
199 moment_less (SCM a, SCM b)
201 return *Moment::unsmob (a) < *Moment::unsmob (b);