From 7d137fd6a9ceb54574481082e9944de168b06b78 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 22 Sep 2022 13:10:08 +0200 Subject: Add $integer_sequence(, [, ]) function It returns the list of uint64 integers starting from (including) to (excluding) with the specified or 1 if unspecified. For example: hdr = foo.hxx bar.hxx baz.hxx src = foo.cxx bar.cxx baz.cxx assert ($size($hdr) == $size($src)) "hdr and src expected to be parallel" for i: $integer_sequence(0, $size($hdr)) { h = ($hdr[$i]) s = ($src[$i]) ... } --- libbuild2/functions-builtin.cxx | 31 +++++++++++++++++++++++++++++++ tests/function/builtin/testscript | 8 ++++++++ 2 files changed, 39 insertions(+) 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(, [, ]) + // + // Return the list of uint64 integers starting from (including) to + // (excluding) with the specified or 1 if unspecified. If + // is greater than , 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() plus potentially a + // similar $keys() function for maps). + // + f["integer_sequence"] += [](value begin, value end, optional step) + { + uint64_t b (convert (move (begin))); + uint64_t e (convert (move (end))); + uint64_t s (step ? convert (move (*step)) : 1); + + uint64s r; + if (b < e) + { + r.reserve (static_cast ((e - b) / s + 1)); + + for (; b < e; b += s) + r.push_back (static_cast (b)); + } + + return r; + }; + // string // f["string"] += [](bool b) {return b ? "true" : "false";}; diff --git a/tests/function/builtin/testscript b/tests/function/builtin/testscript index 02c73ee..bbfd4e5 100644 --- a/tests/function/builtin/testscript +++ b/tests/function/builtin/testscript @@ -77,6 +77,14 @@ $* <'print $type($identity(abc))' >'' : untyped } +: integer-sequence +: +{ + $* <'print $integer_sequence(1, 3)' >'1 2' : basics + $* <'print $integer_sequence(1, 0)' >'' : empty + $* <'print $integer_sequence(0, 8, 2)' >'0 2 4 6' : step +} + : string : { -- cgit v1.1