X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fremember.cpp;h=701a27e7b7c42a56fe229c88093be052853ecc56;hp=9b06a464d8d9e33e8b5672fe6705d9d1637a73f1;hb=8c732512ca284f2a586694c7c33f1a0a4a68cef7;hpb=7d10a252470cc6501b2c66bf9d6774c79b093761 diff --git a/ginac/remember.cpp b/ginac/remember.cpp index 9b06a464..701a27e7 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-2008 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,18 +18,16 @@ * * 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 @@ -38,23 +36,23 @@ namespace GiNaC { 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: + 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; + } + 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_successful_hits(); - ++it; - while (it!=end()) { - if (it->get_successful_hits()get_successful_hits(); - lowest_hits_it=it; - } - ++it; + } + 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()is_equal(f)) { - result=cit->get_result(); + const_iterator i = begin(), iend = end(); + while (i != iend) { + if (i->is_equal(f)) { + result = i->get_result(); return true; } + ++i; } return false; } @@ -149,46 +148,43 @@ remember_table::remember_table(unsigned s, unsigned as, unsigned 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); + 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); + 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 = std::vector(); + return rt; } -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC