X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fremember.cpp;h=68cbe24477df3790c38122f9f25da25b208abd9c;hp=21e19716ca1f8961fad29fd231c374cf45c04b5a;hb=3cb110c5ca2330a0a155660f32d42e3d0ebc0db1;hpb=bd2d7351b89743eb68ce7d3bfa7ab62c331f9522 diff --git a/ginac/remember.cpp b/ginac/remember.cpp index 21e19716..68cbe244 100644 --- a/ginac/remember.cpp +++ b/ginac/remember.cpp @@ -4,7 +4,7 @@ * in GiNaC functions */ /* - * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2007 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,43 +18,41 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "function.h" -#include "utils.h" // for log_2 +#include "utils.h" #include "remember.h" -#ifndef NO_NAMESPACE_GINAC namespace GiNaC { -#endif // ndef NO_NAMESPACE_GINAC ////////// // class remember_table_entry ////////// -remember_table_entry::remember_table_entry(function const & f, ex const & r) : - hashvalue(f.gethash()), seq(f.seq), result(r) +remember_table_entry::remember_table_entry(function const & f, ex const & r) + : hashvalue(f.gethash()), seq(f.seq), result(r) { - ++last_access=access_counter; - successful_hits=0; + ++last_access = access_counter; + successful_hits = 0; } bool remember_table_entry::is_equal(function const & f) const { - GINAC_ASSERT(f.seq.size()==seq.size()); - if (f.gethash()!=hashvalue) return false; - for (unsigned i=0; i=max_assoc_size)) { - // table is full, we must delete an older entry - GINAC_ASSERT(size()>0); // there must be at least one entry - - switch (remember_strategy) { - case remember_strategies::delete_cyclic: - // delete oldest entry (first in list) - erase(begin()); - break; - case remember_strategies::delete_lru: - { - // delete least recently used entry - iterator it=begin(); - iterator lowest_access_it=it; - unsigned long lowest_access=it->get_last_access(); - ++it; - while (it!=end()) { - if (it->get_last_access()get_last_access(); - lowest_access_it=it; - } - ++it; - } - erase(lowest_access_it); - } - break; - case remember_strategies::delete_lfu: - { - // delete least frequently used entry - iterator it=begin(); - iterator lowest_hits_it=it; - unsigned lowest_hits=it->get_successful_hits(); - ++it; - while (it!=end()) { - if (it->get_successful_hits()get_successful_hits(); - lowest_hits_it=it; - } - ++it; - } - erase(lowest_hits_it); - } - break; - default: - throw(std::logic_error("remember_table_list::add_entry(): invalid remember_strategy")); + if ((max_assoc_size!=0) && + (remember_strategy!=remember_strategies::delete_never) && + (size()>=max_assoc_size)) { + // table is full, we must delete an older entry + GINAC_ASSERT(size()>0); // there must be at least one entry + + switch (remember_strategy) { + case remember_strategies::delete_cyclic: { + // delete oldest entry (first in list) + erase(begin()); + break; + } + case remember_strategies::delete_lru: { + // delete least recently used entry + iterator it = begin(); + iterator lowest_access_it = it; + unsigned long lowest_access = (*it).get_last_access(); + ++it; + while (it!=end()) { + if ((*it).get_last_access()is_equal(f)) { - result=cit->get_result(); - return true; - } - } - return false; + const_iterator i = begin(), iend = end(); + while (i != iend) { + if (i->is_equal(f)) { + result = i->get_result(); + return true; + } + ++i; + } + return false; } ////////// @@ -139,56 +138,53 @@ bool remember_table_list::lookup_entry(function const & f, ex & result) const remember_table::remember_table() { - table_size=0; - max_assoc_size=0; - remember_strategy=remember_strategies::delete_never; + table_size=0; + max_assoc_size=0; + remember_strategy=remember_strategies::delete_never; } -remember_table::remember_table(unsigned s, unsigned as, unsigned strat) : - max_assoc_size(as), remember_strategy(strat) +remember_table::remember_table(unsigned s, unsigned as, unsigned strat) + : max_assoc_size(as), remember_strategy(strat) { - // we keep max_assoc_size and remember_strategy if we need to clear - // all entries - - // use some power of 2 next to s - table_size=1 << log2(s); - init_table(); + // we keep max_assoc_size and remember_strategy if we need to clear + // all entries + + // use some power of 2 next to s + table_size = 1 << log2(s); + init_table(); } bool remember_table::lookup_entry(function const & f, ex & result) const { - unsigned entry=f.gethash() & (table_size-1); - GINAC_ASSERT(entry & remember_table::remember_tables(void) +std::vector & remember_table::remember_tables() { - static std::vector * rt = new std::vector; - return *rt; + static std::vector * rt = new std::vector; + return *rt; } -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC