9 #ifndef __IPCACHEDRESULTS_HPP__
10 #define __IPCACHEDRESULTS_HPP__
21 # define IP_DEBUG_CACHE
24 # include "IpDebug.hpp"
31 class DependentResult;
75 static const Index dbg_verbosity;
96 const std::vector<const TaggedObject*>& dependents,
97 const std::vector<Number>& scalar_dependents);
104 const std::vector<const TaggedObject*>& dependents,
105 const std::vector<Number>& scalar_dependents)
const;
111 const std::vector<const TaggedObject*>& dependents);
117 const std::vector<const TaggedObject*>& dependents)
const;
208 const std::vector<Number>& scalar_dependents);
261 #ifdef IP_DEBUG_CACHE
263 static const Index dbg_verbosity;
269 DependentResult(
const T& result,
const std::vector<const TaggedObject*>& dependents,
270 const std::vector<Number>& scalar_dependents);
293 const std::vector<Number>& scalar_dependents)
const;
340 #ifdef IP_DEBUG_CACHE
352 const std::vector<const TaggedObject*>& dependents,
353 const std::vector<Number>& scalar_dependents)
357 dependent_tags_(dependents.size()),
358 scalar_dependents_(scalar_dependents)
360 #ifdef IP_DEBUG_CACHE
361 DBG_START_METH(
"DependentResult<T>::DependentResult()", dbg_verbosity);
364 for (
Index i=0; i<(
Index)dependents.size(); i++) {
385 #ifdef IP_DEBUG_CACHE
386 DBG_START_METH(
"DependentResult<T>::~DependentResult()", dbg_verbosity);
409 #ifdef IP_DEBUG_CACHE
410 DBG_START_METH(
"DependentResult<T>::RecieveNotification", dbg_verbosity);
413 if (notify_type == NT_Changed || notify_type==NT_BeingDestroyed) {
422 const std::vector<Number>& scalar_dependents)
const
424 #ifdef IP_DEBUG_CACHE
425 DBG_START_METH(
"DependentResult<T>::DependentsIdentical", dbg_verbosity);
427 DBG_ASSERT(dependents.size() == dependent_tags_.size());
432 if (dependents.size() != dependent_tags_.size()
433 || scalar_dependents.size() != scalar_dependents_.size()) {
437 for (
Index i=0; i<(
Index)dependents.size(); i++) {
438 if ( (dependents[i] && dependents[i]->GetTag() != dependent_tags_[i])
439 || (!dependents[i] && dependent_tags_[i] != 0) ) {
445 for (
Index i=0; i<(
Index)scalar_dependents.size(); i++) {
446 if (scalar_dependents[i] != scalar_dependents_[i]) {
460 #ifdef IP_DEBUG_CACHE
471 #ifdef IP_DEBUG_CACHE
480 max_cache_size_(max_cache_size),
481 cached_results_(NULL)
483 #ifdef IP_DEBUG_CACHE
492 #ifdef IP_DEBUG_CACHE
493 DBG_START_METH(
"CachedResults<T>::!CachedResults()", dbg_verbosity);
496 if (cached_results_) {
499 iter != cached_results_->end();
503 delete cached_results_;
516 const std::vector<const TaggedObject*>& dependents,
517 const std::vector<Number>& scalar_dependents)
519 #ifdef IP_DEBUG_CACHE
520 DBG_START_METH(
"CachedResults<T>::AddCachedResult", dbg_verbosity);
523 CleanupInvalidatedResults();
527 if (!cached_results_) {
528 cached_results_ =
new std::list<DependentResult<T>*>;
530 cached_results_->push_front(newResult);
533 if (max_cache_size_ >= 0) {
536 if ((
Int)cached_results_->size() > max_cache_size_) {
537 delete cached_results_->back();
538 cached_results_->pop_back();
542 #ifdef IP_DEBUG_CACHE
543 DBG_EXEC(2, DebugPrintCachedResults());
550 const std::vector<const TaggedObject*>& dependents)
552 std::vector<Number> scalar_dependents;
553 AddCachedResult(result, dependents, scalar_dependents);
558 const std::vector<Number>& scalar_dependents)
const
560 #ifdef IP_DEBUG_CACHE
561 DBG_START_METH(
"CachedResults<T>::GetCachedResult", dbg_verbosity);
564 if (!cached_results_)
567 CleanupInvalidatedResults();
569 bool retValue =
false;
570 typename std::list< DependentResult<T>* >::const_iterator iter;
571 for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) {
572 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
573 retResult = (*iter)->GetResult();
579 #ifdef IP_DEBUG_CACHE
580 DBG_EXEC(2, DebugPrintCachedResults());
588 T& retResult,
const std::vector<const TaggedObject*>& dependents)
const
590 std::vector<Number> scalar_dependents;
591 return GetCachedResult(retResult, dependents, scalar_dependents);
598 #ifdef IP_DEBUG_CACHE
599 DBG_START_METH(
"CachedResults<T>::AddCachedResult1Dep", dbg_verbosity);
602 std::vector<const TaggedObject*> dependents(1);
603 dependents[0] = dependent1;
605 AddCachedResult(result, dependents);
611 #ifdef IP_DEBUG_CACHE
612 DBG_START_METH(
"CachedResults<T>::GetCachedResult1Dep", dbg_verbosity);
615 std::vector<const TaggedObject*> dependents(1);
616 dependents[0] = dependent1;
618 return GetCachedResult(retResult, dependents);
626 #ifdef IP_DEBUG_CACHE
627 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
630 std::vector<const TaggedObject*> dependents(2);
631 dependents[0] = dependent1;
632 dependents[1] = dependent2;
634 AddCachedResult(result, dependents);
640 #ifdef IP_DEBUG_CACHE
641 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
644 std::vector<const TaggedObject*> dependents(2);
645 dependents[0] = dependent1;
646 dependents[1] = dependent2;
648 return GetCachedResult(retResult, dependents);
657 #ifdef IP_DEBUG_CACHE
658 DBG_START_METH(
"CachedResults<T>::AddCachedResult2dDep", dbg_verbosity);
661 std::vector<const TaggedObject*> dependents(3);
662 dependents[0] = dependent1;
663 dependents[1] = dependent2;
664 dependents[2] = dependent3;
666 AddCachedResult(result, dependents);
674 #ifdef IP_DEBUG_CACHE
675 DBG_START_METH(
"CachedResults<T>::GetCachedResult2Dep", dbg_verbosity);
678 std::vector<const TaggedObject*> dependents(3);
679 dependents[0] = dependent1;
680 dependents[1] = dependent2;
681 dependents[2] = dependent3;
683 return GetCachedResult(retResult, dependents);
688 const std::vector<Number>& scalar_dependents)
690 if (!cached_results_)
693 CleanupInvalidatedResults();
695 bool retValue =
false;
696 typename std::list< DependentResult<T>* >::const_iterator iter;
697 for (iter = cached_results_->begin(); iter != cached_results_->end();
699 if ((*iter)->DependentsIdentical(dependents, scalar_dependents)) {
700 (*iter)->Invalidate();
712 if (!cached_results_)
715 typename std::list< DependentResult<T>* >::const_iterator iter;
716 for (iter = cached_results_->begin(); iter != cached_results_->end();
718 (*iter)->Invalidate();
721 CleanupInvalidatedResults();
728 max_cache_size_ = max_cache_size;
734 #ifdef IP_DEBUG_CACHE
735 DBG_START_METH(
"CachedResults<T>::CleanupInvalidatedResults", dbg_verbosity);
738 if (!cached_results_)
741 typename std::list< DependentResult<T>* >::iterator iter;
742 iter = cached_results_->begin();
743 while (iter != cached_results_->end()) {
744 if ((*iter)->IsStale()) {
745 typename std::list< DependentResult<T>* >::iterator
746 iter_to_remove = iter;
749 cached_results_->erase(iter_to_remove);
750 delete result_to_delete;
761 #ifdef IP_DEBUG_CACHE
762 DBG_START_METH(
"CachedResults<T>::DebugPrintCachedResults", dbg_verbosity);
764 if (!cached_results_) {
765 DBG_PRINT((2,
"Currentlt no cached results:\n"));
768 typename std::list< DependentResult<T>* >::const_iterator iter;
769 DBG_PRINT((2,
"Current set of cached results:\n"));
770 for (iter = cached_results_->begin(); iter != cached_results_->end(); iter++) {
771 DBG_PRINT((2,
" DependentResult:0x%x\n", (*iter)));