Skip to content

Commit 93fb6c9

Browse files
committed
Add raw string comparison functions
1 parent 04b6864 commit 93fb6c9

File tree

3 files changed

+67
-14
lines changed

3 files changed

+67
-14
lines changed

include/scratchcpp/string_functions.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ extern "C"
1818
LIBSCRATCHCPP_EXPORT void string_assign(StringPtr *str, const StringPtr *another);
1919
LIBSCRATCHCPP_EXPORT void string_assign_cstring(StringPtr *str, const char *another);
2020

21-
LIBSCRATCHCPP_EXPORT int string_compare_case_sensitive(StringPtr *str1, StringPtr *str2);
22-
LIBSCRATCHCPP_EXPORT int string_compare_case_insensitive(StringPtr *str1, StringPtr *str2);
21+
LIBSCRATCHCPP_EXPORT int string_compare_raw_case_sensitive(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2);
22+
LIBSCRATCHCPP_EXPORT int string_compare_case_sensitive(const StringPtr *str1, const StringPtr *str2);
23+
24+
LIBSCRATCHCPP_EXPORT int string_compare_raw_case_insensitive(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2);
25+
LIBSCRATCHCPP_EXPORT int string_compare_case_insensitive(const StringPtr *str1, const StringPtr *str2);
2326
}
2427

2528
} // namespace libscratchcpp

src/scratch/string_functions.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,43 @@ extern "C"
5959
memcpy(str->data, converted.data(), (converted.size() + 1) * sizeof(typeof(*str->data)));
6060
}
6161

62-
int string_compare_case_sensitive(StringPtr *str1, StringPtr *str2)
62+
inline int string_compare_raw_case_sensitive_inline(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2)
6363
{
64-
if (str1->size != str2->size)
65-
return str1->size < str2->size ? -1 : 1;
64+
if (n1 != n2)
65+
return n1 < n2 ? -1 : 1;
6666

67-
const size_t min_len = std::min(str1->size, str2->size);
67+
const size_t min_len = std::min(n1, n2);
6868

6969
for (size_t i = 0; i < min_len; i++) {
70-
if (str1->data[i] != str2->data[i])
71-
return str1->data[i] - str2->data[i];
70+
if (str1[i] != str2[i])
71+
return str1[i] - str2[i];
7272
}
7373

7474
return 0;
7575
}
7676

77-
int string_compare_case_insensitive(StringPtr *str1, StringPtr *str2)
77+
int string_compare_raw_case_sensitive(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2)
7878
{
79-
if (str1->size != str2->size)
80-
return str1->size < str2->size ? -1 : 1;
79+
return string_compare_raw_case_sensitive_inline(str1, n1, str2, n2);
80+
}
81+
82+
int string_compare_case_sensitive(const StringPtr *str1, const StringPtr *str2)
83+
{
84+
return string_compare_raw_case_sensitive_inline(str1->data, str1->size, str2->data, str2->size);
85+
}
86+
87+
inline int string_compare_raw_case_insensitive_inline(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2)
88+
{
89+
if (n1 != n2)
90+
return n1 < n2 ? -1 : 1;
8191

82-
const size_t min_len = std::min(str1->size, str2->size);
92+
const size_t min_len = std::min(n1, n2);
8393
std::u32string cp1_str, cp2_str;
8494
char32_t cp1, cp2;
8595

8696
for (size_t i = 0; i < min_len; ++i) {
87-
unicode::utf16::decode(str1->data + i, 1, cp1_str);
88-
unicode::utf16::decode(str2->data + i, 1, cp2_str);
97+
unicode::utf16::decode(str1 + i, 1, cp1_str);
98+
unicode::utf16::decode(str2 + i, 1, cp2_str);
8999

90100
cp1 = unicode::simple_lowercase_mapping(cp1_str.front());
91101
cp2 = unicode::simple_lowercase_mapping(cp2_str.front());
@@ -96,6 +106,16 @@ extern "C"
96106

97107
return 0;
98108
}
109+
110+
int string_compare_raw_case_insensitive(const char16_t *str1, size_t n1, const char16_t *str2, size_t n2)
111+
{
112+
return string_compare_raw_case_insensitive_inline(str1, n1, str2, n2);
113+
}
114+
115+
int string_compare_case_insensitive(const StringPtr *str1, const StringPtr *str2)
116+
{
117+
return string_compare_raw_case_insensitive_inline(str1->data, str1->size, str2->data, str2->size);
118+
}
99119
}
100120

101121
} // namespace libscratchcpp

test/scratch_classes/string_functions_test.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,62 +93,77 @@ TEST(StringFunctionsTest, CompareCaseSensitive)
9393
string_assign_cstring(&str1, "abcd");
9494
string_assign_cstring(&str2, "abcd");
9595
ASSERT_EQ(string_compare_case_sensitive(&str1, &str2), 0);
96+
ASSERT_EQ(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
9697

9798
string_assign_cstring(&str1, "aBcd");
9899
string_assign_cstring(&str2, "abCd");
99100
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
101+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
100102

101103
string_assign_cstring(&str1, "Hello");
102104
string_assign_cstring(&str2, "olleH");
103105
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
106+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
104107

105108
string_assign_cstring(&str1, "olleH");
106109
string_assign_cstring(&str2, "Hello");
107110
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
111+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
108112

109113
string_assign_cstring(&str1, "AbCdEfGh");
110114
string_assign_cstring(&str2, "EfGhIjKl");
111115
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
116+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
112117

113118
string_assign_cstring(&str1, "EfGhIjKl");
114119
string_assign_cstring(&str2, "AbCdEfGh");
115120
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
121+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
116122

117123
string_assign_cstring(&str1, "Lorem ipsum");
118124
string_assign_cstring(&str2, "dolor sit amet");
119125
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
126+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
120127

121128
string_assign_cstring(&str1, "dolor sit amet");
122129
string_assign_cstring(&str2, "Lorem ipsum");
123130
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
131+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
124132

125133
string_assign_cstring(&str1, "Hello");
126134
string_assign_cstring(&str2, "Hello world");
127135
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
136+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
128137

129138
string_assign_cstring(&str1, "Hello world");
130139
string_assign_cstring(&str2, "Hello");
131140
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
141+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
132142

133143
string_assign_cstring(&str1, "Hello");
134144
string_assign_cstring(&str2, "Hello world");
135145
ASSERT_LT(string_compare_case_sensitive(&str1, &str2), 0);
146+
ASSERT_LT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
136147

137148
string_assign_cstring(&str1, "ábčď");
138149
string_assign_cstring(&str2, "ábčď");
139150
ASSERT_EQ(string_compare_case_sensitive(&str1, &str2), 0);
151+
ASSERT_EQ(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
140152

141153
string_assign_cstring(&str1, "ábčď");
142154
string_assign_cstring(&str2, "ábČď");
143155
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
156+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
144157

145158
string_assign_cstring(&str1, "test đ");
146159
string_assign_cstring(&str2, "test Đ");
147160
ASSERT_GT(string_compare_case_sensitive(&str1, &str2), 0);
161+
ASSERT_GT(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
148162

149163
string_assign_cstring(&str1, "💀");
150164
string_assign_cstring(&str2, "💀");
151165
ASSERT_EQ(string_compare_case_sensitive(&str1, &str2), 0);
166+
ASSERT_EQ(string_compare_raw_case_sensitive(str1.data, str1.size, str2.data, str2.size), 0);
152167
}
153168

154169
TEST(StringFunctionsTest, CompareCaseInsensitive)
@@ -158,60 +173,75 @@ TEST(StringFunctionsTest, CompareCaseInsensitive)
158173
string_assign_cstring(&str1, "abcd");
159174
string_assign_cstring(&str2, "abcd");
160175
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
176+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
161177

162178
string_assign_cstring(&str1, "aBcd");
163179
string_assign_cstring(&str2, "abCd");
164180
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
181+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
165182

166183
string_assign_cstring(&str1, "Hello");
167184
string_assign_cstring(&str2, "olleH");
168185
ASSERT_LT(string_compare_case_insensitive(&str1, &str2), 0);
186+
ASSERT_LT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
169187

170188
string_assign_cstring(&str1, "olleH");
171189
string_assign_cstring(&str2, "Hello");
172190
ASSERT_GT(string_compare_case_insensitive(&str1, &str2), 0);
191+
ASSERT_GT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
173192

174193
string_assign_cstring(&str1, "AbCdEfGh");
175194
string_assign_cstring(&str2, "EfGhIjKl");
176195
ASSERT_LT(string_compare_case_insensitive(&str1, &str2), 0);
196+
ASSERT_LT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
177197

178198
string_assign_cstring(&str1, "EfGhIjKl");
179199
string_assign_cstring(&str2, "AbCdEfGh");
180200
ASSERT_GT(string_compare_case_insensitive(&str1, &str2), 0);
201+
ASSERT_GT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
181202

182203
string_assign_cstring(&str1, "Lorem ipsum");
183204
string_assign_cstring(&str2, "dolor sit amet");
184205
ASSERT_LT(string_compare_case_insensitive(&str1, &str2), 0);
206+
ASSERT_LT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
185207

186208
string_assign_cstring(&str1, "dolor sit amet");
187209
string_assign_cstring(&str2, "Lorem ipsum");
188210
ASSERT_GT(string_compare_case_insensitive(&str1, &str2), 0);
211+
ASSERT_GT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
189212

190213
string_assign_cstring(&str1, "Hello");
191214
string_assign_cstring(&str2, "Hello world");
192215
ASSERT_LT(string_compare_case_insensitive(&str1, &str2), 0);
216+
ASSERT_LT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
193217

194218
string_assign_cstring(&str1, "Hello world");
195219
string_assign_cstring(&str2, "Hello");
196220
ASSERT_GT(string_compare_case_insensitive(&str1, &str2), 0);
221+
ASSERT_GT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
197222

198223
string_assign_cstring(&str1, "Hello");
199224
string_assign_cstring(&str2, "Hello world");
200225
ASSERT_LT(string_compare_case_insensitive(&str1, &str2), 0);
226+
ASSERT_LT(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
201227

202228
string_assign_cstring(&str1, "ábčď");
203229
string_assign_cstring(&str2, "ábčď");
204230
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
231+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
205232

206233
string_assign_cstring(&str1, "ábčď");
207234
string_assign_cstring(&str2, "ábČď");
208235
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
236+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
209237

210238
string_assign_cstring(&str1, "test đ");
211239
string_assign_cstring(&str2, "test Đ");
212240
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
241+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
213242

214243
string_assign_cstring(&str1, "💀");
215244
string_assign_cstring(&str2, "💀");
216245
ASSERT_EQ(string_compare_case_insensitive(&str1, &str2), 0);
246+
ASSERT_EQ(string_compare_raw_case_insensitive(str1.data, str1.size, str2.data, str2.size), 0);
217247
}

0 commit comments

Comments
 (0)