]> git.donarmstrong.com Git - lilypond.git/blob - lily/pointer-group-interface.cc
08af94839d443930a0f7e26240f9038745a2aa1b
[lilypond.git] / lily / pointer-group-interface.cc
1 /*
2   pointer-group-interface.cc -- implement Pointer_group_interface
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "pointer-group-interface.hh"
10
11 #include "grob-array.hh"
12 #include "grob.hh"
13
14 int
15 Pointer_group_interface::count (Grob *me, SCM sym)
16 {
17   Grob_array *arr = unsmob_grob_array (me->internal_get_object (sym));
18   return arr ? arr->size () : 0;
19 }
20
21 void
22 Pointer_group_interface::add_grob (Grob *me, SCM sym, SCM p)
23 {
24   add_grob (me, sym, unsmob_grob (p));
25 }
26
27 void
28 Pointer_group_interface::set_ordered (Grob *me, SCM sym, bool ordered)
29 {
30   Grob_array *arr = get_grob_array (me, sym);
31   arr->set_ordered (ordered);
32 }
33
34 Grob_array *
35 Pointer_group_interface::get_grob_array (Grob *me, SCM sym)
36 {
37   SCM scm_arr = me->internal_get_object (sym);
38   Grob_array *arr = unsmob_grob_array (scm_arr);
39   if (!arr)
40     {
41       scm_arr = Grob_array::make_array ();
42       arr = unsmob_grob_array (scm_arr);
43       me->set_object (sym, scm_arr);
44     }
45   return arr;
46 }
47
48 Grob *
49 Pointer_group_interface::find_grob (Grob *me, SCM sym, bool (*pred) (Grob*))
50 {
51   Grob_array *arr = get_grob_array (me, sym);
52
53   for (vsize i = 0; i < arr->size (); i++)
54     if (pred (arr->grob (i)))
55       return arr->grob (i);
56
57   return 0;
58 }
59
60 void
61 Pointer_group_interface::add_grob (Grob *me, SCM sym, Grob *p)
62 {
63   Grob_array *arr = get_grob_array (me, sym);
64   arr->add (p);
65 }
66
67 void
68 Pointer_group_interface::add_unordered_grob (Grob *me, SCM sym, Grob *p)
69 {
70   Grob_array *arr = get_grob_array (me, sym);
71   arr->add (p);
72   arr->set_ordered (false);
73 }
74
75 static vector<Grob*> empty_array;
76
77 vector<Grob*> const &
78 ly_scm2link_array (SCM x)
79 {
80   Grob_array *arr = unsmob_grob_array (x);
81   return arr ? arr->array () : empty_array;
82 }
83
84 vector<Grob*> const &
85 internal_extract_grob_array (Grob const *elt, SCM symbol)
86 {
87   return elt
88     ? ly_scm2link_array (elt->internal_get_object (symbol))
89     : empty_array;
90 }
91
92 vector<Item*>
93 internal_extract_item_array (Grob const *elt, SCM symbol)
94 {
95   Grob_array *arr = unsmob_grob_array (elt->internal_get_object (symbol));
96   vector<Item*> items;
97   for (vsize i = 0; arr && i < arr->size (); i++)
98     items.push_back (arr->item (i));
99
100   return items;
101 }