aboutsummaryrefslogtreecommitdiff
path: root/build2/variable.txx
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.txx
parent4b31ef06275ad423e48a75d15fb0ee21c3127e3c (diff)
Add support for typed/untyped concatenated expansion
Diffstat (limited to 'build2/variable.txx')
-rw-r--r--build2/variable.txx40
1 files changed, 33 insertions, 7 deletions
diff --git a/build2/variable.txx b/build2/variable.txx
index 0678a6a..ab31a45 100644
--- a/build2/variable.txx
+++ b/build2/variable.txx
@@ -6,9 +6,35 @@
namespace build2
{
- // value
+ // This one will be SFINAE'd out unless T is a simple value.
//
template <typename T>
+ auto
+ convert (names&& ns) ->
+ decltype (value_traits<T>::convert (move (ns[0]), nullptr))
+ {
+ size_t n (ns.size ());
+
+ if (n == 0)
+ {
+ if (value_traits<T>::empty_value)
+ return T ();
+ }
+ else if (n == 1)
+ {
+ return convert<T> (move (ns[0]));
+ }
+ else if (n == 2 && ns[0].pair != '\0')
+ {
+ return convert<T> (move (ns[0]), move (ns[1]));
+ }
+
+ throw invalid_argument (
+ string ("invalid ") + value_traits<T>::type_name +
+ (n == 0 ? " value: empty" : " value: multiple names"));
+ }
+
+ template <typename T>
void
default_dtor (value& v)
{
@@ -42,13 +68,13 @@ namespace build2
return value_traits<T>::empty (v.as<T> ());
}
- template <typename T, bool empty>
+ template <typename T>
void
simple_assign (value& v, names&& ns, const variable* var)
{
size_t n (ns.size ());
- if (empty ? n <= 1 : n == 1)
+ if (value_traits<T>::empty_value ? n <= 1 : n == 1)
{
try
{
@@ -72,13 +98,13 @@ namespace build2
dr << " in variable " << var->name;
}
- template <typename T, bool empty>
+ template <typename T>
void
simple_append (value& v, names&& ns, const variable* var)
{
size_t n (ns.size ());
- if (empty ? n <= 1 : n == 1)
+ if (value_traits<T>::empty_value ? n <= 1 : n == 1)
{
try
{
@@ -102,13 +128,13 @@ namespace build2
dr << " in variable " << var->name;
}
- template <typename T, bool empty>
+ template <typename T>
void
simple_prepend (value& v, names&& ns, const variable* var)
{
size_t n (ns.size ());
- if (empty ? n <= 1 : n == 1)
+ if (value_traits<T>::empty_value ? n <= 1 : n == 1)
{
try
{