diff options
Diffstat (limited to 'libbuild2')
-rw-r--r-- | libbuild2/functions-builtin.cxx | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libbuild2/functions-builtin.cxx b/libbuild2/functions-builtin.cxx index 5129a05..7000f16 100644 --- a/libbuild2/functions-builtin.cxx +++ b/libbuild2/functions-builtin.cxx @@ -123,6 +123,37 @@ namespace build2 f["identity"] += [](value* v) {return move (*v);}; + // $integer_sequence(<begin>, <end>[, <step>]) + // + // Return the list of uint64 integers starting from <begin> (including) to + // <end> (excluding) with the specified <step> or 1 if unspecified. If + // <begin> is greater than <end>, empty list is returned. + // + // Note that currently negative numbers are not supported but this could + // be handled if required (e.g., by returning int64s in this case). + // + // Note also that we could improve this by adding a shortcut to get the + // indexes of a list (for example, $indexes(<list>) plus potentially a + // similar $keys() function for maps). + // + f["integer_sequence"] += [](value begin, value end, optional<value> step) + { + uint64_t b (convert<uint64_t> (move (begin))); + uint64_t e (convert<uint64_t> (move (end))); + uint64_t s (step ? convert<uint64_t> (move (*step)) : 1); + + uint64s r; + if (b < e) + { + r.reserve (static_cast<size_t> ((e - b) / s + 1)); + + for (; b < e; b += s) + r.push_back (static_cast<size_t> (b)); + } + + return r; + }; + // string // f["string"] += [](bool b) {return b ? "true" : "false";}; |