SAGA C++ API 1.6
metric.cpp
Go to the documentation of this file.
00001 //  Copyright (c) 2005-2007 Andre Merzky (andre@merzky.net)
00002 //  Copyright (c) 2005-2009 Hartmut Kaiser
00003 // 
00004 //  Use, modification and distribution is subject to the Boost Software
00005 //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
00006 //  http://www.boost.org/LICENSE_1_0.txt)
00007 
00008 // include spec sections
00009 #include <boost/assign/list_of.hpp>
00010 #include <boost/assign/list_inserter.hpp> // boost::assign::insert()
00011 #include <boost/assign/std/vector.hpp>
00012 
00013 #include <saga/saga/metric.hpp>
00014 #include <saga/impl/engine/metric.hpp>
00015 #include <saga/impl/engine/context_base.hpp>
00016 
00017 #include <saga/saga/detail/attribute_impl.hpp>
00018 
00020 namespace saga 
00021 {
00022   // delegate all action to the implementation
00023   metric::metric (void)
00024     : saga::object (new saga::impl::metric ())
00025   {
00026   }
00027 
00028   metric::metric (saga::impl::metric *impl)
00029     : saga::object (impl)
00030   {
00031   }
00032 
00033   metric::metric (saga::object target, 
00034           std::string name, std::string desc, std::string mode, 
00035           std::string unit, std::string type, std::string val)
00036     : saga::object (new saga::impl::metric(target))
00037   {
00038     if (mode != attributes::metric_mode_readonly  &&
00039         mode != attributes::metric_mode_readwrite &&
00040         mode != attributes::metric_mode_final)
00041     {
00042       SAGA_THROW("metric::metric: bad 'mode' parameter", BadParameter);
00043     }
00044 
00045     // initialize attribute maps
00046     std::map <std::string, std::string> attributes_scalar_ro;
00047     std::map <std::string, std::string> attributes_scalar_rw;
00048     std::vector<std::string> valid_keys;
00049 
00050     // value is read only depending on given mode
00051     using namespace boost::assign;
00052 
00053     valid_keys += 
00054         attributes::metric_name,
00055         attributes::metric_description,
00056         attributes::metric_mode,
00057         attributes::metric_unit,
00058         attributes::metric_type,
00059         attributes::metric_value
00060       ;
00061     this->init_keynames(valid_keys);
00062 
00063     insert(attributes_scalar_ro)
00064       (attributes::metric_name,        name)
00065       (attributes::metric_description, desc)
00066       (attributes::metric_mode,        mode)
00067       (attributes::metric_unit,        unit)
00068       (attributes::metric_type,        type);
00069       
00070     if (mode != attributes::metric_mode_readwrite)
00071     {
00072       insert(attributes_scalar_ro) (attributes::metric_value, val);
00073     }
00074     else
00075     {
00076       insert(attributes_scalar_rw) (attributes::metric_value, val);
00077     }
00078 
00079     // initialize attribute implementation
00080     this->init (attributes_scalar_ro, attributes_scalar_rw);
00081     this->init (false, true);   // metrics have a cache only attribute implementation
00082   }
00083 
00084   metric::~metric (void)
00085   {
00086   }   
00087 
00089   metric::metric (saga::object const& o)
00090     : saga::object (o)
00091   {
00092       if (this->get_type() != saga::object::Metric)
00093       {
00094           SAGA_THROW("Bad type conversion.", saga::BadParameter);
00095       }
00096   }
00097 
00098   metric &metric::operator= (saga::object const& o)
00099   {
00100       saga::object::operator=(o);
00101       if (this->get_type() != saga::object::Metric)
00102       {
00103           SAGA_THROW("Bad type conversion.", saga::BadParameter);
00104       }
00105       return *this;
00106   }
00107 
00109   saga::impl::metric* metric::get_impl (void) const
00110   {
00111     typedef saga::object base_type;
00112     return static_cast<saga::impl::metric*>(this->base_type::get_impl());
00113   }
00114 
00115   TR1::shared_ptr <saga::impl::metric> metric::get_impl_sp (void) const
00116   {
00117     typedef saga::object base_type;
00118     return TR1::static_pointer_cast<saga::impl::metric>(
00119         this->base_type::get_impl_sp());
00120   }
00121 
00123 
00124   bool operator== (metric const & lhs,
00125                    metric const & rhs)
00126   {
00127     return (lhs.get_impl() == rhs.get_impl()); 
00128   }
00130 
00131   metric::metric_cookie 
00132   metric::add_callback(saga::callback f)
00133   {
00134     return get_impl()->add_callback(f);
00135   }
00136 
00137   void metric::remove_callback(metric_cookie cookie)
00138   {
00139     get_impl()->remove_callback(cookie);
00140   }
00141 
00142   void metric::fire (saga::context ctx)
00143   {
00144     std::string mode (get_attribute(saga::attributes::metric_mode));
00145     if (mode == saga::attributes::metric_mode_readonly)
00146     {
00147       std::string name(get_attribute(saga::attributes::metric_name));
00148       SAGA_THROW("Metric: '" + name + "' is readonly.", saga::PermissionDenied);
00149     }
00150     get_impl()->fire (ctx);
00151   }
00152 
00153   namespace detail
00154   {
00156     //  implement the attribute functions (we need to explicitly specialize 
00157     //  the template because the functions are not implemented inline)
00158     template struct SAGA_EXPORT_REPEAT attribute<metric>;
00159 
00160     template struct SAGA_EXPORT attribute_priv<metric, task_base::Sync>;
00161     template struct SAGA_EXPORT attribute_priv<metric, task_base::Async>;
00162     template struct SAGA_EXPORT attribute_priv<metric, task_base::Task>;
00163 
00164     template struct SAGA_EXPORT attribute_sync<metric>;
00165   }
00166 
00168 } // namespace saga
00169 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines