From 0efae7db7b5870246f1e294a5fedaa69e9c90331 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 20 Feb 2024 15:40:02 +0200 Subject: Add json_map and json_set buildfile value types These expose the std::map and std::set types to buildfiles. New functions: $size() $size() $keys() Note that the $keys() function returns the list of map key as a json array. For example: m = [json_map] 2@([json] a@1 b@2) 1@([json] 1 2) s = [json_set] ([json] x@1 y@2) ([json] a@1 b@2) print ($m[2][b]) # 2 print ($s[([json] y@2 x@1)]) # true --- libbuild2/functions-json.cxx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libbuild2/functions-json.cxx') diff --git a/libbuild2/functions-json.cxx b/libbuild2/functions-json.cxx index 5715e13..e06d9a5 100644 --- a/libbuild2/functions-json.cxx +++ b/libbuild2/functions-json.cxx @@ -308,5 +308,28 @@ namespace build2 } }; #endif + + // $size() + // $size() + // + // Return the number of elements in the sequence. + // + f["size"] += [] (set v) {return v.size ();}; + f["size"] += [] (map v) {return v.size ();}; + + // $keys() + // + // Return the list of keys in a json map as a json array. + // + // Note that the result is sorted in ascending order. + // + f["keys"] += [](map v) + { + json_value r (json_type::array); + r.array.reserve (v.size ()); + for (pair& p: v) + r.array.push_back (p.first); // @@ PERF: use C++17 map::extract() to steal. + return r; + }; } } -- cgit v1.1