]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.5.14
authorfred <fred>
Wed, 27 Mar 2002 02:03:11 +0000 (02:03 +0000)
committerfred <fred>
Wed, 27 Mar 2002 02:03:11 +0000 (02:03 +0000)
lily/dot-column-engraver.cc
lily/include/scm-hash.hh
lily/music-output-def.cc
lily/scm-hash.cc
ly/params-init.ly

index 9523b7ea91e67f7a7fbcb5829017bdae8c3e12c9..f36be6ed05659f67483aed5c6c95cb29333ad193 100644 (file)
@@ -84,6 +84,6 @@ ENTER_DESCRIPTION(Dot_column_engraver,
 If omitted, then dots appear on top of the notes.
 ",
 /* creats*/       "DotColumn",
-/* acks  */       "dot-column-interface stem-interface",
+/* acks  */       "rhythmic-head-interface dot-column-interface stem-interface",
 /* reads */       "",
 /* write */       "");
index 5b50c22c0179833f3bb5250f2d09e67a5c3b97a4..ba13e2ef06188824637ca80068fdced953058350 100644 (file)
 #define SCM_HASH_HH
 
 
-#include <map>
-
 #include "lily-guile.hh"
 #include "smobs.hh"
 
 
-struct SCM_less
-{
-  bool operator () (SCM s1, SCM s2) const
-  {
-    return long (s1) < long (s2);
-  }
-};
-
-typedef std::map<SCM,SCM, SCM_less> Scm_stl_map;
-
 /**
    auto resizing hash table. 
 
@@ -58,8 +46,9 @@ typedef std::map<SCM,SCM, SCM_less> Scm_stl_map;
 
   - use GUILE hashtables iso STL.
  */
-class Scheme_hash_table :  private Scm_stl_map
-{
+
+class Scheme_hash_table
+{  
 public:
   bool try_retrieve (SCM key, SCM *val);
   bool elem_b (SCM key) const;
@@ -75,8 +64,13 @@ public:
   Scheme_hash_table (Scheme_hash_table const &);
 
   SCM to_alist () const;
+private:
+  SCM hash_tab_;
+  unsigned elt_count_;
+  
   DECLARE_SMOBS (Scheme_hash_table,foo);
 };
 
+
 #endif /* SCM_HASH_HH */
 
index c37cf1178b9dee97f18c8c024bc1564df7d87cf7..308b02577336d62ae691d63c9690c9d98b6a702e 100644 (file)
@@ -128,9 +128,9 @@ Music_output_def::get_global_translator_p ()
 int
 Music_output_def::print_smob (SCM s, SCM p, scm_print_state *)
 {
-  Translator_def * def = unsmob_translator_def (s);
+  Music_output_def * def = unsmob_music_output_def (s);
   scm_puts ("#<Music_output_def ", p);
-  scm_write (def->type_name_, p);
+  //scm_write (def->type_name_, p);
   scm_puts (">", p);
   return 1;
 }
index 08cac970949a14a460360f7035c68583e95e2c71..b8bc8d8d03a28577e4fcecda3ca6b57286eea00d 100644 (file)
 #include "scm-hash.hh"
 #include "ly-smobs.icc"
 
+void
+copy_scm_hashes (SCM dest, SCM src)
+{
+  for (int i = SCM_LENGTH(src); i--;)
+    for (SCM s = scm_vector_ref (src, SCM_MAKINUM (i)); ly_pair_p(s); s = ly_cdr (s))
+      {
+       scm_hashq_set_x (dest, ly_caar (s), ly_cdar (s));
+      }
+}
+
 
 Scheme_hash_table::Scheme_hash_table ()
 {
+  hash_tab_ = SCM_EOL;
   smobify_self ();
+  hash_tab_ = scm_make_vector (gh_int2scm (119), SCM_EOL);
+  elt_count_ = 0;
 }
 
 
 Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src)
-  : Scm_stl_map (src)
+
 {
+  hash_tab_ = SCM_EOL;
+  elt_count_ = src.elt_count_;
   smobify_self ();
+
+  hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11 ), SCM_EOL);  
+  copy_scm_hashes (hash_tab_, src.hash_tab_);
 }
 
 void
 Scheme_hash_table::operator = (Scheme_hash_table const & src)
 {
-  Scm_stl_map::operator = (src);
-       
-  // we do not copy the self_scm () field!
+  if (&src == this)
+    return;
+  
+  elt_count_ = src.elt_count_;
+  hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11), SCM_EOL);  
+  copy_scm_hashes (hash_tab_, src.hash_tab_);
 }
 
 SCM
 Scheme_hash_table::mark_smob (SCM s)
 {
-  /*
-    can't typecheck naively, since GC bit lives in CAR of S
-   */
-  
   Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
-
-  for (Scm_stl_map::const_iterator i= me->begin (); i != me->end (); i++)
-    {
-      scm_gc_mark ((*i).first);
-      scm_gc_mark ((*i).second);
-    }
+  scm_gc_mark (me->hash_tab_);
   return SCM_EOL;
 }
 
@@ -54,54 +66,72 @@ Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*)
 {
   assert (unsmob (s));
   char str[1000];
-  sprintf (str, "#<Scheme_hash_table 0x%0x ", s);
-  scm_puts (str, p);      
-  Scheme_hash_table *me = unsmob (s);
-  for (Scm_stl_map::const_iterator i = me->begin (); i != me->end (); i++)
-    {
-      scm_display ((*i).first, p);
-      scm_puts (" = ",p);      
-      scm_display ((*i).second, p);
-      scm_puts ("\n",p);            
-    }
-  scm_puts ("> ",p);        
-  return 1;
+  sprintf (str, "#<Scheme_hash_table 0x%0lx ", SCM_UNPACK(s));
+   Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s);
+   scm_display (me->hash_tab_, p);      
+   scm_puts ("> ",p);        
+   return 1;
 }
 
 bool
 Scheme_hash_table::try_retrieve (SCM k, SCM *v)
 {
-  Scm_stl_map ::const_iterator i (find (k));
-  bool found = i != end ();
-  if (found)
-    *v = (*i).second;
-  return found;
+  SCM handle = scm_hashq_get_handle (hash_tab_, k);
+  if (ly_pair_p (handle))
+    {
+      *v = ly_cdr (handle);
+      return true;
+    }
+  else
+    return false;
+
 }
 
 bool
 Scheme_hash_table::elem_b (SCM k) const
 {
-  Scm_stl_map::const_iterator i (find (k));
-  return i != end ();
+  return ly_pair_p (scm_hashq_get_handle (hash_tab_, k));
 }
 
 void
 Scheme_hash_table::set (SCM k, SCM v)
 {
- (*this)[k] = v;
+  assert (gh_symbol_p (k));
+  SCM handle = scm_hashq_create_handle_x (hash_tab_, k, SCM_UNDEFINED);
+  if (ly_cdr (handle) == SCM_UNDEFINED)
+    {
+      elt_count_++;
+    }
+  
+  gh_set_cdr_x (handle, v);
+
+  /*
+    resize if getting too large.
+  */
+  if (elt_count_ > 2 * SCM_LENGTH (hash_tab_))
+    {
+      SCM nh = scm_make_vector (gh_int2scm (3* elt_count_+1), SCM_EOL);
+      copy_scm_hashes (nh, hash_tab_);
+      hash_tab_ = nh;
+    }
+  
 }
 
 // UGH. 
 SCM
 Scheme_hash_table::get (SCM k)const
 {
-  return (* (Scheme_hash_table*)this)[k]; 
+  /*
+    42 will stick out like a sore thumb, hopefully.
+   */
+  return scm_hashq_ref (hash_tab_, k, SCM_MAKINUM(42));
 }
 
 void
 Scheme_hash_table::remove (SCM k)
 {
-  Scm_stl_map::erase (k);
+  scm_hashq_remove_x (hash_tab_, k);
+  elt_count_ --;
 }
 
 Scheme_hash_table::~Scheme_hash_table ()
@@ -112,13 +142,17 @@ SCM
 Scheme_hash_table::to_alist () const
 {
   SCM l = SCM_EOL;
-  for (Scm_stl_map ::const_iterator i = begin (); i != end (); i++)
-    l = gh_cons (gh_cons ((*i).first, (*i).second), l);
+  for (int i = SCM_LENGTH(hash_tab_); i--;)
+    for (SCM s = scm_vector_ref (hash_tab_, gh_int2scm (i)); ly_pair_p(s); s = ly_cdr (s))
+      {
+       l = scm_acons (ly_caar (s), ly_cdar (s), l);
+      }
   return l;  
 }
 
 
 
+
 IMPLEMENT_UNSMOB (Scheme_hash_table,scheme_hash);
 IMPLEMENT_SMOBS (Scheme_hash_table);
 IMPLEMENT_DEFAULT_EQUAL_P (Scheme_hash_table);
index 8bf36b290628f9478587353362cfca70a6279577..afc951023faeef64a59b71efaaf25620a4f712b3 100644 (file)
@@ -5,7 +5,7 @@
 papersizename = \papersize 
 
 % ly2dvi now uses `papersize' internally (and on cmd line)
-papersize = \papersize
+%papersize = \papersize
 
 % FIXME
 % direct PostScript line height for single line staves