aboutsummaryrefslogtreecommitdiff
path: root/build2/variable.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-11-30 17:32:43 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-30 17:32:43 +0200
commitbe14801929cf2a6caced87df034ae12a85f42aa6 (patch)
tree74670e0a746961424e50c09449d526e143c1abfc /build2/variable.ixx
parent4b31ef06275ad423e48a75d15fb0ee21c3127e3c (diff)
Add support for typed/untyped concatenated expansion
Diffstat (limited to 'build2/variable.ixx')
-rw-r--r--build2/variable.ixx23
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>::