From cadc20ebc46d01b4d8ac0e91cc8e6fd1066867cb Mon Sep 17 00:00:00 2001 From: mpv Date: Thu, 3 Sep 2015 09:26:28 +0300 Subject: [PATCH] Support of attributes located in the same switch in several cases --- src/Model/Model_Update.cpp | 2 +- src/Model/Model_Validator.cpp | 34 +++++++++++++++++++++------------- src/Model/Model_Validator.h | 5 +++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp index 097673efc..3ec27e47f 100644 --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -33,7 +33,7 @@ using namespace std; Model_Update MY_UPDATER_INSTANCE; /// the only one instance initialized on load of the library -#define DEB_UPDATE +//#define DEB_UPDATE Model_Update::Model_Update() { diff --git a/src/Model/Model_Validator.cpp b/src/Model/Model_Validator.cpp index 9f186a1a0..4f2041c36 100644 --- a/src/Model/Model_Validator.cpp +++ b/src/Model/Model_Validator.cpp @@ -314,28 +314,36 @@ bool Model_ValidatorsFactory::isConcealed(std::string theFeature, std::string th void Model_ValidatorsFactory::registerCase(std::string theFeature, std::string theAttribute, std::string theSwitchId, std::string theCaseId) { - std::map > >::iterator - aFindFeature = myCases.find(theFeature); + std::map > > > + ::iterator aFindFeature = myCases.find(theFeature); if (aFindFeature == myCases.end()) { - myCases[theFeature] = std::map >(); + myCases[theFeature] = std::map > >(); aFindFeature = myCases.find(theFeature); } - (aFindFeature->second)[theAttribute] = std::pair(theSwitchId, theCaseId); + std::map > >::iterator aFindAttrID = + aFindFeature->second.find(theAttribute); + if (aFindAttrID == aFindFeature->second.end()) { + aFindFeature->second[theAttribute] = + std::pair >(theSwitchId, std::set()); + aFindAttrID = aFindFeature->second.find(theAttribute); + } + aFindAttrID->second.second.insert(theCaseId); } -bool Model_ValidatorsFactory::isCase( - FeaturePtr theFeature, std::string theAttribute) +bool Model_ValidatorsFactory::isCase(FeaturePtr theFeature, std::string theAttribute) { - std::map > >::iterator - aFindFeature = myCases.find(theFeature->getKind()); + std::map > > > + ::iterator aFindFeature = myCases.find(theFeature->getKind()); if (aFindFeature != myCases.end()) { - std::map >::iterator - aFindAttr = aFindFeature->second.find(theAttribute); - if (aFindAttr != aFindFeature->second.end()) { + std::map > >::iterator + aFindAttrID = aFindFeature->second.find(theAttribute); + if (aFindAttrID != aFindFeature->second.end()) { // the the switch-attribute that contains the case value - AttributeStringPtr aSwitch = theFeature->string(aFindAttr->second.first); + AttributeStringPtr aSwitch = theFeature->string(aFindAttrID->second.first); if (aSwitch.get()) { - return aSwitch->value() == aFindAttr->second.second; // the second is the case identifier + // the second has the case identifier + return aFindAttrID->second.second.find(aSwitch->value()) != + aFindAttrID->second.second.end(); } } } diff --git a/src/Model/Model_Validator.h b/src/Model/Model_Validator.h index 3156a17de..0040d8c2b 100644 --- a/src/Model/Model_Validator.h +++ b/src/Model/Model_Validator.h @@ -39,8 +39,9 @@ class Model_ValidatorsFactory : public ModelAPI_ValidatorsFactory std::map > myConcealed; /// Stores the registered attributes must be checked only if the particular case is activated /// Map from feature kind to map of attribute IDs to pair - // (switchId (ID of the attribute) and case Id (possible values of the switch attribute)) - std::map > > myCases; + // (switchId (ID of the attribute) and case Ids (possible values of the switch attribute)) + std::map > > > myCases; public: /// Registers the instance of the validator by the ID -- 2.39.2