X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscm-hash.cc;h=3eb40ada7bfe929576fc50cb1c081d368951b488;hb=816e284fa77d827aef6fd0dc73d67296520dfe33;hp=16c3a80bb0c737450b02e71edf830fbe5164fb63;hpb=28976d28a04cfb9abe97af7214d7dce11f732604;p=lilypond.git diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index 16c3a80bb0..3eb40ada7b 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -1,167 +1,97 @@ -/* - scm-hash.cc -- implement Scheme_hash_table - - source file of the GNU LilyPond music typesetter - - (c) 1999--2004 Han-Wen Nienhuys - - */ -#include - -#include "scm-hash.hh" -#include "ly-smobs.icc" - /* - Return: number of objects. - */ -int -copy_scm_hashes (SCM dest, SCM src) -{ - int k = 0; - for (int i = SCM_VECTOR_LENGTH (src); i--;) - for (SCM s = scm_vector_ref (src, SCM_MAKINUM (i)); is_pair (s); s = ly_cdr (s)) - { - scm_hashq_set_x (dest, ly_caar (s), ly_cdar (s)); - k++; - } - return k ; -} + This file is part of LilyPond, the GNU music typesetter. + Copyright (C) 1999--2015 Han-Wen Nienhuys -Scheme_hash_table::Scheme_hash_table () -{ - hash_tab_ = SCM_EOL; - smobify_self (); - hash_tab_ = scm_make_vector (scm_int2num (119), SCM_EOL); - elt_count_ = 0; -} + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src) + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ -{ - hash_tab_ = SCM_EOL; - elt_count_ = 0; - smobify_self (); +#include "scm-hash.hh" - hash_tab_ = scm_make_vector (scm_int2num (src.elt_count_ >? 11 ), SCM_EOL); - elt_count_ = copy_scm_hashes (hash_tab_, src.hash_tab_); -} +#include -void -Scheme_hash_table::operator = (Scheme_hash_table const & src) -{ - if (&src == this) - return; - - hash_tab_ = scm_make_vector (scm_int2num (src.elt_count_ >? 11), SCM_EOL); - elt_count_ = copy_scm_hashes (hash_tab_, src.hash_tab_); -} +const char * const Scheme_hash_table::type_p_name_ = 0; SCM -Scheme_hash_table::mark_smob (SCM s) +Scheme_hash_table::make_smob () { - Scheme_hash_table *me = (Scheme_hash_table*) SCM_CELL_WORD_1 (s); - scm_gc_mark (me->hash_tab_); - return SCM_EOL; + return Smob1::make_smob (scm_c_make_hash_table (119)); } int -Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state*) +Scheme_hash_table::print_smob (SCM p, scm_print_state *) const { - assert (unsmob (s)); - char str[1000]; - sprintf (str, "#hash_tab_, p); - scm_puts ("> ",p); + scm_puts ("# ", p); return 1; } bool Scheme_hash_table::try_retrieve (SCM k, SCM *v) { - SCM handle = scm_hashq_get_handle (hash_tab_, k); - if (is_pair (handle)) + + SCM handle = scm_hashq_get_handle (hash_tab (), k); + if (scm_is_pair (handle)) { - *v = ly_cdr (handle); + *v = scm_cdr (handle); return true; } else return false; - } bool Scheme_hash_table::contains (SCM k) const { - return is_pair (scm_hashq_get_handle (hash_tab_, k)); + return scm_is_pair (scm_hashq_get_handle (hash_tab (), k)); } void Scheme_hash_table::set (SCM k, SCM v) { - assert (is_symbol (k)); - SCM handle = scm_hashq_create_handle_x (hash_tab_, k, SCM_UNDEFINED); - if (ly_cdr (handle) == SCM_UNDEFINED) - { - elt_count_++; - } - + assert (scm_is_symbol (k)); + SCM handle = scm_hashq_create_handle_x (hash_tab (), k, SCM_UNDEFINED); scm_set_cdr_x (handle, v); - - /* - resize if getting too large. - */ - if (elt_count_ > 2 * SCM_VECTOR_LENGTH (hash_tab_)) - { - SCM nh = scm_make_vector (scm_int2num (3* elt_count_+1), SCM_EOL); - elt_count_ = copy_scm_hashes (nh, hash_tab_); - hash_tab_ = nh; - } } -// UGH. SCM -Scheme_hash_table::get (SCM k)const +Scheme_hash_table::get (SCM k) const { - /* - 42 will stick out like a sore thumb, hopefully. - */ - return scm_hashq_ref (hash_tab_, k, SCM_MAKINUM (42)); + /* SCM_UNSPECIFIED will stick out like a sore thumb, hopefully. + */ + return scm_hashq_ref (hash_tab (), k, SCM_UNSPECIFIED); } void Scheme_hash_table::remove (SCM k) { - scm_hashq_remove_x (hash_tab_, k); - /* - don't decrease elt_count_ , as this may cause underflow. The exact - value of elt_count_ is not important. - */ + scm_hashq_remove_x (hash_tab (), k); } -Scheme_hash_table::~Scheme_hash_table () +static SCM +collect_handles (void * /* closure */, + SCM key, + SCM value, + SCM result) { + return scm_acons (key, value, result); } SCM Scheme_hash_table::to_alist () const { - SCM l = SCM_EOL; - for (int i = SCM_VECTOR_LENGTH (hash_tab_); i--;) - for (SCM s = scm_vector_ref (hash_tab_, scm_int2num (i)); is_pair (s); s = ly_cdr (s)) - { - l = scm_acons (ly_caar (s), ly_cdar (s), l); - } - return l; + return scm_internal_hash_fold ((scm_t_hash_fold_fn) &collect_handles, + NULL, SCM_EOL, hash_tab ()); } - - - - - -IMPLEMENT_SMOBS (Scheme_hash_table); -IMPLEMENT_DEFAULT_EQUAL_P (Scheme_hash_table); - -