diff options
author | Stephen Kelly <steveire@gmail.com> | 2015-05-03 08:12:34 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2015-05-04 20:32:21 (GMT) |
commit | 013ada80eac9cb119a6288ee58724a8c9915a35c (patch) | |
tree | 04739c03393e31427fae0acbca7057c97ffb41e9 /Source | |
parent | be6664c208c65e01dc175ae4d27e7fc18c28c97e (diff) | |
download | CMake-013ada80eac9cb119a6288ee58724a8c9915a35c.zip CMake-013ada80eac9cb119a6288ee58724a8c9915a35c.tar.gz CMake-013ada80eac9cb119a6288ee58724a8c9915a35c.tar.bz2 |
cmPolicies: Implement PolicyMap in terms of bitset.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmPolicies.cxx | 35 | ||||
-rw-r--r-- | Source/cmPolicies.h | 12 |
2 files changed, 42 insertions, 5 deletions
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx index 8996943..f8d61db 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 46b725a..63376dd 100644 --- a/Source/cmPolicies.h +++ b/Source/cmPolicies.h @@ -14,6 +14,8 @@ #include "cmCustomCommand.h" +#include <bitset> + 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<PolicyID, PolicyStatus> + 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<cmPolicies::CMPCOUNT> UNDEFINED; + std::bitset<cmPolicies::CMPCOUNT> OLD; + std::bitset<cmPolicies::CMPCOUNT> NEW; + std::bitset<cmPolicies::CMPCOUNT> REQUIRED_IF_USED; + std::bitset<cmPolicies::CMPCOUNT> REQUIRED_ALWAYS; }; }; |