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