aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/parser.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2024-02-19 10:34:40 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2024-02-19 12:44:32 +0200
commitbed6b6a9170253e010cbffd59202add4edfd1c2b (patch)
treeee33d1ad1f43bfc0966b8f85f7f84ad6272b1e71 /libbuild2/parser.cxx
parent70d63c266ffd313c03f6cf68e7080bbcd3c8c064 (diff)
Add string_map buildfile value type
This exposes the std::map<std::string,std::string> type to buildfiles. New functions: $size(<string-map>) $keys(<string-map>) Subscript can be used to lookup a value by key. The result is [null] if there is no value associated with the specified key. For example: map = [string_map] a@1 b@2 c@3 b = ($map[b]) # 2 if ($map[z] == [null]) ... Note that append (+=) is overriding (like std::map::insert_or_assign()) while prepend (=+) is not (like std::map::insert()). In a sense, whatever appears last (from left to right) is kept, which is consistent with what we expect to happen when specifying the same key repeatedly in a literal representation. For example: map = [string_map] a@0 b@2 a@1 # a@1 b@2 map += b@0 c@3 # a@1 b@0 c@3 map =+ b@1 d@4 # a@1 b@0 c@3 d@4 Example of iteration: map = [string_map] a@1 b@2 c@3 for p: $map { k = $first($p) v = $second($p) } While the subscript is mapped to key lookup only, index-based access can be implemented (with a bit of overhead) using the $keys() function: map = [string_map] a@1 b@2 c@3 keys = $keys($m) for i: $integer_sequence(0, $size($keys)) { k = ($keys[$i]) v = ($map[$k]) } Also, this commit changes the naming of other template-based value types (not exposed as buildfile value types) to use C++ template id-like names (e.g., map<string,optional<bool>>).
Diffstat (limited to 'libbuild2/parser.cxx')
-rw-r--r--libbuild2/parser.cxx10
1 files changed, 7 insertions, 3 deletions
diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx
index 6ccae8a..b68f009 100644
--- a/libbuild2/parser.cxx
+++ b/libbuild2/parser.cxx
@@ -6090,7 +6090,8 @@ namespace build2
if (n[4] == 's' &&
n[5] == '\0') return &value_traits<paths>::value_type;
}
- else if (n == "project_name") return &value_traits<project_name>::value_type;
+ else if (n == "project_name")
+ return &value_traits<project_name>::value_type;
break;
}
case 's':
@@ -6100,12 +6101,15 @@ namespace build2
if (n[6] == '\0') return &value_traits<string>::value_type;
if (n[6] == 's' &&
n[7] == '\0') return &value_traits<strings>::value_type;
+ if (n == "string_map")
+ return &value_traits<map<string,string>>::value_type;
}
break;
}
case 't':
{
- if (n == "target_triplet") return &value_traits<target_triplet>::value_type;
+ if (n == "target_triplet")
+ return &value_traits<target_triplet>::value_type;
break;
}
case 'u':
@@ -8972,7 +8976,7 @@ namespace build2
result = &result_data;
}
- // See if we have another subscript.
+ // See if we have chained subscript.
//
enable_subscript ();
tt = peek ();