]> git.donarmstrong.com Git - lilypond.git/blob - lily/grob-array.cc
308f057242be5a10b7d124126cf51a4cfdfcc5ff
[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 port, scm_print_state *)
66 {
67   scm_puts ("#<Grob_array", port);
68   for (vsize i = 0; i < size (); i++)
69     {
70       scm_display (grob (i)->self_scm (), port);
71       scm_puts (" ", port);
72     }
73   scm_puts (">", port);
74   return 1;
75 }
76
77 SCM
78 Grob_array::make_array ()
79 {
80   Grob_array ga;
81   return ga.smobbed_copy ();
82 }
83
84 void
85 Grob_array::clear ()
86 {
87   grobs_.clear ();
88 }
89
90 void
91 Grob_array::remove_duplicates ()
92 {
93   assert (!ordered_);
94
95   uniquify (grobs_);
96 }
97
98 bool
99 Grob_array::empty () const
100 {
101   return grobs_.empty ();
102 }
103
104 void
105 Grob_array::set_array (vector<Grob *> const &src)
106 {
107   grobs_ = src;
108 }
109
110 const char Grob_array::type_p_name_[] = "ly:grob-array?";
111
112
113 SCM
114 grob_list_to_grob_array (SCM lst)
115 {
116   SCM arr_scm = Grob_array::make_array ();
117   Grob_array *ga = Grob_array::unsmob (arr_scm);
118   for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s))
119     ga->add (Grob::unsmob (scm_car (s)));
120   return arr_scm;
121 }
122
123 SCM
124 grob_array_to_list (Grob_array *array)
125 {
126   SCM list = SCM_EOL;
127   SCM *tail = &list;
128
129   for (vsize i = 0; i < array->size (); i++)
130     {
131       *tail = scm_cons (array->grob (i)->self_scm (), SCM_EOL);
132       tail = SCM_CDRLOC (*tail);
133     }
134   return list;
135 }