From ca2283bdc00529967f9ccd9bf0097714447af351 Mon Sep 17 00:00:00 2001 From: Matthew Krupcale Date: Sun, 9 Aug 2020 09:37:19 -0400 Subject: Add iterator-based versions of find_option{,_prefix} This allows one to use all of the properties of iterators to manipulate the found option. --- libbuild2/utility.hxx | 16 +++++++++++++--- libbuild2/utility.ixx | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) (limited to 'libbuild2') diff --git a/libbuild2/utility.hxx b/libbuild2/utility.hxx index 7a6ada2..b747667 100644 --- a/libbuild2/utility.hxx +++ b/libbuild2/utility.hxx @@ -633,7 +633,8 @@ namespace build2 F&& get = [] (const string& s) {return s;}); // Check if a specified option is present in the variable or value. T is - // either target or scope. + // either target or scope. For the interator version use rbegin()/rend() to + // search backwards. // template bool @@ -649,6 +650,10 @@ namespace build2 const char* variable, bool ignore_case = false); + template + I + find_option (const char* option, I begin, I end, bool ignore_case = false); + LIBBUILD2_SYMEXPORT bool find_option (const char* option, const lookup&, bool ignore_case = false); @@ -691,8 +696,9 @@ namespace build2 // As above but look for an option that has the specified prefix. Return the // pointer to option or NULL if not found (thus can be used as bool). - // Search backward (which is normall consistent with how options override - // each other). + // Search backward (which is normally consistent with how options override + // each other). For the interator version use rbegin()/rend() to do the + // same. // template const string* @@ -702,6 +708,10 @@ namespace build2 const string* find_option_prefix (const char* prefix, T&, const char*, bool = false); + template + I + find_option_prefix (const char* prefix, I begin, I end, bool = false); + LIBBUILD2_SYMEXPORT const string* find_option_prefix (const char* prefix, const lookup&, bool = false); diff --git a/libbuild2/utility.ixx b/libbuild2/utility.ixx index da9f58b..9a77fae 100644 --- a/libbuild2/utility.ixx +++ b/libbuild2/utility.ixx @@ -139,6 +139,29 @@ namespace build2 return find_option (o, s[var], ic); } + inline bool + compare_option (const char* o, const char* s, bool ic) + { + return s != nullptr && (ic ? icasecmp (s, o) : strcmp (s, o)) == 0; + } + + inline bool + compare_option (const char* o, const string& s, bool ic) + { + return ic ? icasecmp (s, o) == 0 : s == o; + } + + template + inline I + find_option (const char* o, I b, I e, bool ic) + { + for (; b != e; ++b) + if (compare_option (o, *b, ic)) + return b; + + return e; + } + template inline bool find_options (const initializer_list& os, @@ -173,6 +196,31 @@ namespace build2 return find_option_prefix (p, s[var], ic); } + inline bool + compare_option_prefix (const char* p, size_t n, const char* s, bool ic) + { + return s != nullptr && (ic ? icasecmp (s, p, n) : strncmp (s, p, n)) == 0; + } + + inline bool + compare_option_prefix (const char* p, size_t n, const string& s, bool ic) + { + return (ic ? icasecmp (s, p, n) : s.compare (0, n, p)) == 0; + } + + template + inline I + find_option_prefix (const char* p, I b, I e, bool ic) + { + size_t n (strlen (p)); + + for (; b != e; ++b) + if (compare_option_prefix (p, n, *b, ic)) + return b; + + return e; + } + template inline const string* find_option_prefixes (const initializer_list& ps, -- cgit v1.1