Branch data Line data Source code
1 : : // Copyright (c) 2019 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #ifndef BITCOIN_TEST_UTIL_STR_H
6 : : #define BITCOIN_TEST_UTIL_STR_H
7 : :
8 : : #include <string>
9 : :
10 : : bool CaseInsensitiveEqual(const std::string& s1, const std::string& s2);
11 : :
12 : : /**
13 : : * Increment a string. Useful to enumerate all fixed length strings with
14 : : * characters in [min_char, max_char].
15 : : */
16 : : template <typename CharType, size_t StringLength>
17 : 2854 : bool NextString(CharType (&string)[StringLength], CharType min_char, CharType max_char)
18 : : {
19 [ + + ]: 3558 : for (CharType& elem : string) {
20 : 3504 : bool has_next = elem != max_char;
21 [ + + + + ]: 3504 : elem = elem < min_char || elem >= max_char ? min_char : CharType(elem + 1);
22 [ + + ]: 3504 : if (has_next) return true;
23 : : }
24 : : return false;
25 : : }
26 : :
27 : : /**
28 : : * Iterate over string values and call function for each string without
29 : : * successive duplicate characters.
30 : : */
31 : : template <typename CharType, size_t StringLength, typename Fn>
32 : 54 : void ForEachNoDup(CharType (&string)[StringLength], CharType min_char, CharType max_char, Fn&& fn) {
33 [ + + ]: 2908 : for (bool has_next = true; has_next; has_next = NextString(string, min_char, max_char)) {
34 : 2854 : int prev = -1;
35 : 2854 : bool skip_string = false;
36 [ + + ]: 8154 : for (CharType c : string) {
37 [ + + ]: 6506 : if (c == prev) skip_string = true;
38 [ + + + - ]: 6506 : if (skip_string || c < min_char || c > max_char) break;
39 : 5300 : prev = c;
40 : : }
41 [ + + ]: 2854 : if (!skip_string) fn();
42 : : }
43 : 54 : }
44 : :
45 : : #endif // BITCOIN_TEST_UTIL_STR_H
|