From e872913956c05c6fe1826ff3f2a3e67953e31064 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 23 Jun 2022 06:36:20 +0200 Subject: Minor enhancements to algorithms --- libbuild2/algorithm.hxx | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'libbuild2/algorithm.hxx') diff --git a/libbuild2/algorithm.hxx b/libbuild2/algorithm.hxx index 75976bf..db3e93d 100644 --- a/libbuild2/algorithm.hxx +++ b/libbuild2/algorithm.hxx @@ -145,6 +145,15 @@ namespace build2 const string* ext = nullptr, const scope* = nullptr); + template + const T* + search_existing (context&, + const dir_path& dir, + const dir_path& out, + const string& name, + const string* ext = nullptr, + const scope* = nullptr); + // Search for a target identified by the name. The semantics is "as if" we // first created a prerequisite based on this name in exactly the same way // as the parser would and then searched based on this prerequisite. If the @@ -471,11 +480,8 @@ namespace build2 // dependencies. Similar in semantics to match_prerequisites(). Any marked // target pointers are skipped. // - // T can only be const target* or prerequisite_target. - // - template - void - match_members (action, target&, T const*, size_t); + LIBBUILD2_SYMEXPORT void + match_members (action, target&, const target* const*, size_t); template inline void @@ -484,14 +490,16 @@ namespace build2 match_members (a, t, ts, N); } - inline void + // As above plus if the include mask (first) and value (second) are + // specified, then only match prerequisites that satisfy the + // ((prerequisite_target::include & mask) == value) condition. + // + LIBBUILD2_SYMEXPORT void match_members (action a, target& t, prerequisite_targets& ts, - size_t start = 0) - { - match_members (a, t, ts.data () + start, ts.size () - start); - } + size_t start = 0, + pair include = {0, 0}); // Unless already known, match, and, if necessary, execute the group in // order to resolve its members list. Note that even after that the member's -- cgit v1.1