Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Teuchos_StandardDependencies.cpp
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 //                    Teuchos: Common Tools Package
00005 //                 Copyright (2004) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 
00043 
00044 #include "Teuchos_StandardDependencies.hpp"
00045 #include "Teuchos_StandardParameterEntryValidators.hpp"
00046 #ifdef TEUCHOS_HAVE_QT
00047   #include <QDir>
00048 #endif
00049 
00050 
00051 namespace Teuchos{
00052 
00053 
00054 VisualDependency::VisualDependency(
00055   RCP<const ParameterEntry> dependee,
00056   RCP<ParameterEntry> dependent,
00057   bool showIf):
00058   Dependency(dependee, dependent),
00059   dependentVisible_(false),
00060   showIf_(showIf)
00061   {}
00062 
00063 VisualDependency::VisualDependency(
00064   RCP<const ParameterEntry> dependee,
00065   ParameterEntryList dependents,
00066   bool showIf):
00067   Dependency(dependee, dependents),
00068   dependentVisible_(false),
00069   showIf_(showIf)
00070   {}
00071 
00072 VisualDependency::VisualDependency(
00073   ConstParameterEntryList dependees,
00074   RCP<ParameterEntry> dependent,
00075   bool showIf):
00076   Dependency(dependees, dependent),
00077   dependentVisible_(false),
00078   showIf_(showIf)
00079   {}
00080 
00081 VisualDependency::VisualDependency(
00082   ConstParameterEntryList dependees,
00083   ParameterEntryList dependents,
00084   bool showIf):
00085   Dependency(dependees, dependents),
00086   dependentVisible_(false),
00087   showIf_(showIf)
00088   {}
00089 
00090 bool VisualDependency::isDependentVisible() const{
00091   return dependentVisible_;
00092 }
00093 
00094 bool VisualDependency::getShowIf() const{
00095   return showIf_;
00096 }
00097 
00098 void VisualDependency::evaluate(){
00099   if((getDependeeState() && showIf_) || (!getDependeeState() && !showIf_)){
00100     dependentVisible_ = true;
00101   }
00102   else{
00103     dependentVisible_ = false;
00104   }
00105 }
00106 
00107 ValidatorDependency::ValidatorDependency(
00108   RCP<const ParameterEntry> dependee,
00109   RCP<ParameterEntry> dependent):
00110   Dependency(dependee, dependent){}
00111 
00112 ValidatorDependency::ValidatorDependency(
00113   RCP<const ParameterEntry> dependee,
00114   ParameterEntryList dependents):
00115   Dependency(dependee, dependents){}
00116 
00117 StringVisualDependency::StringVisualDependency(
00118   RCP<const ParameterEntry> dependee,
00119   RCP<ParameterEntry> dependent,
00120   std::string value,
00121   bool showIf):
00122   VisualDependency(dependee, dependent, showIf),
00123   values_(ValueList(1,value))
00124 {
00125   validateDep();
00126 }
00127 
00128 StringVisualDependency::StringVisualDependency(
00129   RCP<const ParameterEntry> dependee,
00130   RCP<ParameterEntry> dependent,
00131   const ValueList& values,
00132   bool showIf):
00133   VisualDependency(dependee, dependent, showIf),
00134   values_(values)
00135 {
00136   validateDep();
00137 }
00138 
00139 StringVisualDependency::StringVisualDependency(
00140   RCP<const ParameterEntry> dependee,
00141   Dependency::ParameterEntryList dependents,
00142   const std::string& value,
00143   bool showIf):
00144   VisualDependency(dependee, dependents, showIf),
00145   values_(ValueList(1,value))
00146 {
00147   validateDep();
00148 }
00149 
00150 StringVisualDependency::StringVisualDependency(
00151   RCP<const ParameterEntry> dependee,
00152   Dependency::ParameterEntryList dependents,
00153   const ValueList& values,
00154   bool showIf):
00155   VisualDependency(dependee, dependents, showIf),
00156   values_(values)
00157 {
00158   validateDep();
00159 }
00160 
00161 const StringVisualDependency::ValueList&
00162   StringVisualDependency::getValues() const
00163 {
00164   return values_;
00165 }
00166 
00167 bool StringVisualDependency::getDependeeState() const{
00168   return find(values_.begin(), values_.end(),
00169     getFirstDependeeValue<std::string>()) != values_.end();
00170 }
00171 
00172 std::string StringVisualDependency::getTypeAttributeValue() const{
00173   return "StringVisualDependency";
00174 }
00175 
00176 void StringVisualDependency::validateDep() const{
00177   TEUCHOS_TEST_FOR_EXCEPTION(!getFirstDependee()->isType<std::string>(),
00178     InvalidDependencyException,
00179     "Ay no! The dependee of a "
00180     "String Visual Dependency must be of type "
00181     << TypeNameTraits<std::string>::name() << std::endl <<
00182     "Type encountered: " << getFirstDependee()->getAny().typeName() <<
00183     std::endl << std::endl);
00184 }
00185 
00186 RCP<StringVisualDependency>
00187   DummyObjectGetter<StringVisualDependency>::getDummyObject()
00188 {
00189   std::string blahString = "blah";
00190   return rcp(new StringVisualDependency(
00191     rcp(new ParameterEntry(blahString)),
00192     DummyObjectGetter<ParameterEntry>::getDummyObject(),
00193     "i'm a dummy"));
00194 }
00195 
00196 BoolVisualDependency::BoolVisualDependency(
00197   RCP<const ParameterEntry> dependee,
00198   RCP<ParameterEntry> dependent,
00199   bool showIf):
00200   VisualDependency(dependee, dependent, showIf)
00201 {
00202   validateDep();
00203 }
00204 
00205 BoolVisualDependency::BoolVisualDependency(
00206   RCP<const ParameterEntry> dependee,
00207   Dependency::ParameterEntryList dependents,
00208   bool showIf):
00209   VisualDependency(dependee, dependents, showIf)
00210 {
00211   validateDep();
00212 }
00213 
00214 bool BoolVisualDependency::getDependeeState() const{
00215   return getFirstDependeeValue<bool>();
00216 }
00217 
00218 std::string BoolVisualDependency::getTypeAttributeValue() const{
00219   return "BoolVisualDependency";
00220 }
00221 
00222 void BoolVisualDependency::validateDep() const{
00223   TEUCHOS_TEST_FOR_EXCEPTION(!getFirstDependee()->isType<bool>(),
00224     InvalidDependencyException,
00225     "Ay no! The dependee of a "
00226     "Bool Visual Dependency must be of type " <<
00227     TypeNameTraits<bool>::name() << std::endl <<
00228     "Encountered type: " << getFirstDependee()->getAny().typeName() <<
00229     std::endl << std::endl);
00230 }
00231 
00232 RCP<BoolVisualDependency>
00233   DummyObjectGetter<BoolVisualDependency>::getDummyObject()
00234 {
00235   return rcp(new BoolVisualDependency(
00236     rcp(new ParameterEntry(true)),
00237     DummyObjectGetter<ParameterEntry>::getDummyObject()));
00238 }
00239 
00240 ConditionVisualDependency::ConditionVisualDependency(
00241   RCP<const Condition> condition,
00242   RCP<ParameterEntry> dependent,
00243   bool showIf):
00244   VisualDependency(condition->getAllParameters(), dependent, showIf),
00245   condition_(condition)
00246 {
00247   validateDep();
00248 }
00249 
00250 ConditionVisualDependency::ConditionVisualDependency(
00251   RCP<const Condition> condition,
00252   Dependency::ParameterEntryList dependents,
00253   bool showIf):
00254   VisualDependency(condition->getAllParameters(), dependents, showIf),
00255   condition_(condition)
00256 {
00257   validateDep();
00258 }
00259 
00260 RCP<const Condition> ConditionVisualDependency::getCondition() const{
00261   return condition_;
00262 }
00263 
00264 bool ConditionVisualDependency::getDependeeState() const{
00265   return condition_->isConditionTrue();
00266 }
00267 
00268 std::string ConditionVisualDependency::getTypeAttributeValue() const{
00269   return "ConditionVisualDependency";
00270 }
00271 
00272 RCP<ConditionVisualDependency>
00273   DummyObjectGetter<ConditionVisualDependency>::getDummyObject()
00274 {
00275   return rcp(new ConditionVisualDependency(
00276     DummyObjectGetter<NotCondition>::getDummyObject(),
00277     DummyObjectGetter<ParameterEntry>::getDummyObject()));
00278 }
00279 
00280 StringValidatorDependency::StringValidatorDependency(
00281   RCP<const ParameterEntry> dependee,
00282   RCP<ParameterEntry> dependent,
00283   ValueToValidatorMap valuesAndValidators,
00284   RCP<ParameterEntryValidator> defaultValidator):
00285   ValidatorDependency(dependee, dependent),
00286   valuesAndValidators_(valuesAndValidators),
00287   defaultValidator_(defaultValidator)
00288 {
00289   validateDep();
00290 }
00291 
00292 StringValidatorDependency::StringValidatorDependency(
00293   RCP<const ParameterEntry> dependee,
00294   Dependency::ParameterEntryList dependents,
00295   ValueToValidatorMap valuesAndValidators,
00296   RCP<ParameterEntryValidator> defaultValidator):
00297   ValidatorDependency(dependee, dependents),
00298   valuesAndValidators_(valuesAndValidators),
00299   defaultValidator_(defaultValidator)
00300 {
00301   validateDep();
00302 }
00303 
00304 const StringValidatorDependency::ValueToValidatorMap&
00305   StringValidatorDependency::getValuesAndValidators() const
00306 {
00307   return valuesAndValidators_;
00308 }
00309 
00310 RCP<const ParameterEntryValidator>
00311   StringValidatorDependency::getDefaultValidator() const
00312 {
00313   return defaultValidator_;
00314 }
00315 
00316 void StringValidatorDependency::evaluate(){
00317   std::string currentDependeeValue = getFirstDependeeValue<std::string>();
00318   for(
00319     ParameterEntryList::iterator it = getDependents().begin();
00320     it != getDependents().end();
00321     ++it)
00322   {
00323     if(
00324       valuesAndValidators_.find(currentDependeeValue)
00325       ==
00326       valuesAndValidators_.end())
00327     {
00328       (*it)->setValidator(defaultValidator_);
00329     }
00330     else{
00331       (*it)->setValidator(valuesAndValidators_[currentDependeeValue]);
00332     }
00333   }
00334 }
00335 
00336 std::string StringValidatorDependency::getTypeAttributeValue() const{
00337   return "StringValidatorDependency";
00338 }
00339 
00340 void StringValidatorDependency::validateDep() const{
00341   TEUCHOS_TEST_FOR_EXCEPTION(!getFirstDependee()->isType<std::string>(),
00342     InvalidDependencyException,
00343     "Ay no! The dependee of a "
00344     "String Validator Dependency must be of type " <<
00345     TypeNameTraits<std::string>::name() << std::endl <<
00346     "Type Encountered: " << getFirstDependee()->getAny().typeName() <<
00347     std::endl << std::endl);
00348 
00349   TEUCHOS_TEST_FOR_EXCEPTION(
00350     valuesAndValidators_.size() < 1,
00351     InvalidDependencyException,
00352     "The valuesAndValidatord map for a string validator dependency must "
00353     "have at least one entry!" << std::endl << std::endl);
00354   ValueToValidatorMap::const_iterator it = valuesAndValidators_.begin();
00355   RCP<const ParameterEntryValidator> firstVali = (it->second);
00356   ++it;
00357   for(; it != valuesAndValidators_.end(); ++it){
00358     TEUCHOS_TEST_FOR_EXCEPTION( typeid(*firstVali) != typeid(*(it->second)),
00359       InvalidDependencyException,
00360       "Ay no! All of the validators in a StringValidatorDependency "
00361       "must have the same type.");
00362    }
00363 }
00364 
00365 
00366 RCP<StringValidatorDependency >
00367   DummyObjectGetter<StringValidatorDependency>::getDummyObject()
00368 {
00369   std::string blahString = "blah";
00370   StringValidatorDependency::ValueToValidatorMap dummyMap;
00371   dummyMap.insert(StringValidatorDependency::ValueToValidatorPair("blah",
00372     DummyObjectGetter<FileNameValidator>::getDummyObject()));
00373   return rcp(new StringValidatorDependency(
00374     rcp(new ParameterEntry(blahString)),
00375     DummyObjectGetter<ParameterEntry>::getDummyObject(),
00376     dummyMap));
00377 }
00378 
00379 BoolValidatorDependency::BoolValidatorDependency(
00380   RCP<const ParameterEntry> dependee,
00381   RCP<ParameterEntry> dependent,
00382   RCP<const ParameterEntryValidator> trueValidator,
00383   RCP<const ParameterEntryValidator> falseValidator):
00384   ValidatorDependency(dependee, dependent),
00385   trueValidator_(trueValidator),
00386   falseValidator_(falseValidator)
00387 {
00388   validateDep();
00389 }
00390 
00391 BoolValidatorDependency::BoolValidatorDependency(
00392   RCP<const ParameterEntry> dependee,
00393   Dependency::ParameterEntryList dependents,
00394   RCP<const ParameterEntryValidator> trueValidator,
00395   RCP<const ParameterEntryValidator> falseValidator):
00396   ValidatorDependency(dependee, dependents),
00397   trueValidator_(trueValidator),
00398   falseValidator_(falseValidator)
00399 {
00400   validateDep();
00401 }
00402 
00403 void BoolValidatorDependency::evaluate(){
00404   bool dependeeValue = getFirstDependeeValue<bool>();
00405   for(
00406     ParameterEntryList::iterator it = getDependents().begin();
00407     it != getDependents().end();
00408     ++it)
00409   {
00410     dependeeValue ?
00411       (*it)->setValidator(trueValidator_)
00412       :
00413       (*it)->setValidator(falseValidator_);
00414   }
00415 }
00416 
00417 RCP<const ParameterEntryValidator>
00418   BoolValidatorDependency::getTrueValidator() const
00419 {
00420   return trueValidator_;
00421 }
00422 
00423 RCP<const ParameterEntryValidator>
00424   BoolValidatorDependency::getFalseValidator() const
00425 {
00426   return falseValidator_;
00427 }
00428 
00429 std::string BoolValidatorDependency::getTypeAttributeValue() const{
00430   return "BoolValidatorDependency";
00431 }
00432 
00433 
00434 void BoolValidatorDependency::validateDep() const{
00435 
00436   TEUCHOS_TEST_FOR_EXCEPTION(!getFirstDependee()->isType<bool>(),
00437     InvalidDependencyException,
00438     "Ay no! The dependee of a "
00439     "Bool Validator Dependency must be of type " <<
00440     TypeNameTraits<bool>::name() << std::endl <<
00441     "Encountered type: " << getFirstDependee()->getAny().typeName() <<
00442     std::endl << std::endl);
00443 
00444   if(!falseValidator_.is_null() && !trueValidator_.is_null()){
00445     TEUCHOS_TEST_FOR_EXCEPTION(typeid(*falseValidator_) != typeid(*trueValidator_),
00446       InvalidDependencyException,
00447       "Ay no! The true and false validators of a Bool Validator Dependency "
00448       "must be the same type! " <<std::endl << std::endl);
00449   }
00450 
00451 }
00452 
00453 RCP<BoolValidatorDependency>
00454   DummyObjectGetter<BoolValidatorDependency>::getDummyObject()
00455 {
00456   return rcp(new BoolValidatorDependency(
00457     rcp(new ParameterEntry(true)),
00458     DummyObjectGetter<ParameterEntry>::getDummyObject(),
00459     null, null));
00460 }
00461 
00462 }
00463 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines