From 90ba96a3d610566124529516d71f84f2a8c26ec0 Mon Sep 17 00:00:00 2001 From: Taeer Bar-Yam Date: Mon, 10 Nov 2025 21:33:20 +0100 Subject: [PATCH] libexpr: use std::span rather than const std::vector & --- src/libexpr/include/nix/expr/nixexpr.hh | 34 +++++++++++++++++--- src/libexpr/include/nix/expr/parser-state.hh | 7 ++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/libexpr/include/nix/expr/nixexpr.hh b/src/libexpr/include/nix/expr/nixexpr.hh index 3bf92cc12..673c14cb3 100644 --- a/src/libexpr/include/nix/expr/nixexpr.hh +++ b/src/libexpr/include/nix/expr/nixexpr.hh @@ -289,7 +289,7 @@ struct ExprSelect : Expr std::pmr::polymorphic_allocator & alloc, const PosIdx & pos, Expr * e, - const std::span & attrPath, + std::span attrPath, Expr * def) : pos(pos) , nAttrPath(attrPath.size()) @@ -339,7 +339,7 @@ struct ExprOpHasAttr : Expr Expr * e; std::span attrPath; - ExprOpHasAttr(std::pmr::polymorphic_allocator & alloc, Expr * e, const std::vector & attrPath) + ExprOpHasAttr(std::pmr::polymorphic_allocator & alloc, Expr * e, std::span attrPath) : e(e) , attrPath({alloc.allocate_object(attrPath.size()), attrPath.size()}) { @@ -433,7 +433,7 @@ struct ExprList : Expr { std::span elems; - ExprList(std::pmr::polymorphic_allocator & alloc, const std::vector & exprs) + ExprList(std::pmr::polymorphic_allocator & alloc, std::span exprs) : elems({alloc.allocate_object(exprs.size()), exprs.size()}) { std::ranges::copy(exprs, elems.begin()); @@ -753,7 +753,19 @@ struct ExprConcatStrings : Expr std::pmr::polymorphic_allocator & alloc, const PosIdx & pos, bool forceString, - const std::vector> & es) + std::span> es) + : pos(pos) + , forceString(forceString) + , es({alloc.allocate_object>(es.size()), es.size()}) + { + std::ranges::copy(es, this->es.begin()); + }; + + ExprConcatStrings( + std::pmr::polymorphic_allocator & alloc, + const PosIdx & pos, + bool forceString, + std::initializer_list> es) : pos(pos) , forceString(forceString) , es({alloc.allocate_object>(es.size()), es.size()}) @@ -833,7 +845,19 @@ public: add(std::pmr::polymorphic_allocator & alloc, const PosIdx & pos, bool forceString, - const std::vector> & es) + std::span> es) + requires(std::same_as) + { + return alloc.new_object(alloc, pos, forceString, es); + } + + template + [[gnu::always_inline]] + C * + add(std::pmr::polymorphic_allocator & alloc, + const PosIdx & pos, + bool forceString, + std::initializer_list> es) requires(std::same_as) { return alloc.new_object(alloc, pos, forceString, es); diff --git a/src/libexpr/include/nix/expr/parser-state.hh b/src/libexpr/include/nix/expr/parser-state.hh index 0020d001e..9e1d17b53 100644 --- a/src/libexpr/include/nix/expr/parser-state.hh +++ b/src/libexpr/include/nix/expr/parser-state.hh @@ -96,8 +96,7 @@ struct ParserState ExprAttrs * attrs, AttrPath && attrPath, const ParserLocation & loc, Expr * e, const ParserLocation & exprLoc); void addAttr(ExprAttrs * attrs, AttrPath & attrPath, const Symbol & symbol, ExprAttrs::AttrDef && def); void validateFormals(FormalsBuilder & formals, PosIdx pos = noPos, Symbol arg = {}); - Expr * - stripIndentation(const PosIdx pos, const std::vector>> & es); + Expr * stripIndentation(const PosIdx pos, std::span>> es); PosIdx at(const ParserLocation & loc); }; @@ -239,8 +238,8 @@ inline void ParserState::validateFormals(FormalsBuilder & formals, PosIdx pos, S {.msg = HintFmt("duplicate formal function argument '%1%'", symbols[arg]), .pos = positions[pos]}); } -inline Expr * ParserState::stripIndentation( - const PosIdx pos, const std::vector>> & es) +inline Expr * +ParserState::stripIndentation(const PosIdx pos, std::span>> es) { if (es.empty()) return exprs.add(""_sds);