diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-11-30 17:32:43 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-11-30 17:32:43 +0200 |
commit | be14801929cf2a6caced87df034ae12a85f42aa6 (patch) | |
tree | 74670e0a746961424e50c09449d526e143c1abfc /build2/variable.ixx | |
parent | 4b31ef06275ad423e48a75d15fb0ee21c3127e3c (diff) |
Add support for typed/untyped concatenated expansion
Diffstat (limited to 'build2/variable.ixx')
-rw-r--r-- | build2/variable.ixx | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/build2/variable.ixx b/build2/variable.ixx index 4d70685..e5fe794 100644 --- a/build2/variable.ixx +++ b/build2/variable.ixx @@ -80,6 +80,14 @@ namespace build2 return *this; } + inline void value:: + assign (name&& n, const variable* var) + { + names ns; + ns.push_back (move (n)); + assign (move (ns), var); + } + inline bool operator!= (const value& x, const value& y) { @@ -226,9 +234,11 @@ namespace build2 return value_traits<T>::convert (move (l), &r); } + // This one will be SFINAE'd out unless T is a container. + // template <typename T> - inline T - convert (names&& ns) + inline auto + convert (names&& ns) -> decltype (value_traits<T>::convert (move (ns))) { return value_traits<T>::convert (move (ns)); } @@ -474,11 +484,10 @@ namespace build2 inline void value_traits<name>:: assign (value& v, name&& x) { - name* p (v - ? &(v.as<name> () = move (x)) - : new (&v.data_) name (move (x))); - - p->original = false; + if (v) + v.as<name> () = move (x); + else + new (&v.data_) name (move (x)); } inline int value_traits<name>:: |