X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fduration.cc;h=4768f015b501c6510f52b373fb4625d94f168889;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=af924bb4b17036df70c28d8ce7583c945002ddbe;hpb=0e5d83a9ceb4a143f83d22406d7eb816314ff9f7;p=lilypond.git diff --git a/lily/duration.cc b/lily/duration.cc index af924bb4b1..4768f015b5 100644 --- a/lily/duration.cc +++ b/lily/duration.cc @@ -1,10 +1,21 @@ /* - duration.cc -- implement Duration + This file is part of LilyPond, the GNU music typesetter. - source file of the LilyPond music typesetter - - (c) 1997--2009 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen Han-Wen Nienhuys + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "duration.hh" @@ -12,7 +23,6 @@ #include "misc.hh" #include "lily-proto.hh" -#include "ly-smobs.icc" int Duration::compare (Duration const &left, Duration const &right) @@ -46,41 +56,41 @@ Duration::Duration (Rational r, bool scale) else { /* we want to find the integer k for which 2q/p > 2^k >= q/p. - It's simple to check that k' = \floor \log q - \floor \log p - satisfies the left inequality and is within a factor of 2 of - satistying the right one. Therefore either k = k' or k = k'+1 */ + It's simple to check that k' = \floor \log q - \floor \log p + satisfies the left inequality and is within a factor of 2 of + satistying the right one. Therefore either k = k' or k = k'+1 */ - int p = r.num (); - int q = r.den (); + int p = (int) r.num (); + int q = (int) r.den (); int k = intlog2 (q) - intlog2 (p); - if ((p << k) < q) - k++; + if (shift_left (p, k) < q) + k++; - assert ((p << k) >= q && (p << (k-1)) < q); + assert (shift_left (p, k) >= q && shift_left (p, (k - 1)) < q); /* If we were to write out log (p/q) in base 2, then the position of the - first non-zero bit (ie. k in our notation) would be the durlog - and the number of consecutive 1s after that bit would be the number of - dots */ - p = (p << k) - q; + first non-zero bit (ie. k in our notation) would be the durlog + and the number of consecutive 1s after that bit would be the number of + dots */ + p = shift_left (p, k) - q; dots_ = 0; while ((p *= 2) >= q) - { - p -= q; - dots_++; - } + { + p -= q; + dots_++; + } /* we only go up to 64th notes */ if (k > 6) - { - durlog_ = 6; - dots_ = 0; - } + { + durlog_ = 6; + dots_ = 0; + } else - durlog_ = k; + durlog_ = k; if (scale || k > 6) - factor_ = r / get_length (); + factor_ = r / get_length (); } } @@ -126,22 +136,14 @@ Duration::to_string () const return s; } -IMPLEMENT_TYPE_P (Duration, "ly:duration?"); +const char Duration::type_p_name_[] = "ly:duration?"; -SCM -Duration::mark_smob (SCM) -{ - return SCM_EOL; -} -IMPLEMENT_SIMPLE_SMOBS (Duration); int -Duration::print_smob (SCM s, SCM port, scm_print_state *) +Duration::print_smob (SCM port, scm_print_state *) { - Duration *r = (Duration *) SCM_CELL_WORD_1 (s); - scm_puts ("#to_string ()), port); + scm_display (ly_string2scm (to_string ()), port); scm_puts (" >", port); return 1; @@ -154,8 +156,8 @@ Duration::equal_p (SCM a, SCM b) Duration *q = (Duration *) SCM_CELL_WORD_1 (b); bool eq = p->dots_ == q->dots_ - && p->durlog_ == q->durlog_ - && p->factor_ == q->factor_; + && p->durlog_ == q->durlog_ + && p->factor_ == q->factor_; return eq ? SCM_BOOL_T : SCM_BOOL_F; }