From df8237044fcb583231323a7e2f9a7310cd80edf7 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 1 Mar 2022 18:52:20 +0100 Subject: expression language: add a range function Given a number or number representation, return a list of that length consisting of representations of the lower numbers. In this way, repeated non-pure actions can be generated (e.g., repetitions of a test to detect flakyness). --- src/buildtool/build_engine/expression/evaluator.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/buildtool/build_engine/expression/evaluator.cpp') diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp index b93fa9f9..f1a19d4d 100644 --- a/src/buildtool/build_engine/expression/evaluator.cpp +++ b/src/buildtool/build_engine/expression/evaluator.cpp @@ -161,6 +161,22 @@ auto NubRight(ExpressionPtr const& expr) -> ExpressionPtr { return ExpressionPtr{reverse_result}; } +auto Range(ExpressionPtr const& expr) -> ExpressionPtr { + size_t len = 0; + if (expr->IsNumber() && expr->Number() > 0.0) { + len = static_cast(std::lround(expr->Number())); + } + if (expr->IsString()) { + len = static_cast(std::atol(expr->String().c_str())); + } + auto result = Expression::list_t{}; + result.reserve(len); + for (size_t i = 0; i < len; i++) { + result.emplace_back(ExpressionPtr{fmt::format("{}", i)}); + } + return ExpressionPtr{result}; +} + auto ChangeEndingTo(ExpressionPtr const& name, ExpressionPtr const& ending) -> ExpressionPtr { std::filesystem::path path{name->String()}; @@ -785,6 +801,7 @@ auto built_in_functions = {"+", AddExpr}, {"++", UnaryExpr(Flatten)}, {"nub_right", UnaryExpr(NubRight)}, + {"range", UnaryExpr(Range)}, {"change_ending", ChangeEndingExpr}, {"basename", UnaryExpr(BaseName)}, {"join", JoinExpr}, -- cgit v1.2.3