X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fremember.cpp;h=4218a6ea917a1002973838d9f60d032479c25ea4;hp=2c442162ebb5bbf3aaf262564341b70ac5defb07;hb=c1285bb62f3a86454ca26260cf8b4352238a1fc5;hpb=703c6cebb5d3d395437e73e6935f3691aed68e0a diff --git a/ginac/remember.cpp b/ginac/remember.cpp index 2c442162..4218a6ea 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-2003 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,37 +24,35 @@ #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: + 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; } @@ -144,51 +143,48 @@ remember_table::remember_table() 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); + 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