Age | Commit message (Collapse) | Author |
|
- in sequence containers, use operator[] instead of .at() when
accessing indices guaranteed to be in bound;
- in associative containers, prefer .find() and reusing the
returned const iterator to using .contains() and .at(); while
there, make any so obtained iterators const if they are read-only.
|
|
Produces the mapping between correspondingly indexed entries of two
lists, one containing the keys and the other of values. The keys
list must have string entries. If the two input lists are of
different sizes, the extra elements are ignored.
|
|
Produces the list containing the results of evaluating the body on
the corresponding elementwise pairs from the two input lists. If
the input lists are of different sizes, the extra elements are
ignored.
|
|
Requires the use of a pragma to avoid wrong removal suggestion for
path_hash.hpp.
Co-authored-by: Maksim Denisov <denisov.maksim@huawei.com>
|
|
... as described in the documentation. It was never intended to have
a single string being an argument for those.
|
|
...since we use recursion for trees a lot, but skip this check manually.
|
|
|
|
|
|
... while keeping our .clang-format file.
|
|
Originally, the expression lanuage only contained a function to
deduplicate a list, keeping only the right-most occurence. The
reason was that this is the order needed for linking: a library
providing an open symbol has to come on the command line after the
library using that symbol (and hence making it an open symbol).
However, by now use cases have emerged that require a topological
sorting where definition comes before use; also, when composing
the value of PATH from fragments, we usually want to keep the first
occurrence in order for it to take precedence. Therefore, also
add "nub_left" as built-in function, allowing a more condense (and
slightly more efficient) description in rules instead of the
revserse-nub_right-reverse pattern.
|
|
! => not; && => and, || => or
|
|
... allowing to select only the keys in a specific subdir,
and move the them to top-level.
|
|
|
|
|
|
While this can already be expressed by an "if" statement, having
a dedicated function for logical negation makes some expressions
more readable.
|
|
... using, also for the "then" branch, the empty list as default.
In this way, this statement not only more symmetric, but also
allows shorter representations of some typical expressions.
|
|
Lists are somtimes used in configurations as replacement for tuples.
Providing length gives an easy way to detect usage errors.
|
|
|
|
|
|
|
|
... which are, in particular, artifacts involved in staging conflicts.
While there, also make disjoint union honor the expression log limit.
|
|
To avoid too many intermediate results, we compute the union of
a list in a divide and conquer fashion. Of course, for a disjoint
union, the recursive calls on the lists of half the length have to
be disjoint as well, i.e., the template parameter kDisjoint has to
be passed on. Fix this.
|
|
Main culprits:
- std::size_t, std::nullptr_t, and NULL require <cstddef>
- std::move and std::forward require <utility>
- unordered maps and sets require respective includes
- std::for_each and std::all_of require <algorithm>
|
|
Numerical values are used at some places in justbuild: as value for
timeout scaling, as well as by the "range" expression that is used,
e.g., to define repreated test runs. Therefore, improve support
for numerical values by adding basic operations.
|
|
... to silence false-positive 'possible dangling reference'
warning produced by gcc 13.2.0.
|
|
While a foldl is enough to implement a reverse functionality,
adding it as a built in allows doing so in linear time.
|
|
... to obtain from a list of strings a map with those entries
as keys and true as value. In this way, repeated membership tests
in lists can be implemented more efficiently.
|
|
|
|
|
|
|
|
Signed-off-by: Goetz Brasche <goetz.brasche@huawei.com>
|
|
|
|
... to the same limit as the values occuring in the stack.
|
|
|
|
In our semantics, it was always intended that names are completely
opaque and only used by passing them to functions providing
information about a target. However, we never enforced that they not
be compared for equality, even though we always had this in mind,
and the computation of the target-level cache key was designed with
this semantics in mind. Enforce this restriction now.
|
|
|
|
Add a function transforming a list into a map. In this way, artifacts
collected positionally in a list can easily be realized as a stage
used for input to an action or output of a target.
|
|
... and detect conflicts araising this way. Also normalize
the paths after staging them to the specified subdir.
|
|
... allowing to provide additional information in case of conflict
during flat staging.
|
|
To concatenate lists (the only ability the "+" operator had),
use "++".
|
|
For historic reasons, we considerd special strings as false values.
Drop that behavior in favor of a clean LISP-like semantics: everything
is true that is not empty.
|
|
|
|
|
|
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).
|
|
This is the initial version of our tool that is able to
build itself. In can be bootstrapped by
./bin/bootstrap.py
Co-authored-by: Oliver Reiche <oliver.reiche@huawei.com>
Co-authored-by: Victor Moreno <victor.moreno1@huawei.com>
|