]> git.donarmstrong.com Git - lilypond.git/blob - lily/grob-array.cc
908ff6334b638df5eb75515522c169c9775b7687
[lilypond.git] / lily / grob-array.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2005--2014 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 "grob-array.hh"
21 #include "item.hh"
22 #include "spanner.hh"
23
24
25 Item *
26 Grob_array::item (vsize i)
27 {
28   return dynamic_cast<Item *> (grobs_.at (i));
29 }
30
31 Spanner *
32 Grob_array::spanner (vsize i)
33 {
34   return dynamic_cast<Spanner *> (grobs_.at (i));
35 }
36
37 Grob_array::Grob_array ()
38 {
39   ordered_ = true;
40 }
41
42 vector<Grob *> &
43 Grob_array::array_reference ()
44 {
45   return grobs_;
46 }
47
48 vector<Grob *> const &
49 Grob_array::array () const
50 {
51   return grobs_;
52 }
53
54 SCM
55 Grob_array::mark_smob ()
56 {
57 #if 0  /* see System::derived_mark () const */
58   for (vsize i = 0; i < grobs_.size (); i++)
59     scm_gc_mark (grobs_[i]->self_scm ());
60 #endif
61   return SCM_UNDEFINED;
62 }
63
64 int
65 Grob_array::print_smob (SCM arr, SCM port, scm_print_state *)
66 {
67   scm_puts ("#<Grob_array", port);
68
69   Grob_array *grob_arr = unsmob (arr);
70   for (vsize i = 0; i < grob_arr->size (); i++)
71     {
72       scm_display (grob_arr->grob (i)->self_scm (), port);
73       scm_puts (" ", port);
74     }
75   scm_puts (">", port);
76   return 1;
77 }
78
79 SCM
80 Grob_array::make_array ()
81 {
82   Grob_array ga;
83   return ga.smobbed_copy ();
84 }
85
86 void
87 Grob_array::clear ()
88 {
89   grobs_.clear ();
90 }
91
92 void
93 Grob_array::remove_duplicates ()
94 {
95   assert (!ordered_);
96
97   uniquify (grobs_);
98 }
99
100 bool
101 Grob_array::empty () const
102 {
103   return grobs_.empty ();
104 }
105
106 void
107 Grob_array::set_array (vector<Grob *> const &src)
108 {
109   grobs_ = src;
110 }
111
112 const char Grob_array::type_p_name_[] = "ly:grob-array?";
113
114
115 SCM
116 grob_list_to_grob_array (SCM lst)
117 {
118   SCM arr_scm = Grob_array::make_array ();
119   Grob_array *ga = Grob_array::unsmob (arr_scm);
120   for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s))
121     ga->add (Grob::unsmob (scm_car (s)));
122   return arr_scm;
123 }
124
125 SCM
126 grob_array_to_list (Grob_array *array)
127 {
128   SCM list = SCM_EOL;
129   SCM *tail = &list;
130
131   for (vsize i = 0; i < array->size (); i++)
132     {
133       *tail = scm_cons (array->grob (i)->self_scm (), SCM_EOL);
134       tail = SCM_CDRLOC (*tail);
135     }
136   return list;
137 }