]> git.donarmstrong.com Git - lilypond.git/blob - lily/moment.cc
Web-ja: update introduction
[lilypond.git] / lily / moment.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 1999--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
5
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.
10
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.
15
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/>.
18 */
19
20 #include "moment.hh"
21
22 #include "warn.hh"
23
24 Moment::Moment ()
25 {
26 }
27
28 Moment::Moment (int m)
29 {
30   main_part_ = Rational (m);
31   grace_part_ = Rational (0);
32 }
33
34 Moment::Moment (Rational m, Rational g)
35 {
36   main_part_ = m;
37   grace_part_ = g;
38 }
39
40 Moment::Moment (Rational m)
41 {
42   main_part_ = m;
43   grace_part_ = Rational (0);
44 }
45
46
47 const char * const Moment::type_p_name_ = "ly:moment?";
48
49
50 int
51 Moment::print_smob (SCM port, scm_print_state *) const
52 {
53   scm_puts ("#<Mom ", port);
54   string str = to_string ();
55   scm_puts ((char *)str.c_str (), port);
56   scm_puts (">", port);
57
58   return 1;
59 }
60
61 SCM
62 Moment::as_scheme () const
63 {
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 ()));
69 }
70
71 SCM
72 Moment::equal_p (SCM a, SCM b)
73 {
74   Moment *m1 = unsmob<Moment> (a);
75   Moment *m2 = unsmob<Moment> (b);
76
77   return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F;
78 }
79
80 int
81 compare (Moment const &a, Moment const &b)
82 {
83   return Moment::compare (a, b);
84 }
85
86 int
87 Moment::compare (Moment const &a, Moment const &b)
88 {
89   int c = Rational::compare (a.main_part_, b.main_part_);
90   if (c)
91     return c;
92
93   return Rational::compare (a.grace_part_, b.grace_part_);
94 }
95
96 void
97 Moment::operator += (Moment const &src)
98 {
99   main_part_ += src.main_part_;
100   grace_part_ += src.grace_part_;
101 }
102
103 void
104 Moment::operator -= (Moment const &src)
105 {
106   main_part_ -= src.main_part_;
107   grace_part_ -= src.grace_part_;
108 }
109
110 /* Only take the main part of SRC for multiplication.  */
111 void
112 Moment::operator *= (Moment const &src)
113 {
114   main_part_ *= src.main_part_;
115   grace_part_ *= src.main_part_;
116 }
117
118 /* Only take the main part of SRC for division.  */
119 void
120 Moment::operator /= (Moment const &src)
121 {
122   main_part_ /= src.main_part_;
123   grace_part_ /= src.main_part_;
124 }
125
126 /* Only take the main part of SRC for division.  */
127 void
128 Moment::operator %= (Moment const &src)
129 {
130   main_part_ %= src.main_part_;
131   grace_part_ %= src.main_part_;
132 }
133
134 I64
135 Moment::den () const
136 {
137   /* TODO: ensure MSB == 0 here */
138   return main_part_.den ();
139 }
140
141 I64
142 Moment::num () const
143 {
144   return main_part_.num ();
145 }
146
147 bool
148 Moment::to_bool () const
149 {
150   return main_part_ || grace_part_;
151 }
152
153 void
154 Moment::set_infinite (int k)
155 {
156   main_part_.set_infinite (k);
157 }
158
159 string
160 Moment::to_string () const
161 {
162   string s = main_part_.to_string ();
163   if (grace_part_)
164     s += "G" + grace_part_.to_string ();
165   return s;
166 }
167
168 Moment
169 Moment::operator - () const
170 {
171   Moment m;
172   m.grace_part_ = -grace_part_;
173   m.main_part_ = -main_part_;
174   return m;
175 }
176
177 #ifdef STREAM_SUPPORT
178 ostream &
179 operator << (ostream &os, Moment const &m)
180 {
181   os << m.to_string ();
182   return os;
183 }
184 #endif
185
186 Moment
187 robust_scm2moment (SCM m, Moment d)
188 {
189   Moment *p = unsmob<Moment> (m);
190   if (!p)
191     return d;
192   else
193     return *p;
194 }
195
196 bool
197 moment_less (SCM a, SCM b)
198 {
199   return *unsmob<Moment> (a) < *unsmob<Moment> (b);
200 }