Mercurial > foo_out_sdl
comparison foosdk/sdk/pfc/string-compare.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 #include "string-part.h" | |
| 3 #include "primitives.h" | |
| 4 | |
| 5 namespace pfc { | |
| 6 int wstricmp_ascii(const wchar_t* s1, const wchar_t* s2) throw(); | |
| 7 int stricmp_ascii(const char* s1, const char* s2) throw(); | |
| 8 int stricmp_ascii_ex(const char* s1, t_size len1, const char* s2, t_size len2) throw(); | |
| 9 | |
| 10 // Platform-independant lowlevel natural sort implementation | |
| 11 int naturalSortCompare(const char* s1, const char* s2) throw(); | |
| 12 int naturalSortCompareI(const char* s1, const char* s2) throw(); | |
| 13 | |
| 14 // System-specialized natural sort compare, better ordering of Unicode text, specialized for Apple and MS platforms | |
| 15 // Falls back to naturalSortCompare/naturalSortCompareI where not available | |
| 16 int sysNaturalSortCompare(const char* s1, const char* s2); | |
| 17 int sysNaturalSortCompareI(const char* s1, const char* s2); | |
| 18 | |
| 19 int strcmp_ex(const char* p1, t_size n1, const char* p2, t_size n2) throw(); | |
| 20 int strcmp_nc(const char* p1, size_t n1, const char* p2, size_t n2) throw(); | |
| 21 | |
| 22 bool stringEqualsI_utf8(const char* p1, const char* p2) throw(); | |
| 23 bool stringEqualsI_ascii(const char* p1, const char* p2) throw(); | |
| 24 bool stringEqualsI_ascii_ex(const char* p1, size_t l1, const char* p2, size_t l2) throw(); | |
| 25 | |
| 26 int stringCompareCaseInsensitive(const char* s1, const char* s2); | |
| 27 int stringCompareCaseInsensitiveEx(string_part_ref s1, string_part_ref s2); | |
| 28 | |
| 29 template<typename T> inline const char* stringToPtr(T const& val) { return val.c_str(); } | |
| 30 inline const char* stringToPtr(const char* val) { return val; } | |
| 31 | |
| 32 class _stringComparatorCommon { | |
| 33 protected: | |
| 34 template<typename T> static const char* myStringToPtr(const T& val) { return stringToPtr(val); } | |
| 35 static const char* myStringToPtr(string_part_ref); | |
| 36 }; | |
| 37 | |
| 38 class stringComparatorCaseSensitive : private _stringComparatorCommon { | |
| 39 public: | |
| 40 template<typename T1, typename T2> | |
| 41 static int compare(T1 const& v1, T2 const& v2) { | |
| 42 if (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) { | |
| 43 return compare_ex(stringToRef(v1), stringToRef(v2)); | |
| 44 } else { | |
| 45 return strcmp(myStringToPtr(v1), myStringToPtr(v2)); | |
| 46 } | |
| 47 } | |
| 48 static int compare_ex(string_part_ref v1, string_part_ref v2) { | |
| 49 return strcmp_ex(v1.m_ptr, v1.m_len, v2.m_ptr, v2.m_len); | |
| 50 } | |
| 51 static int compare_ex(const char* v1, t_size l1, const char* v2, t_size l2) { | |
| 52 return strcmp_ex(v1, l1, v2, l2); | |
| 53 } | |
| 54 }; | |
| 55 class stringComparatorCaseInsensitive : private _stringComparatorCommon { | |
| 56 public: | |
| 57 template<typename T1, typename T2> | |
| 58 static int compare(T1 const& v1, T2 const& v2) { | |
| 59 if constexpr (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) { | |
| 60 return stringCompareCaseInsensitiveEx(stringToRef(v1), stringToRef(v2)); | |
| 61 } else { | |
| 62 return stringCompareCaseInsensitive(myStringToPtr(v1), myStringToPtr(v2)); | |
| 63 } | |
| 64 } | |
| 65 }; | |
| 66 class stringComparatorCaseInsensitiveASCII : private _stringComparatorCommon { | |
| 67 public: | |
| 68 template<typename T1, typename T2> | |
| 69 static int compare(T1 const& v1, T2 const& v2) { | |
| 70 if constexpr (is_same_type<T1, string_part_ref>::value || is_same_type<T2, string_part_ref>::value) { | |
| 71 return compare_ex(stringToRef(v1), stringToRef(v2)); | |
| 72 } else { | |
| 73 return stricmp_ascii(myStringToPtr(v1), myStringToPtr(v2)); | |
| 74 } | |
| 75 } | |
| 76 static int compare_ex(string_part_ref v1, string_part_ref v2) { | |
| 77 return stricmp_ascii_ex(v1.m_ptr, v1.m_len, v2.m_ptr, v2.m_len); | |
| 78 } | |
| 79 static int compare_ex(const char* v1, t_size l1, const char* v2, t_size l2) { | |
| 80 return stricmp_ascii_ex(v1, l1, v2, l2); | |
| 81 } | |
| 82 }; | |
| 83 | |
| 84 class comparator_strcmp { | |
| 85 public: | |
| 86 inline static int compare(const char* p_item1, const char* p_item2) { return strcmp(p_item1, p_item2); } | |
| 87 inline static int compare(const wchar_t* item1, const wchar_t* item2) { return wcscmp(item1, item2); } | |
| 88 | |
| 89 static int compare(const char* p_item1, string_part_ref p_item2) { | |
| 90 return strcmp_ex(p_item1, SIZE_MAX, p_item2.m_ptr, p_item2.m_len); | |
| 91 } | |
| 92 static int compare(string_part_ref p_item1, string_part_ref p_item2) { | |
| 93 return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2.m_ptr, p_item2.m_len); | |
| 94 } | |
| 95 static int compare(string_part_ref p_item1, const char* p_item2) { | |
| 96 return strcmp_ex(p_item1.m_ptr, p_item1.m_len, p_item2, SIZE_MAX); | |
| 97 } | |
| 98 }; | |
| 99 | |
| 100 class comparator_stricmp_ascii { | |
| 101 public: | |
| 102 inline static int compare(const char* p_item1, const char* p_item2) { return stricmp_ascii(p_item1, p_item2); } | |
| 103 }; | |
| 104 | |
| 105 | |
| 106 class comparator_naturalSort { | |
| 107 public: | |
| 108 inline static int compare(const char* i1, const char* i2) throw() { return naturalSortCompare(i1, i2); } | |
| 109 }; | |
| 110 | |
| 111 | |
| 112 template<typename t_char> int _strcmp_partial_ex(const t_char* p_string, t_size p_string_length, const t_char* p_substring, t_size p_substring_length) throw() { | |
| 113 for (t_size walk = 0; walk < p_substring_length; walk++) { | |
| 114 t_char stringchar = (walk >= p_string_length ? 0 : p_string[walk]); | |
| 115 t_char substringchar = p_substring[walk]; | |
| 116 int result = compare_t(stringchar, substringchar); | |
| 117 if (result != 0) return result; | |
| 118 } | |
| 119 return 0; | |
| 120 } | |
| 121 | |
| 122 template<typename t_char> int strcmp_partial_ex_t(const t_char* p_string, t_size p_string_length, const t_char* p_substring, t_size p_substring_length) throw() { | |
| 123 p_string_length = strlen_max_t(p_string, p_string_length); p_substring_length = strlen_max_t(p_substring, p_substring_length); | |
| 124 return _strcmp_partial_ex(p_string, p_string_length, p_substring, p_substring_length); | |
| 125 } | |
| 126 | |
| 127 template<typename t_char> | |
| 128 int strcmp_partial_t(const t_char* p_string, const t_char* p_substring) throw() { return strcmp_partial_ex_t(p_string, SIZE_MAX, p_substring, SIZE_MAX); } | |
| 129 | |
| 130 inline int strcmp_partial_ex(const char* str, t_size strLen, const char* substr, t_size substrLen) throw() { return strcmp_partial_ex_t(str, strLen, substr, substrLen); } | |
| 131 inline int strcmp_partial(const char* str, const char* substr) throw() { return strcmp_partial_t(str, substr); } | |
| 132 | |
| 133 int stricmp_ascii_partial(const char* str, const char* substr) throw(); | |
| 134 | |
| 135 } |
