00001 
00002 
00003 
00004 #ifndef SUNDANCE_OBJECTWITHVERBOSITY_H
00005 #define SUNDANCE_OBJECTWITHVERBOSITY_H
00006 
00007 #include "SundanceDefs.hpp"
00008 #include "PlayaObjectWithVerbosity.hpp"
00009 #include "SundanceParamUtils.hpp"
00010 #include "Teuchos_ParameterList.hpp"
00011 
00012 namespace Sundance
00013 {
00014 
00015 using Teuchos::ParameterList;
00016 using Teuchos::RCP;
00017 using Teuchos::rcp;
00018 using Teuchos::FancyOStream;
00019 using Teuchos::ParameterEntry;
00020 
00021 
00022 
00023 
00024 
00025 template <class X>
00026 class VerbosityTraits
00027 {
00028 public:
00029   static RCP<ParameterList> defaultVerbParams()
00030     {return X::defaultVerbParams();}
00031 };
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 template <class X>
00068 class ObjectWithClassVerbosity : public Playa::ObjectWithVerbosity
00069 {
00070 public:
00071 
00072   ObjectWithClassVerbosity(int verb=classVerbosity())
00073     : Playa::ObjectWithVerbosity(verb) {;}
00074 
00075 
00076   static int& classVerbosity() 
00077     {
00078       static int rtn = 0;
00079       return rtn;
00080     }
00081 
00082 };
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 template <class X> int& verbosity() 
00091 {
00092   return X::classVerbosity();
00093 }
00094 
00095 template <class X>
00096 class ParameterControlledObjectWithVerbosity 
00097   : public ObjectWithClassVerbosity<X>
00098 {
00099 public:
00100 
00101   ParameterControlledObjectWithVerbosity() : ObjectWithClassVerbosity<X>() {;}
00102 
00103 
00104   ParameterControlledObjectWithVerbosity(const std::string& objName, const ParameterList& p)
00105     : ObjectWithClassVerbosity<X>(),
00106       verbControlParams_() 
00107     {
00108       RCP<ParameterList> defaults = VerbosityTraits<X>::defaultVerbParams();
00109       TEUCHOS_TEST_FOR_EXCEPTION(defaults->name() != objName, std::runtime_error,
00110         "mismatched ParameterList names for verbosity control: expected "
00111         << defaults->name() << ", got " << objName);
00112       TEUCHOS_TEST_FOR_EXCEPTION(defaults->name() != p.name(), std::runtime_error,
00113         "mismatched ParameterList names for verbosity control: expected "
00114         << defaults->name() << ", got " << p.name());
00115       verbControlParams_ = rcp(new ParameterList(mergeParams(*defaults, p)));
00116     }
00117 
00118 
00119   int verbLevel(const std::string& context) const 
00120     {
00121       const ParameterEntry* pe = verbControlParams_->getEntryPtr(context);
00122       TEUCHOS_TEST_FOR_EXCEPTION(pe==0, std::runtime_error,
00123         "parameter with name \"" << context << "\" not found in verbosity "
00124         "control parameter list " << verbControlParams_);
00125       TEUCHOS_TEST_FOR_EXCEPTION(pe->getAny().type() != typeid(int),
00126         std::runtime_error,
00127         "context parameter name \"" 
00128         << context << "\" does not have an integer value in verbosity "
00129         "control parameter list " << verbControlParams_);
00130 
00131       return Teuchos::any_cast<int>(pe->getAny());
00132     }
00133 
00134 
00135   const ParameterList& verbSublist(const std::string& name) const 
00136     {
00137       TEUCHOS_TEST_FOR_EXCEPTION(!verbControlParams_->isSublist(name),
00138         std::runtime_error,
00139         "context parameter name \"" 
00140         << name << "\" is not a sublist in verbosity "
00141         "control parameter list " << *verbControlParams_);
00142 
00143       return verbControlParams_->sublist(name);
00144     }
00145 
00146 
00147   ParameterList mergeParams(const ParameterList& pDef, const ParameterList& pIn) const
00148     {
00149       return mergeParamLists(pDef, pIn);
00150     }
00151        
00152 
00153   const ParameterList params() const {return *verbControlParams_;}
00154 
00155 
00156   RCP<ParameterList> modifiableParams() const {return verbControlParams_;}
00157 private:
00158   RCP<ParameterList> verbControlParams_;
00159 };
00160 
00161 
00162 
00163 }
00164 
00165 
00166 
00167 
00168 
00169 #endif