str.h raw

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