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 : 0 : bool NextString(CharType (&string)[StringLength], CharType min_char, CharType max_char) 18 : : { 19 : 0 : for (CharType& elem : string) { 20 : 0 : bool has_next = elem != max_char; 21 : 0 : elem = elem < min_char || elem >= max_char ? min_char : CharType(elem + 1); 22 : 0 : if (has_next) return true; 23 : : } 24 : 0 : return false; 25 : 0 : } 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 : 0 : void ForEachNoDup(CharType (&string)[StringLength], CharType min_char, CharType max_char, Fn&& fn) { 33 : 0 : for (bool has_next = true; has_next; has_next = NextString(string, min_char, max_char)) { 34 : 0 : int prev = -1; 35 : 0 : bool skip_string = false; 36 : 0 : for (CharType c : string) { 37 : 0 : if (c == prev) skip_string = true; 38 : 0 : if (skip_string || c < min_char || c > max_char) break; 39 : 0 : prev = c; 40 : : } 41 : 0 : if (!skip_string) fn(); 42 : 0 : } 43 : 0 : } 44 : : 45 : : #endif // BITCOIN_TEST_UTIL_STR_H