X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Finclude%2Fgrob-array.hh;h=1a755fe66196c2bdbbf301c2217a068d06a010b0;hb=36fba3138858ee42ba3f03e3de0efa1d1f49d147;hp=feeda8a36a23c43831ee11a1f7f3d39e39568bb9;hpb=bf090c279f6f8e0ebbffc72d7ee435172dfaddc8;p=lilypond.git diff --git a/lily/include/grob-array.hh b/lily/include/grob-array.hh index feeda8a36a..1a755fe661 100644 --- a/lily/include/grob-array.hh +++ b/lily/include/grob-array.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2014 Han-Wen Nienhuys + Copyright (C) 2005--2015 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 @@ -27,8 +27,8 @@ class Grob_array : public Simple_smob { public: - static int print_smob (SCM, SCM, scm_print_state *); - static SCM mark_smob (SCM); + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; static const char type_p_name_[]; private: vector grobs_; @@ -41,16 +41,29 @@ public: void set_ordered (bool b) { ordered_ = b; } Item *item (vsize i); Spanner *spanner (vsize i); - Grob *grob (vsize i) { return grobs_.at (i); } + Grob *grob (vsize i) const { return grobs_.at (i); } vsize size () const { return grobs_.size (); } - bool empty () const; + bool empty () const { return grobs_.empty (); } void remove_duplicates (); - void clear (); + void clear () { grobs_.clear (); } void add (Grob *x) { grobs_.push_back (x); } - void set_array (vector const &src); - vector &array_reference (); - vector const &array () const; + void set_array (vector const &src) { grobs_ = src; } + vector &array_reference () { return grobs_; } + vector const &array () const { return grobs_; } static SCM make_array (); + + // Remove grobs that do not satisfy the predicate, leaving the order + // unchanged. + void filter (bool (*predicate) (const Grob *)); + + // Run a function on all grobs in this array. If the function returns null, + // remove the original grob, reducing the size of the array. If the function + // returns a Grob, replace the original grob with the returned Grob. + void filter_map (Grob * (*map_fun) (Grob *)); + + // Like src.filter_map (f), but store the result in this array instead of + // mutating the input. + void filter_map_assign (const Grob_array &src, Grob * (*map_fun) (Grob *)); };