aboutsummaryrefslogtreecommitdiff
path: root/build2/variable.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-03-07 10:24:02 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-03-07 10:24:02 +0200
commit8205a652a4616aea84f24ff31235ea9941f47db6 (patch)
treebd63a17e6944575f0d8dc0519e86d8a5513b6b5c /build2/variable.cxx
parentec2247ead804e7cde1fe6a0f0b8112440e80a61c (diff)
Specify config.test.output variable
Diffstat (limited to 'build2/variable.cxx')
-rw-r--r--build2/variable.cxx78
1 files changed, 78 insertions, 0 deletions
diff --git a/build2/variable.cxx b/build2/variable.cxx
index 09790b4..f282dc5 100644
--- a/build2/variable.cxx
+++ b/build2/variable.cxx
@@ -723,6 +723,84 @@ namespace build2
&default_empty<name>
};
+ // name_pair
+ //
+ name_pair value_traits<name_pair>::
+ convert (name&& n, name* r)
+ {
+ n.pair = '\0'; // Keep "unpaired" in case r is empty.
+ return name_pair (move (n), r != nullptr ? move (*r) : name ());
+ }
+
+ void
+ name_pair_assign (value& v, names&& ns, const variable* var)
+ {
+ using traits = value_traits<name_pair>;
+
+ size_t n (ns.size ());
+
+ if (n <= 2)
+ {
+ try
+ {
+ traits::assign (
+ v,
+ (n == 0
+ ? name_pair ()
+ : traits::convert (move (ns[0]), n == 2 ? &ns[1] : nullptr)));
+ return;
+ }
+ catch (const invalid_argument&) {} // Fall through.
+ }
+
+ diag_record dr (fail);
+ dr << "invalid name_pair value '" << ns << "'";
+
+ if (var != nullptr)
+ dr << " in variable " << var->name;
+ }
+
+ static names_view
+ name_pair_reverse (const value& v, names& ns)
+ {
+ const name_pair& p (v.as<name_pair> ());
+ const name& f (p.first);
+ const name& s (p.second);
+
+ if (f.empty () && s.empty ())
+ return names_view (nullptr, 0);
+
+ if (f.empty ())
+ return names_view (&s, 1);
+
+ if (s.empty ())
+ return names_view (&f, 1);
+
+ ns.push_back (f);
+ ns.back ().pair = '@';
+ ns.push_back (s);
+ return ns;
+ }
+
+ const char* const value_traits<name_pair>::type_name = "name_pair";
+
+ const value_type value_traits<name_pair>::value_type
+ {
+ type_name,
+ sizeof (name_pair),
+ nullptr, // No base.
+ &default_dtor<name_pair>,
+ &default_copy_ctor<name_pair>,
+ &default_copy_assign<name_pair>,
+ &name_pair_assign,
+ nullptr, // Append not supported.
+ nullptr, // Prepend not supported.
+ &name_pair_reverse,
+ nullptr, // No cast (cast data_ directly).
+ &simple_compare<name_pair>,
+ &default_empty<name_pair>
+ };
+
// process_path value
//
process_path value_traits<process_path>::