]> git.donarmstrong.com Git - lilypond.git/blob - lily/scm-hash.cc
patch::: 1.3.99.jcn2
[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 "ly-smobs.icc"
13
14
15 Scheme_hash_table::Scheme_hash_table ()
16 {
17   smobify_self ();
18 }
19
20
21 Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src)
22   : Scm_stl_map (src)
23 {
24   smobify_self ();
25 }
26
27 void
28 Scheme_hash_table::operator =(Scheme_hash_table const & src)
29 {
30   Scm_stl_map::operator = (src);
31         
32   // we do not copy the self_scm () field!
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 = (Scheme_hash_table*) SCM_CELL_WORD_1(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 int
53 Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*)
54 {
55   assert (unsmob (s));
56   char str[1000];
57   sprintf (str, "#<Scheme_hash_table 0x%0x ", s);
58   scm_puts (str, p);      
59   Scheme_hash_table *me = unsmob(s);
60   for (Scm_stl_map::const_iterator i = me->begin (); i != me->end(); i++)
61     {
62       scm_display ((*i).first, p);
63       scm_puts (" = ",p);      
64       scm_display ((*i).second, p);
65       scm_puts ("\n",p);            
66     }
67   scm_puts ("> ",p);        
68   return 1;
69 }
70
71 bool
72 Scheme_hash_table::try_retrieve (SCM k, SCM *v)
73 {
74   Scm_stl_map ::const_iterator i (find (k));
75   bool found = i != end ();
76   if (found)
77     *v = (*i).second;
78   return found;
79 }
80
81 bool
82 Scheme_hash_table::elem_b (SCM k) const
83 {
84   Scm_stl_map::const_iterator i (find (k));
85   return i != end ();
86 }
87
88 void
89 Scheme_hash_table::set (SCM k, SCM v)
90 {
91   (*this)[k] = v;
92 }
93
94 // UGH. 
95 SCM
96 Scheme_hash_table::get (SCM k)const
97 {
98   return (*(Scheme_hash_table*)this)[k]; 
99 }
100
101
102 Scheme_hash_table::~Scheme_hash_table( )
103 {
104 }
105
106 SCM
107 Scheme_hash_table::to_alist () const
108 {
109   SCM l = SCM_EOL;
110   for (Scm_stl_map ::const_iterator i = begin (); i != end(); i++)
111     l = gh_cons (gh_cons ((*i).first, (*i).second), l);
112   return l;  
113 }
114
115
116
117 IMPLEMENT_UNSMOB(Scheme_hash_table,scheme_hash);
118 IMPLEMENT_SMOBS(Scheme_hash_table);
119 IMPLEMENT_DEFAULT_EQUAL_P(Scheme_hash_table);
120
121