From 6417a4e6af2b7732ec0da6af24f1a56f7cdada3f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 31 Mar 2016 09:01:50 +0200 Subject: Set part of variable override implementation --- build2/variable | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'build2/variable') diff --git a/build2/variable b/build2/variable index 931b4f7..7b137aa 100644 --- a/build2/variable +++ b/build2/variable @@ -80,7 +80,8 @@ namespace build2 struct variable { string name; - const value_type* type; // If NULL, then not (yet) typed. + const value_type* type; // If NULL, then not (yet) typed. + mutable unique_ptr override; variable_visibility visibility; }; @@ -539,36 +540,34 @@ namespace build2 struct variable_pool: private variable_pool_base { const variable& - find (string name) + insert (string name, + bool overridable = false, + variable_visibility v = variable_visibility::normal) { - return find (name, nullptr, nullptr); + return insert (move (name), nullptr, v, overridable); } template const variable& - find (string name) + insert (string name, + bool overridable = false, + variable_visibility v = variable_visibility::normal) { - return find (name, nullptr, &value_traits::value_type); + return insert ( + move (name), &value_traits::value_type, v, overridable); } const variable& - find (string name, variable_visibility v) - { - return find (name, &v, nullptr); - } - - template - const variable& - find (string name, variable_visibility v) - { - return find (name, &v, &value_traits::value_type); - } + find (const string& name); using variable_pool_base::clear; private: const variable& - find (string name, const variable_visibility*, const build2::value_type*); + insert (string name, + const build2::value_type*, + variable_visibility, + bool overridable); }; extern variable_pool var_pool; @@ -635,11 +634,14 @@ namespace build2 return assign (var_pool.find (name)); } + // Unlike the two above, assign a non-overridable variable with normal + // visibility. + // template pair, bool> - assign (const string& name) + assign (string name) { - return assign (var_pool.find (name)); + return assign (var_pool.insert (move (name))); } pair -- cgit v1.1