X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fremember.cpp;h=53cc4cee2130f4656c721ac39787b650717747a4;hp=9b06a464d8d9e33e8b5672fe6705d9d1637a73f1;hb=547db2f0380c03c7d013aa8bda36aa33ff5559e1;hpb=7d10a252470cc6501b2c66bf9d6774c79b093761 diff --git a/ginac/remember.cpp b/ginac/remember.cpp index 9b06a464..53cc4cee 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-2004 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 @@ -24,12 +24,10 @@ #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; } -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC