浏览代码

ENH: Refactor policy stack representation

This defines PolicyMap as a public member of cmPolicies.  Its previous
role as a policy stack entry is now called PolicyStackEntry and
represented as a class to which more information can be added later.
Brad King 17 年之前
父节点
当前提交
8997f4760a
共有 3 个文件被更改,包括 16 次插入7 次删除
  1. 3 4
      Source/cmMakefile.cxx
  2. 9 3
      Source/cmMakefile.h
  3. 4 0
      Source/cmPolicies.h

+ 3 - 4
Source/cmMakefile.cxx

@@ -3599,11 +3599,10 @@ cmPolicies::PolicyStatus
 cmMakefile::GetPolicyStatusInternal(cmPolicies::PolicyID id)
 {
   // Is the policy set in our stack?
-  for(std::vector<PolicyMap>::reverse_iterator
-        psi = this->PolicyStack.rbegin();
+  for(PolicyStackType::reverse_iterator psi = this->PolicyStack.rbegin();
       psi != this->PolicyStack.rend(); ++psi)
     {
-    PolicyMap::const_iterator pse = psi->find(id);
+    PolicyStackEntry::const_iterator pse = psi->find(id);
     if(pse != psi->end())
       {
       return pse->second;
@@ -3678,7 +3677,7 @@ bool cmMakefile::SetPolicy(cmPolicies::PolicyID id,
 bool cmMakefile::PushPolicy()
 {
   // Allocate a new stack entry.
-  this->PolicyStack.push_back(PolicyMap());
+  this->PolicyStack.push_back(PolicyStackEntry());
   return true;
 }
 

+ 9 - 3
Source/cmMakefile.h

@@ -931,9 +931,15 @@ private:
   std::map<cmStdString, cmTarget*> ImportedTargets;
   
   // stack of policy settings
-  typedef std::map<cmPolicies::PolicyID,
-                   cmPolicies::PolicyStatus> PolicyMap;
-  std::vector<PolicyMap> PolicyStack;
+  struct PolicyStackEntry: public cmPolicies::PolicyMap
+  {
+    typedef cmPolicies::PolicyMap derived;
+    PolicyStackEntry(): derived() {}
+    PolicyStackEntry(derived const& d): derived(d) {}
+    PolicyStackEntry(PolicyStackEntry const& r): derived(r) {}
+  };
+  typedef std::vector<PolicyStackEntry> PolicyStackType;
+  PolicyStackType PolicyStack;
   cmPolicies::PolicyStatus GetPolicyStatusInternal(cmPolicies::PolicyID id);
 
   bool CheckCMP0000;

+ 4 - 0
Source/cmPolicies.h

@@ -89,6 +89,10 @@ public:
   ///! Get docs for policies
   void GetDocumentation(std::vector<cmDocumentationEntry>& v);
 
+  /** Represent a set of policy values.  */
+  typedef std::map<cmPolicies::PolicyID,
+                   cmPolicies::PolicyStatus> PolicyMap;
+
   private:
   // might have to make these internal for VS6 not sure yet
   std::map<PolicyID,cmPolicy *> Policies;