// src/backend/policies_gatekeeper.cc - Copyright 2005, 2006, University // of Padova, dept. of Pure and Applied // Mathematics // // This file is part of SGPEMv2. // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // SGPEMv2 is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with SGPEMv2; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "config.h" #include "policies_gatekeeper.hh" #include "policy_manager.hh" #include "policy.hh" // Include full template definition only in implementation files: #include "singleton.tcc" #include #include using std::vector; using std::map; using std::find; using std::runtime_error; using namespace sgpem; // Explicit template instantiation to allow to export symbols from the DSO. template class SG_DLLEXPORT Singleton; typedef vector::iterator ManagerIterator; typedef map::iterator ActiveIterator; vector PoliciesGatekeeper::get_registered() const { return _registered; } void PoliciesGatekeeper::register_manager(PolicyManager* manager) { assert(manager != NULL); ManagerIterator end = _registered.end(); if(find(_registered.begin(), end, manager) == end) _registered.push_back(manager); } void PoliciesGatekeeper::unregister_manager(PolicyManager* manager) { assert(manager != NULL); ManagerIterator end = _registered.end(); ManagerIterator pos = find(_registered.begin(), end, manager); if(pos != end) { deactivate_policies(*pos); _registered.erase(pos); } } Policy* PoliciesGatekeeper::get_current_policy(History* history) throw(runtime_error) { assert(history != NULL); ActiveIterator policy = _active_policies.find(history); if(policy == _active_policies.end()) throw runtime_error("No active policy associated with this " "history is available."); return policy->second; } void PoliciesGatekeeper::activate_policy(History *history, Policy* policy) { assert(history != NULL && policy != NULL); ActiveIterator end = _active_policies.end(); ActiveIterator pos = _active_policies.find(history); if(pos != end && pos->second != policy) _active_policies[history]->deactivate(); if(pos == end || pos->second != policy) { _active_policies[history] = policy; _active_policies[history]->activate(); } } PoliciesGatekeeper::PoliciesGatekeeper() {} void PoliciesGatekeeper::deactivate_policies(PolicyManager* manager) { typedef vector::iterator PolicyIterator; vector avail_policies = manager->get_avail_policies(); PolicyIterator avail_it = avail_policies.begin(); PolicyIterator avail_end = avail_policies.end(); for(; avail_it != avail_end; ++avail_it) { // TODO isn't there a way to write more compact code by using // library utilities? ActiveIterator act_it = _active_policies.begin(); for(; act_it != _active_policies.end(); ++act_it) { if(act_it->second == *avail_it) { act_it->second->deactivate(); _active_policies.erase(act_it); } } } }