From aeeedd32f8717d8c6a1886a5561a879059be87d0 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 16 Nov 2016 10:53:39 +0200 Subject: Make names and vector different types, add typed value constructor --- build2/variable.ixx | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'build2/variable.ixx') diff --git a/build2/variable.ixx b/build2/variable.ixx index 5c9118b..d054dd4 100644 --- a/build2/variable.ixx +++ b/build2/variable.ixx @@ -12,8 +12,9 @@ namespace build2 empty () const { assert (!null); - return type == nullptr ? as ().empty () : - type->empty == nullptr ? false : type->empty (*this); + return type == nullptr + ? as ().empty () + : type->empty == nullptr ? false : type->empty (*this); } inline value:: @@ -23,6 +24,15 @@ namespace build2 new (&data_) names (move (ns)); } + template + inline value:: + value (T v) + : type (&value_traits::value_type), null (true), extra (0) + { + value_traits::assign (*this, move (v)); + null = false; + } + inline value& value:: operator= (reference_wrapper v) { @@ -93,10 +103,7 @@ namespace build2 inline const names& cast (const value& v) { - // Note that it can still be a typed vector. - // - assert (v && - (v.type == nullptr || v.type == &value_traits::value_type)); + assert (v && v.type == nullptr); return v.as (); } @@ -104,8 +111,7 @@ namespace build2 inline names& cast (value& v) { - assert (v && - (v.type == nullptr || v.type == &value_traits::value_type)); + assert (v && v.type == nullptr); return v.as (); } @@ -230,7 +236,6 @@ namespace build2 v.as () = x; else new (&v.data_) bool (x); - } inline void value_traits:: -- cgit v1.1