bool IsRequestedFactory(const FactoryBase* factory) const { TwoKeyMap::const_iterator it = map_.find(factory); if (it == map_.end()) return false; for (SubMap::const_iterator sit = it->second.begin(); sit != it->second.end(); sit++) if (IsRequested(sit->second)) return true; return false; }
//! Test whether a need has been requested. Note: this tells nothing about whether the need's value exists. bool IsRequested(const std::string& ename, const FactoryBase* factory = NoFactory::get()) const { if (!IsKey(factory, ename)) return false; try { return IsRequested(Get(factory, ename)); } catch (...) { return false; } }
//! Delete data that have been retained after the setup phase (using Keep(), AddKeepFlag(), or internal MueLu logic). // Special cases: // - If entry (ename, factory) does not exist, nothing is done. // - If entry exists but counter !=, entry cannot be desallocated before counter set to 0 (using Release()) so an exeption is thrown. void Delete(const std::string& ename, const FactoryBase* factory) { // Note: do not add default value for input parameter 'factory' if (!IsKey(ename, factory)) { return; } // if entry (ename, factory) does not exist, nothing is done. // Precondition: // Delete() should only be called if counter == 0 // Note: It better to throw an exception rather than deleting the data if counter != 0 because users are not supposed to manipulate data with counter != 0 TEUCHOS_TEST_FOR_EXCEPTION(IsRequested(ename, factory) == true, Exceptions::RuntimeError, "MueLu::Level::Delete(): IsRequested() == true. Ref counter != 0. You are not allowed to delete data that are still in use."); // If counter == 0 and entry exists, this means that a keep flag is set. Or there is an internal logic problem. TEUCHOS_TEST_FOR_EXCEPTION(GetKeepFlag(ename, factory) == 0, Exceptions::RuntimeError, "MueLu::Level::Delete(), Keep flag == 0?"); RemoveKeepFlag(ename, factory, MueLu::All); // will delete the data if counter == 0 // Post condition: data must have been deleted TEUCHOS_TEST_FOR_EXCEPTION(IsAvailable(ename, factory) == true, Exceptions::RuntimeError, "MueLu::Level::Delete(): Internal error (Post condition). Data have not been deleted."); }
void Set(const std::string& ename, const T& entry, const FactoryBase* factory = NoFactory::get()) { const FactoryBase* fac = GetFactory(ename, factory); if (fac == NoFactory::get()) { // Any data set with a NoFactory gets UserData keep flag by default AddKeepFlag(ename, NoFactory::get(), MueLu::UserData); } // Store entry only if data have been requested (or any keep flag) if (IsRequested(ename, factory) || GetKeepFlag(ename, factory) != 0) { TEUCHOS_TEST_FOR_EXCEPTION(!IsKey(factory, ename), Exceptions::RuntimeError, "" + ename + " not found in"); map_[factory][ename]->SetData(entry); } else { GetOStream(Warnings0) << "Level::Set: unable to store \"" << ename << "\" generated by factory " << factory << " on level " << toString(GetLevelID()) << ", as it has not been requested and no keep flags were set for it" << std::endl; } } // Set