]> git.donarmstrong.com Git - lilypond.git/blob - lily/scm-hash.cc
release: 1.3.36
[lilypond.git] / lily / scm-hash.cc
1 /*   
2   scm-hash.cc --  implement Scheme_hash_table
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include <stdio.h>
10
11 #include "scm-hash.hh"
12 #include "hash-table-iter.hh"
13
14
15 Scheme_hash_table::Scheme_hash_table ()
16 {
17   self_scm_ = SCM_EOL;
18   smobify_self ();
19 }
20
21 void
22 Scheme_hash_table::operator =(Scheme_hash_table const & src)
23 {
24   Scm_stl_map::operator = (src);
25         
26   // we do not copy the self_scm_ field!
27 }
28
29 void
30 Scheme_hash_table::do_smobify_self ()
31 {
32 }
33
34
35 SCM
36 Scheme_hash_table::mark_smob (SCM s)
37 {
38   /*
39     can't typecheck naively, since GC bit lives in CAR of S
40    */
41   
42   Scheme_hash_table *me = SMOB_TO_TYPE(Scheme_hash_table,s);
43
44   for (Scm_stl_map::const_iterator i= me->begin (); i != me->end(); i++)
45     {
46       scm_gc_mark ((*i).first);
47       scm_gc_mark ((*i).second);
48     }
49   return SCM_EOL;
50 }
51
52
53 Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src)
54   : Scm_stl_map (src)
55 {
56   self_scm_ = SCM_EOL;
57   smobify_self ();
58 }
59
60 int
61 Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*)
62 {
63   assert (SMOB_IS_TYPE_B (Scheme_hash_table, s));
64   char str[1000];
65   sprintf (str, "#<Scheme_hash_table 0x%0x ", s);
66   scm_puts (str, p);      
67   Scheme_hash_table *me = SMOB_TO_TYPE(Scheme_hash_table,s);
68   for (Scm_stl_map ::const_iterator i = me->begin (); i != me->end(); i++)
69     {
70       scm_display ((*i).first, p);
71       scm_puts (" = ",p);      
72       scm_display ((*i).second, p);
73       scm_puts ("\n",p);            
74     }
75   scm_puts ("> ",p);        
76   return 1;
77 }
78
79 bool
80 Scheme_hash_table::try_retrieve (SCM k, SCM *v)
81 {
82   Scm_stl_map ::const_iterator i (find (k));
83   bool found = i != end ();
84   if (found)
85     *v = (*i).second;
86   return found;
87 }
88
89 bool
90 Scheme_hash_table::elem_b (SCM k) const
91 {
92   Scm_stl_map::const_iterator i (find (k));
93   return i != end ();
94 }
95
96 void
97 Scheme_hash_table::set (SCM k, SCM v)
98 {
99   (*this)[k] = v;
100   scm_unprotect_object (v);
101 }
102
103 // UGH. 
104 SCM
105 Scheme_hash_table::get (SCM k)const
106 {
107   return (*(Scheme_hash_table*)this)[k]; 
108 }
109
110
111 Scheme_hash_table::~Scheme_hash_table( )
112 {
113   unsmobify_self ();
114 }
115
116 SCM
117 Scheme_hash_table::to_alist () const
118 {
119   SCM l = SCM_EOL;
120   for (Scm_stl_map ::const_iterator i = begin (); i != end(); i++)
121     l = gh_cons (gh_cons ((*i).first, (*i).second), l);
122   return l;  
123 }
124
125
126 #include "ly-smobs.icc"
127 IMPLEMENT_UNSMOB(Scheme_hash_table,scheme_hash);
128 IMPLEMENT_SMOBS(Scheme_hash_table);
129
130