2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1999--2015 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 * const Moment::type_p_name_ = "ly:moment?";
51 Moment::print_smob (SCM port, scm_print_state *) const
53 scm_puts ("#<Mom ", port);
54 string str = to_string ();
55 scm_puts ((char *)str.c_str (), port);
62 Moment::as_scheme () const
64 return scm_list_5 (ly_symbol2scm ("ly:make-moment"),
65 scm_from_int64 (main_part_.num ()),
66 scm_from_int64 (main_part_.den ()),
67 scm_from_int64 (grace_part_.num ()),
68 scm_from_int64 (grace_part_.den ()));
72 Moment::equal_p (SCM a, SCM b)
74 Moment *m1 = unsmob<Moment> (a);
75 Moment *m2 = unsmob<Moment> (b);
77 return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
81 compare (Moment const &a, Moment const &b)
83 return Moment::compare (a, b);
87 Moment::compare (Moment const &a, Moment const &b)
89 int c = Rational::compare (a.main_part_, b.main_part_);
93 return Rational::compare (a.grace_part_, b.grace_part_);
97 Moment::operator += (Moment const &src)
99 main_part_ += src.main_part_;
100 grace_part_ += src.grace_part_;
104 Moment::operator -= (Moment const &src)
106 main_part_ -= src.main_part_;
107 grace_part_ -= src.grace_part_;
110 /* Only take the main part of SRC for multiplication. */
112 Moment::operator *= (Moment const &src)
114 main_part_ *= src.main_part_;
115 grace_part_ *= src.main_part_;
118 /* Only take the main part of SRC for division. */
120 Moment::operator /= (Moment const &src)
122 main_part_ /= src.main_part_;
123 grace_part_ /= src.main_part_;
126 /* Only take the main part of SRC for division. */
128 Moment::operator %= (Moment const &src)
130 main_part_ %= src.main_part_;
131 grace_part_ %= src.main_part_;
137 /* TODO: ensure MSB == 0 here */
138 return main_part_.den ();
144 return main_part_.num ();
148 Moment::to_bool () const
150 return main_part_ || grace_part_;
154 Moment::set_infinite (int k)
156 main_part_.set_infinite (k);
160 Moment::to_string () const
162 string s = main_part_.to_string ();
164 s += "G" + grace_part_.to_string ();
169 Moment::operator - () const
172 m.grace_part_ = -grace_part_;
173 m.main_part_ = -main_part_;
177 #ifdef STREAM_SUPPORT
179 operator << (ostream &os, Moment const &m)
181 os << m.to_string ();
187 robust_scm2moment (SCM m, Moment d)
189 Moment *p = unsmob<Moment> (m);
197 moment_less (SCM a, SCM b)
199 return *unsmob<Moment> (a) < *unsmob<Moment> (b);