diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 899694309..f8d61db8d 100644 --- a/Source/cmPolicies.cxx +++ b/Source/cmPolicies.cxx @@ -343,24 +343,51 @@ cmPolicies::GetRequiredAlwaysPolicyError(cmPolicies::PolicyID id) return e.str(); } +cmPolicies::PolicyMap::PolicyMap() +{ + this->UNDEFINED.set(); +} + cmPolicies::PolicyStatus cmPolicies::PolicyMap::Get(cmPolicies::PolicyID id) const { - return this->find(id)->second; + PolicyStatus status = cmPolicies::WARN; + + if (this->OLD[id]) + { + status = cmPolicies::OLD; + } + else if (this->NEW[id]) + { + status = cmPolicies::NEW; + } + else if (this->REQUIRED_ALWAYS[id]) + { + status = cmPolicies::REQUIRED_ALWAYS; + } + else if (this->REQUIRED_IF_USED[id]) + { + status = cmPolicies::REQUIRED_IF_USED; + } + return status; } void cmPolicies::PolicyMap::Set(cmPolicies::PolicyID id, cmPolicies::PolicyStatus status) { - (*this)[id] = status; + this->UNDEFINED.reset(id); + this->OLD[id] = (status == cmPolicies::OLD); + this->NEW[id] = (status == cmPolicies::NEW); + this->REQUIRED_ALWAYS[id] = (status == cmPolicies::REQUIRED_ALWAYS); + this->REQUIRED_IF_USED[id] = (status == cmPolicies::REQUIRED_IF_USED); } bool cmPolicies::PolicyMap::IsDefined(cmPolicies::PolicyID id) const { - return this->find(id) != this->end(); + return !this->UNDEFINED[id]; } bool cmPolicies::PolicyMap::IsEmpty() const { - return this->empty(); + return !this->UNDEFINED.none(); } diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h index 46b725ac5..63376dd7d 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -14,6 +14,8 @@ #include "cmCustomCommand.h" +#include + class cmMakefile; class cmPolicy; @@ -268,12 +270,20 @@ public: static std::string GetRequiredAlwaysPolicyError(cmPolicies::PolicyID id); /** Represent a set of policy values. */ - struct PolicyMap : private std::map + struct PolicyMap { + PolicyMap(); PolicyStatus Get(PolicyID id) const; void Set(PolicyID id, PolicyStatus status); bool IsDefined(PolicyID id) const; bool IsEmpty() const; + + private: + std::bitset UNDEFINED; + std::bitset OLD; + std::bitset NEW; + std::bitset REQUIRED_IF_USED; + std::bitset REQUIRED_ALWAYS; }; };