* lily/paper-system.cc (LY_DEFINE): derive from Prob.
* lily/prob.cc (Module): Implement Prob (Property Object), object
with shared and r/w property alists.
* lily/include/prob.hh (Module): new file. Declare Prob.
* flower/string.cc: remove is_empty().
2006-01-24 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * lily/music.cc (derived_mark): derive Music from Prob.
+
+ * lily/paper-system.cc (LY_DEFINE): derive from Prob.
+
+ * lily/prob.cc (Module): Implement Prob (Property Object), object
+ with shared and r/w property alists.
+
+ * lily/include/prob.hh (Module): new file. Declare Prob.
+
+ * flower/string.cc: remove is_empty().
+
* flower/include/string.hh (class String): remove String:: qualifier.
* buildscripts/analyse-cxx-log.py: new file. Read compile log to
return strh_.get_str0 ();
}
-#ifndef DISALLOW_OLD_STRING
-bool
-String::is_empty () const
-{
- return !length ();
-}
-#endif
-
-
/**
Do a signed comparison, analogous to memcmp;
*/
MODULE_LDFLAGS += -L$(outdir) -static-libgcc
endif
+CXXFLAGS += -Woverloaded-virtual
# for profiling, link guile statically:
#include "smobs.hh"
#include "moment.hh"
#include "pitch.hh"
+#include "prob.hh"
#define is_mus_type(x) internal_is_music_type (ly_symbol2scm (x))
-class Music
+class Music : public Prob
{
public:
Music (SCM init);
Input *origin () const;
void set_spot (Input);
- SCM internal_get_property (SCM) const;
- void internal_set_property (SCM, SCM val);
- SCM internal_get_object (SCM) const;
- void internal_set_object (SCM, SCM val);
- SCM get_property_alist (bool mutble) const;
bool internal_is_music_type (SCM) const;
DECLARE_SCHEME_CALLBACK (relative_callback, (SCM, SCM));
Pitch to_relative_octave (Pitch);
Pitch generic_to_relative_octave (Pitch);
- String name () const;
Moment get_length () const;
Moment start_mom () const;
void print () const;
void compress (Moment factor);
DECLARE_SCHEME_CALLBACK (duration_length_callback, (SCM));
+
protected:
- DECLARE_SMOBS (Music,);
-
- SCM immutable_property_alist_;
- SCM mutable_property_alist_;
+ virtual SCM copy_mutable_properties () const;
+ virtual void type_check_assignment (SCM, SCM) const;
+ virtual void derived_mark () const;
protected:
SCM length_callback_;
SCM start_callback_;
friend SCM ly_extended_make_music (SCM, SCM);
};
-DECLARE_TYPE_P (Music);
-DECLARE_UNSMOB (Music, music);
-
+Music *unsmob_music (SCM);
Music *make_music_by_name (SCM sym);
SCM ly_music_deep_copy (SCM);
+extern SCM ly_music_p_proc;
#endif /* MUSIC_HH */
#ifndef PAPER_SYSTEM_HH
#define PAPER_SYSTEM_HH
-#include "stencil.hh"
+#include "prob.hh"
/*
A formatted "system" (A block of titling also is a Paper_system)
formatted content of the grob is put into a
Paper_system. Page-breaking handles Paper_system objects.
*/
-class Paper_system
+class Paper_system : public Prob
{
- DECLARE_SMOBS (Paper_system,);
- SCM mutable_property_alist_;
- SCM immutable_property_alist_;
-
- void init_vars ();
public:
-
Paper_system (Stencil, SCM);
- SCM internal_get_property (SCM sym) const;
- void internal_set_property (SCM sym, SCM val);
- Real break_before_penalty () const;
};
-
-DECLARE_UNSMOB (Paper_system, paper_system);
+Paper_system*unsmob_paper_system (SCM);
#endif /* PAPER_SYSTEM_HH */
--- /dev/null
+/*
+ property-object.hh -- declare Property_object
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2004--2006 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#ifndef PROPERTY_OBJECT_HH
+#define PROPERTY_OBJECT_HH
+
+#include "stencil.hh"
+
+/*
+ A formatted "system" (A block of titling also is a Property_object)
+
+ To save memory, we don't keep around the System grobs, but put the
+ formatted content of the grob is put into a
+ Property_object. Page-breaking handles Property_object objects.
+*/
+class Prob
+{
+ DECLARE_SMOBS (Prob,);
+ DECLARE_CLASSNAME(Prob);
+
+ void init_vars ();
+protected:
+ SCM mutable_property_alist_;
+ SCM immutable_property_alist_;
+
+ virtual void derived_mark () const;
+ virtual SCM copy_mutable_properties () const;
+ virtual void type_check_assignment (SCM,SCM) const;
+
+public:
+ Prob (SCM);
+ Prob (Prob const &);
+ virtual String name () const;
+
+ SCM get_property_alist (bool mutble) const;
+ SCM internal_get_property (SCM sym) const;
+ void internal_set_property (SCM sym, SCM val);
+};
+
+DECLARE_UNSMOB (Prob, prob);
+
+#endif /* PROPERTY_OBJECT_HH */
#define SMOBS_HH
#include "lily-guile.hh"
+#include "virtual-methods.hh"
/*
Smobs are GUILEs mechanism of exporting C(++) objects to the Scheme
"Its arguments. @code{signature} is a list containing either "
"@code{ly:music?} predicates or other type predicates.")
{
+ extern SCM ly_music_p_proc;
+
String str = "";
for (SCM s = signature; scm_is_pair (s); s = scm_cdr (s))
{
if (str != "")
str += "-";
- if (scm_car (s) == Music_type_p_proc)
+ if (scm_car (s) == ly_music_p_proc)
str += "music";
else if (scm_car (s) == ly_lily_module_constant ("markup?"))
str += "markup";
return ms->unprotect ();
}
+LY_DEFINE (ly_music_p, "ly:music?",
+ 1, 0, 0, (SCM obj),
+ "Type predicate")
+{
+ return scm_from_bool (unsmob_music (obj));
+}
+
/* todo: property args */
LY_DEFINE (ly_music_mutable_properties, "ly:music-mutable-properties",
1, 0, 0, (SCM mus),
}
return scm_reverse_x (newlist, SCM_EOL);
}
+
return scm_c_memq (k, ifs) != SCM_BOOL_F;
}
-String
-Music::name () const
-{
- SCM nm = get_property ("name");
- if (scm_is_symbol (nm))
- return ly_symbol2string (nm);
- else
- return "Music";
-}
-
Music::Music (SCM init)
+ : Prob (init)
{
- self_scm_ = SCM_EOL;
- immutable_property_alist_ = init;
- mutable_property_alist_ = SCM_EOL;
- smobify_self ();
-
+ length_callback_ = SCM_EOL;
+ start_callback_ = SCM_EOL;
+
length_callback_ = get_property ("length-callback");
if (!ly_is_procedure (length_callback_))
length_callback_ = duration_length_callback_proc;
start_callback_ = get_property ("start-callback");
}
-Music::Music (Music const &m)
+void
+Music::derived_mark () const
{
- immutable_property_alist_ = m.immutable_property_alist_;
- mutable_property_alist_ = SCM_EOL;
- self_scm_ = SCM_EOL;
-
- /* First we smobify_self, then we copy over the stuff. If we don't,
- stack vars that hold the copy might be optimized away, meaning
- that they won't be protected from GC. */
- smobify_self ();
- mutable_property_alist_ = ly_music_deep_copy (m.mutable_property_alist_);
- length_callback_ = m.length_callback_;
- start_callback_ = m.start_callback_;
- set_spot (*m.origin ());
+ scm_gc_mark (length_callback_);
+ scm_gc_mark (start_callback_);
}
-Music::~Music ()
+SCM
+Music::copy_mutable_properties () const
{
+ return ly_music_deep_copy (mutable_property_alist_);
}
-SCM
-Music::get_property_alist (bool m) const
+void
+Music::type_check_assignment (SCM s, SCM v) const
{
- return (m) ? mutable_property_alist_ : immutable_property_alist_;
+ if (!::type_check_assignment (s, v, ly_symbol2scm ("music-type?")))
+ abort ();
}
-SCM
-Music::mark_smob (SCM m)
+Music::Music (Music const &m)
+ : Prob (m)
{
- Music *mus = (Music *) SCM_CELL_WORD_1 (m);
- scm_gc_mark (mus->immutable_property_alist_);
- return mus->mutable_property_alist_;
+ length_callback_ = m.length_callback_;
+ start_callback_ = m.start_callback_;
+
+ /// why?
+ set_spot (*m.origin ());
}
Moment
}
}
-int
-Music::print_smob (SCM s, SCM p, scm_print_state*)
-{
- scm_puts ("#<Music ", p);
- Music *m = unsmob_music (s);
-
- SCM nm = m->get_property ("name");
- if (scm_is_symbol (nm) || scm_is_string (nm))
- scm_display (nm, p);
- else
- scm_puts ("Music", p);
-
- /* Printing properties takes a lot of time, especially during backtraces.
- For inspecting, it is better to explicitly use an inspection
- function. */
-
- scm_puts (">", p);
- return 1;
-}
Pitch
Music::generic_to_relative_octave (Pitch last)
set_property ("pitch-alist", ly_transpose_key_alist (pa, delta.smobbed_copy ()));
}
-IMPLEMENT_TYPE_P (Music, "ly:music?");
-IMPLEMENT_SMOBS (Music);
-IMPLEMENT_DEFAULT_EQUAL_P (Music);
-SCM
-Music::internal_get_property (SCM sym) const
-{
- SCM s = scm_sloppy_assq (sym, mutable_property_alist_);
- if (s != SCM_BOOL_F)
- return scm_cdr (s);
-
- s = scm_sloppy_assq (sym, immutable_property_alist_);
- return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s);
-}
-
-SCM
-Music::internal_get_object (SCM s) const
-{
- return internal_get_property (s);
-}
-
-void
-Music::internal_set_object (SCM s, SCM v)
-{
- return internal_set_property (s, v);
-}
-
-void
-Music::internal_set_property (SCM s, SCM v)
-{
- if (do_internal_type_checking_global)
- if (!type_check_assignment (s, v, ly_symbol2scm ("music-type?")))
- abort ();
-
- mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, s, v);
-}
void
Music::set_spot (Input ip)
mom = d->get_length ();
return mom.smobbed_copy ();
}
+
+Music *
+unsmob_music (SCM m)
+{
+ return dynamic_cast<Music*> (unsmob_prob (m));
+}
+
#include "paper-system.hh"
#include "item.hh"
-#include "ly-smobs.icc"
-
-IMPLEMENT_SMOBS (Paper_system);
-IMPLEMENT_TYPE_P (Paper_system, "ly:paper-system?");
-IMPLEMENT_DEFAULT_EQUAL_P (Paper_system);
-
Paper_system::Paper_system (Stencil s, SCM immutable_init)
+ : Prob (immutable_init)
{
- mutable_property_alist_ = SCM_EOL;
- immutable_property_alist_ = immutable_init;
- smobify_self ();
-
SCM yext = get_property ("Y-extent");
if (is_number_pair (yext))
s = Stencil (b, s.expr ());
}
- set_property ("stencil", s.smobbed_copy ());
-}
-
-Paper_system::~Paper_system ()
-{
-}
-
-SCM
-Paper_system::mark_smob (SCM smob)
-{
- Paper_system *system = (Paper_system *) SCM_CELL_WORD_1 (smob);
- scm_gc_mark (system->mutable_property_alist_);
- return system->immutable_property_alist_;
-}
-
-int
-Paper_system::print_smob (SCM smob, SCM port, scm_print_state*)
-{
- Paper_system *p = (Paper_system *) SCM_CELL_WORD_1 (smob);
- scm_puts ("#<", port);
- scm_puts ("Paper_system", port);
- scm_display (p->mutable_property_alist_, port);
- scm_display (p->immutable_property_alist_, port);
-
- scm_puts (" >\n", port);
- return 1;
-}
-
-void
-Paper_system::init_vars ()
-{
+ set_property ("stencil", s.smobbed_copy ());
}
-SCM
-Paper_system::internal_get_property (SCM sym) const
+Paper_system *
+unsmob_paper_system (SCM x)
{
- /*
- TODO: type checking
- */
- SCM s = scm_sloppy_assq (sym, mutable_property_alist_);
- if (s != SCM_BOOL_F)
- return scm_cdr (s);
-
- s = scm_sloppy_assq (sym, immutable_property_alist_);
- return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s);
+ Prob *prob = unsmob_prob (x);
+ return dynamic_cast<Paper_system*> (prob);
}
-void
-Paper_system::internal_set_property (SCM sym, SCM val)
+LY_DEFINE(ly_paper_system_p, "ly:paper-system?",
+ 1,0,0, (SCM obj),
+ "Type predicate.")
{
- mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, sym, val);
+ return scm_from_bool (unsmob_paper_system (obj));
}
--- /dev/null
+/*
+ paper-system.cc -- implement Paper_system
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2004--2006 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "prob.hh"
+#include "main.hh"
+#include "item.hh"
+
+#include "ly-smobs.icc"
+
+IMPLEMENT_SMOBS (Prob);
+IMPLEMENT_TYPE_P (Prob, "ly:prob?");
+IMPLEMENT_DEFAULT_EQUAL_P (Prob);
+
+Prob::Prob (SCM immutable_init)
+{
+ self_scm_ = SCM_EOL;
+ mutable_property_alist_ = SCM_EOL;
+ immutable_property_alist_ = immutable_init;
+ smobify_self ();
+}
+
+Prob::~Prob ()
+{
+}
+
+Prob::Prob (Prob const &src)
+{
+ immutable_property_alist_ = src.immutable_property_alist_;
+ mutable_property_alist_ = SCM_EOL;
+ self_scm_ = SCM_EOL;
+
+ /* First we smobify_self, then we copy over the stuff. If we don't,
+ stack vars that hold the copy might be optimized away, meaning
+ that they won't be protected from GC. */
+ smobify_self ();
+ mutable_property_alist_ = src.copy_mutable_properties ();
+}
+
+
+SCM
+Prob::copy_mutable_properties () const
+{
+ return ly_deep_copy (mutable_property_alist_);
+}
+
+void
+Prob::derived_mark () const
+{
+}
+
+SCM
+Prob::mark_smob (SCM smob)
+{
+ Prob *system = (Prob *) SCM_CELL_WORD_1 (smob);
+ scm_gc_mark (system->mutable_property_alist_);
+ system->derived_mark ();
+
+ return system->immutable_property_alist_;
+}
+
+int
+Prob::print_smob (SCM smob, SCM port, scm_print_state*)
+{
+ Prob *p = (Prob *) SCM_CELL_WORD_1 (smob);
+ scm_puts ("#<", port);
+ scm_puts ("Prob: ", port);
+
+
+ scm_puts (p->class_name (), port);
+ scm_display (p->mutable_property_alist_, port);
+ scm_display (p->immutable_property_alist_, port);
+
+ scm_puts (" >\n", port);
+ return 1;
+}
+
+
+
+SCM
+Prob::internal_get_property (SCM sym) const
+{
+ /*
+ TODO: type checking
+ */
+ SCM s = scm_sloppy_assq (sym, mutable_property_alist_);
+ if (s != SCM_BOOL_F)
+ return scm_cdr (s);
+
+ s = scm_sloppy_assq (sym, immutable_property_alist_);
+ return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s);
+}
+
+void
+Prob::internal_set_property (SCM sym, SCM val)
+{
+ if (do_internal_type_checking_global)
+ type_check_assignment (sym, val);
+
+ mutable_property_alist_ = scm_assq_set_x (mutable_property_alist_, sym, val);
+}
+
+void
+Prob::type_check_assignment (SCM sym, SCM val) const
+{
+ (void) sym;
+ (void) val;
+}
+
+SCM
+Prob::get_property_alist (bool m) const
+{
+ return (m) ? mutable_property_alist_ : immutable_property_alist_;
+}
+
+String
+Prob::name () const
+{
+ SCM nm = get_property ("name");
+ if (scm_is_symbol (nm))
+ return ly_symbol2string (nm);
+ else
+ return this->class_name ();
+}
+