LLVM OpenMP
TestStringRef.cpp
Go to the documentation of this file.
1//===- TestStringRef.cpp - Tests for kmp_str_ref class -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "kmp_adt.h"
10#include "kmp.h"
11#include "gtest/gtest.h"
12#include <cstring>
13
14namespace {
15
16// Helper to compare kmp_str_ref content with a C string
17static bool equals(const kmp_str_ref &s, const char *expected) {
18 size_t expected_len = strlen(expected);
19 if (s.length() != expected_len)
20 return false;
21 return memcmp(s.begin(), expected, expected_len) == 0;
22}
23
24//===----------------------------------------------------------------------===//
25// Construction and Basic Properties
26//===----------------------------------------------------------------------===//
27
28TEST(kmp_str_ref_test, ConstructFromCString) {
29 kmp_str_ref s("Hello");
30 EXPECT_EQ(s.length(), 5u);
31 EXPECT_TRUE(equals(s, "Hello"));
32}
33
34TEST(kmp_str_ref_test, ConstructFromCStringWithLength) {
35 kmp_str_ref s("Hello World", 5);
36 EXPECT_EQ(s.length(), 5u);
37 EXPECT_TRUE(equals(s, "Hello"));
38}
39
40TEST(kmp_str_ref_test, ConstructEmpty) {
41 kmp_str_ref s("");
42 EXPECT_EQ(s.length(), 0u);
43 EXPECT_TRUE(s.empty());
44}
45
46TEST(kmp_str_ref_test, ConstructFromNullptr) {
47 const char *null_str = nullptr;
48 kmp_str_ref s(null_str);
49 EXPECT_EQ(s.length(), 0u);
50 EXPECT_TRUE(s.empty());
51}
52
53TEST(kmp_str_ref_test, ConstructFromNullptrWithLength) {
54 kmp_str_ref s(nullptr, 0);
55 EXPECT_EQ(s.length(), 0u);
56 EXPECT_TRUE(s.empty());
57}
58
59TEST(kmp_str_ref_test, NullptrOperations) {
60 const char *null_str = nullptr;
61 kmp_str_ref s(null_str);
62
63 // Iterators on a null-backed string must be consistent and yield no
64 // elements.
65 EXPECT_EQ(s.begin(), s.end());
66 EXPECT_EQ(s.end() - s.begin(), 0);
67
68 std::string result;
69 for (char c : s)
70 result += c;
71 EXPECT_TRUE(result.empty());
72
73 // Consuming the empty prefix must succeed and leave the string empty.
74 EXPECT_TRUE(s.consume_front(""));
75 EXPECT_TRUE(s.empty());
76
77 // Consuming a non-empty prefix must fail without dereferencing data.
78 EXPECT_FALSE(s.consume_front("x"));
79
80 // count_while must not dereference data when the string is empty.
81 EXPECT_EQ(s.count_while([](char) { return true; }), 0u);
82}
83
84TEST(kmp_str_ref_test, Length) {
85 EXPECT_EQ(kmp_str_ref("").length(), 0u);
86 EXPECT_EQ(kmp_str_ref("a").length(), 1u);
87 EXPECT_EQ(kmp_str_ref("hello").length(), 5u);
88 EXPECT_EQ(kmp_str_ref("hello world").length(), 11u);
89}
90
91TEST(kmp_str_ref_test, Size) {
92 EXPECT_EQ(kmp_str_ref("").size(), 0u);
93 EXPECT_EQ(kmp_str_ref("a").size(), 1u);
94 EXPECT_EQ(kmp_str_ref("hello").size(), 5u);
95 EXPECT_EQ(kmp_str_ref("hello world").size(), 11u);
96}
97
98//===----------------------------------------------------------------------===//
99// empty
100//===----------------------------------------------------------------------===//
101
102TEST(kmp_str_ref_test, EmptyString) {
103 kmp_str_ref s("");
104 EXPECT_TRUE(s.empty());
105}
106
107TEST(kmp_str_ref_test, NonEmptyString) {
108 kmp_str_ref s("hello");
109 EXPECT_FALSE(s.empty());
110}
111
112TEST(kmp_str_ref_test, EmptyAfterConsumeFront) {
113 kmp_str_ref s("hello");
114 EXPECT_FALSE(s.empty());
115
116 s.consume_front("hello");
117
118 EXPECT_TRUE(s.empty());
119 EXPECT_EQ(s.length(), 0u);
120}
121
122TEST(kmp_str_ref_test, EmptyAfterDropFront) {
123 kmp_str_ref s("abc");
124 EXPECT_FALSE(s.empty());
125
126 s.drop_front(3);
127
128 EXPECT_TRUE(s.empty());
129 EXPECT_EQ(s.length(), 0u);
130}
131
132TEST(kmp_str_ref_test, EmptyAfterDropWhile) {
133 kmp_str_ref s("12345");
134 EXPECT_FALSE(s.empty());
135
136 s.drop_while([](char c) {
137 return static_cast<bool>(isdigit(static_cast<unsigned char>(c)));
138 });
139
140 EXPECT_TRUE(s.empty());
141 EXPECT_EQ(s.length(), 0u);
142}
143
144TEST(kmp_str_ref_test, EmptyAfterConsumeInteger) {
145 kmp_str_ref s("42");
146 int value = 0;
147 EXPECT_FALSE(s.empty());
148
149 s.consume_integer(value);
150
151 EXPECT_TRUE(s.empty());
152 EXPECT_EQ(s.length(), 0u);
153 EXPECT_EQ(value, 42);
154}
155
156TEST(kmp_str_ref_test, NotEmptyAfterPartialConsume) {
157 kmp_str_ref s("123abc");
158 int value = 0;
159
160 s.consume_integer(value);
161
162 EXPECT_FALSE(s.empty());
163 EXPECT_EQ(s.length(), 3u);
164 EXPECT_TRUE(equals(s, "abc"));
165}
166
167//===----------------------------------------------------------------------===//
168// Iterators
169//===----------------------------------------------------------------------===//
170
171TEST(kmp_str_ref_test, BeginEnd) {
172 kmp_str_ref s("Hello");
173 EXPECT_EQ(s.end() - s.begin(), 5);
174 EXPECT_EQ(*s.begin(), 'H');
175}
176
177TEST(kmp_str_ref_test, RangeBasedFor) {
178 kmp_str_ref s("abc");
179 std::string result;
180 for (char c : s) {
181 result += c;
182 }
183 EXPECT_EQ(result, "abc");
184}
185
186//===----------------------------------------------------------------------===//
187// Assignment
188//===----------------------------------------------------------------------===//
189
190TEST(kmp_str_ref_test, Assignment) {
191 kmp_str_ref s1("First");
192 kmp_str_ref s2("Second");
193
194 s1 = s2;
195
196 EXPECT_TRUE(equals(s1, "Second"));
197 EXPECT_EQ(s1.length(), 6u);
198}
199
200TEST(kmp_str_ref_test, SelfAssignment) {
201 kmp_str_ref s("Test");
202 kmp_str_ref &s_ref = s;
203 s = s_ref; // Avoid self-assignment warning
204 EXPECT_TRUE(equals(s, "Test"));
205 EXPECT_EQ(s.length(), 4u);
206}
207
208//===----------------------------------------------------------------------===//
209// consume_front
210//===----------------------------------------------------------------------===//
211
212TEST(kmp_str_ref_test, ConsumeFrontSuccess) {
213 kmp_str_ref s("Hello World");
214
215 EXPECT_TRUE(s.consume_front("Hello"));
216 EXPECT_EQ(s.length(), 6u);
217 EXPECT_TRUE(equals(s, " World"));
218}
219
220TEST(kmp_str_ref_test, ConsumeFrontFailure) {
221 kmp_str_ref s("Hello World");
222
223 EXPECT_FALSE(s.consume_front("World"));
224 EXPECT_EQ(s.length(), 11u);
225 EXPECT_TRUE(equals(s, "Hello World"));
226}
227
228TEST(kmp_str_ref_test, ConsumeFrontEmpty) {
229 kmp_str_ref s("Hello");
230
231 EXPECT_TRUE(s.consume_front(""));
232 EXPECT_EQ(s.length(), 5u);
233}
234
235TEST(kmp_str_ref_test, ConsumeFrontTooLong) {
236 kmp_str_ref s("Hi");
237
238 EXPECT_FALSE(s.consume_front("Hello"));
239 EXPECT_EQ(s.length(), 2u);
240}
241
242TEST(kmp_str_ref_test, ConsumeFrontExact) {
243 kmp_str_ref s("Hello");
244
245 EXPECT_TRUE(s.consume_front("Hello"));
246 EXPECT_EQ(s.length(), 0u);
247}
248
249TEST(kmp_str_ref_test, ConsumeFrontMultiple) {
250 kmp_str_ref s("prefix:middle:suffix");
251
252 EXPECT_TRUE(s.consume_front("prefix"));
253 EXPECT_TRUE(s.consume_front(":"));
254 EXPECT_TRUE(s.consume_front("middle"));
255 EXPECT_TRUE(s.consume_front(":"));
256 EXPECT_TRUE(equals(s, "suffix"));
257}
258
259//===----------------------------------------------------------------------===//
260// consume_integer
261//===----------------------------------------------------------------------===//
262
263TEST(kmp_str_ref_test, ConsumeIntegerSimple) {
264 kmp_str_ref s("42");
265 int value = 0;
266
267 EXPECT_TRUE(s.consume_integer(value));
268 EXPECT_EQ(value, 42);
269 EXPECT_EQ(s.length(), 0u);
270}
271
272TEST(kmp_str_ref_test, ConsumeIntegerWithTrailing) {
273 kmp_str_ref s("123abc");
274 int value = 0;
275
276 EXPECT_TRUE(s.consume_integer(value));
277 EXPECT_EQ(value, 123);
278 EXPECT_TRUE(equals(s, "abc"));
279}
280
281TEST(kmp_str_ref_test, ConsumeIntegerZero) {
282 kmp_str_ref s("0");
283 int value = -1;
284
285 // allow_zero = true by default
286 EXPECT_TRUE(s.consume_integer(value));
287 EXPECT_EQ(value, 0);
288 EXPECT_EQ(s.length(), 0u);
289}
290
291TEST(kmp_str_ref_test, ConsumeIntegerZeroNotAllowed) {
292 kmp_str_ref s("0rest");
293 int value = -1;
294
295 EXPECT_FALSE(s.consume_integer(value, /*allow_zero=*/false));
296 // State should be restored on failure
297 EXPECT_TRUE(equals(s, "0rest"));
298}
299
300TEST(kmp_str_ref_test, ConsumeIntegerNoDigits) {
301 kmp_str_ref s("abc");
302 int value = -1;
303
304 // No digits to consume, should fail
305 EXPECT_FALSE(s.consume_integer(value));
306 // String should be unchanged
307 EXPECT_TRUE(equals(s, "abc"));
308}
309
310TEST(kmp_str_ref_test, ConsumeIntegerEmpty) {
311 kmp_str_ref s("");
312 int value = -1;
313
314 // Empty string has no digits, should fail
315 EXPECT_FALSE(s.consume_integer(value));
316}
317
318TEST(kmp_str_ref_test, ConsumeIntegerLeadingZero) {
319 kmp_str_ref s("007");
320 int value = -1;
321
322 EXPECT_TRUE(s.consume_integer(value));
323 EXPECT_EQ(value, 7);
324 EXPECT_EQ(s.length(), 0u);
325}
326
327TEST(kmp_str_ref_test, ConsumeIntegerNegativeAllowed) {
328 kmp_str_ref s("-42rest");
329 int value = 0;
330
331 EXPECT_TRUE(s.consume_integer(value, true, true));
332 EXPECT_EQ(value, -42);
333 EXPECT_TRUE(equals(s, "rest"));
334}
335
336TEST(kmp_str_ref_test, ConsumeIntegerNegativeNotAllowed) {
337 kmp_str_ref s("-42");
338 int value = 0;
339
340 EXPECT_FALSE(s.consume_integer(value, true, false));
341 // State should be restored on failure
342 EXPECT_TRUE(equals(s, "-42"));
343}
344
345TEST(kmp_str_ref_test, ConsumeIntegerMultipleDigits) {
346 kmp_str_ref s("1234567890");
347 int value = 0;
348
349 EXPECT_TRUE(s.consume_integer(value));
350 EXPECT_EQ(value, 1234567890);
351}
352
353//===----------------------------------------------------------------------===//
354// copy
355//===----------------------------------------------------------------------===//
356
357TEST(kmp_str_ref_test, Copy) {
358 kmp_str_ref s("Hello");
359 char *copied = s.copy();
360
361 EXPECT_NE(copied, nullptr);
362 EXPECT_STREQ(copied, "Hello");
363 EXPECT_NE(copied, s.begin()); // Different pointer
364
365 KMP_INTERNAL_FREE(copied);
366}
367
368TEST(kmp_str_ref_test, CopyEmpty) {
369 kmp_str_ref s("");
370 char *copied = s.copy();
371
372 EXPECT_NE(copied, nullptr);
373 EXPECT_STREQ(copied, "");
374
375 KMP_INTERNAL_FREE(copied);
376}
377
378TEST(kmp_str_ref_test, CopySubstring) {
379 // Test copying a substring that doesn't have a null terminator at len
380 kmp_str_ref full("device-0)rest");
381 kmp_str_ref sub = full.take_while([](char c) { return c != ')'; });
382
383 EXPECT_EQ(sub.length(), 8u); // "device-0"
384
385 char *copied = sub.copy();
386
387 EXPECT_NE(copied, nullptr);
388 EXPECT_STREQ(copied, "device-0"); // Should NOT include ")"
389 EXPECT_EQ(strlen(copied), 8u);
390
391 KMP_INTERNAL_FREE(copied);
392}
393
394//===----------------------------------------------------------------------===//
395// drop_front
396//===----------------------------------------------------------------------===//
397
398TEST(kmp_str_ref_test, DropFront) {
399 kmp_str_ref s("Hello World");
400
401 s.drop_front(6);
402
403 EXPECT_EQ(s.length(), 5u);
404 EXPECT_TRUE(equals(s, "World"));
405}
406
407TEST(kmp_str_ref_test, DropFrontZero) {
408 kmp_str_ref s("Hello");
409
410 s.drop_front(0);
411
412 EXPECT_EQ(s.length(), 5u);
413 EXPECT_TRUE(equals(s, "Hello"));
414}
415
416TEST(kmp_str_ref_test, DropFrontAll) {
417 kmp_str_ref s("Hello");
418
419 s.drop_front(5);
420
421 EXPECT_EQ(s.length(), 0u);
422}
423
424TEST(kmp_str_ref_test, DropFrontMoreThanLength) {
425 kmp_str_ref s("Hi");
426
427 s.drop_front(100);
428
429 EXPECT_EQ(s.length(), 0u);
430}
431
432//===----------------------------------------------------------------------===//
433// drop_while
434//===----------------------------------------------------------------------===//
435
436TEST(kmp_str_ref_test, DropWhileDigits) {
437 kmp_str_ref s("123abc");
438
439 s.drop_while([](char c) {
440 return static_cast<bool>(isdigit(static_cast<unsigned char>(c)));
441 });
442
443 EXPECT_TRUE(equals(s, "abc"));
444}
445
446TEST(kmp_str_ref_test, DropWhileSpaces) {
447 kmp_str_ref s(" hello");
448
449 s.drop_while([](char c) { return c == ' '; });
450
451 EXPECT_TRUE(equals(s, "hello"));
452}
453
454TEST(kmp_str_ref_test, DropWhileNone) {
455 kmp_str_ref s("hello");
456
457 s.drop_while([](char c) { return c == ' '; });
458
459 EXPECT_TRUE(equals(s, "hello"));
460}
461
462TEST(kmp_str_ref_test, DropWhileAll) {
463 kmp_str_ref s("12345");
464
465 s.drop_while([](char c) {
466 return static_cast<bool>(isdigit(static_cast<unsigned char>(c)));
467 });
468
469 EXPECT_EQ(s.length(), 0u);
470}
471
472//===----------------------------------------------------------------------===//
473// count_while
474//===----------------------------------------------------------------------===//
475
476TEST(kmp_str_ref_test, CountWhileDigits) {
477 kmp_str_ref s("123abc");
478
479 size_t n = s.count_while(
480 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
481
482 EXPECT_EQ(n, 3u);
483}
484
485TEST(kmp_str_ref_test, CountWhileAll) {
486 kmp_str_ref s("12345");
487
488 size_t n = s.count_while(
489 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
490
491 EXPECT_EQ(n, s.length());
492}
493
494TEST(kmp_str_ref_test, CountWhileNone) {
495 kmp_str_ref s("abc");
496
497 size_t n = s.count_while(
498 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
499
500 EXPECT_EQ(n, 0u);
501}
502
503TEST(kmp_str_ref_test, CountWhileEmpty) {
504 kmp_str_ref s("");
505
506 size_t n = s.count_while([](char c) { return c == 'a'; });
507
508 EXPECT_EQ(n, 0u);
509}
510
511//===----------------------------------------------------------------------===//
512// find_if
513//===----------------------------------------------------------------------===//
514
515TEST(kmp_str_ref_test, FindIfDigit) {
516 kmp_str_ref s("abc123");
517
518 size_t i = s.find_if(
519 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
520
521 EXPECT_EQ(i, 3u);
522}
523
524TEST(kmp_str_ref_test, FindIfFirstChar) {
525 kmp_str_ref s("hello");
526
527 size_t i = s.find_if([](char c) { return c == 'h'; });
528
529 EXPECT_EQ(i, 0u);
530}
531
532TEST(kmp_str_ref_test, FindIfLastChar) {
533 kmp_str_ref s("hello");
534
535 size_t i = s.find_if([](char c) { return c == 'o'; });
536
537 EXPECT_EQ(i, 4u);
538}
539
540TEST(kmp_str_ref_test, FindIfNoMatch) {
541 kmp_str_ref s("hello");
542
543 size_t i = s.find_if(
544 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
545
546 EXPECT_EQ(i, kmp_str_ref::npos);
547}
548
549TEST(kmp_str_ref_test, FindIfEmpty) {
550 kmp_str_ref s("");
551
552 size_t i = s.find_if([](char c) { return c == 'a'; });
553
554 EXPECT_EQ(i, kmp_str_ref::npos);
555}
556
557//===----------------------------------------------------------------------===//
558// find_if_not
559//===----------------------------------------------------------------------===//
560
561TEST(kmp_str_ref_test, FindIfNotDigit) {
562 kmp_str_ref s("123abc");
563
564 size_t i = s.find_if_not(
565 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
566
567 EXPECT_EQ(i, 3u);
568}
569
570TEST(kmp_str_ref_test, FindIfNotAllMatch) {
571 kmp_str_ref s("12345");
572
573 size_t i = s.find_if_not(
574 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
575
576 EXPECT_EQ(i, kmp_str_ref::npos);
577}
578
579TEST(kmp_str_ref_test, FindIfNotNoneMatch) {
580 kmp_str_ref s("abc");
581
582 size_t i = s.find_if_not(
583 [](char c) { return isdigit(static_cast<unsigned char>(c)) != 0; });
584
585 EXPECT_EQ(i, 0u);
586}
587
588TEST(kmp_str_ref_test, FindIfNotEmpty) {
589 kmp_str_ref s("");
590
591 size_t i = s.find_if_not([](char c) { return c == 'a'; });
592
593 EXPECT_EQ(i, kmp_str_ref::npos);
594}
595
596//===----------------------------------------------------------------------===//
597// skip_space
598//===----------------------------------------------------------------------===//
599
600TEST(kmp_str_ref_test, SkipSpace) {
601 kmp_str_ref s(" hello");
602
603 s.skip_space();
604
605 EXPECT_TRUE(equals(s, "hello"));
606}
607
608TEST(kmp_str_ref_test, SkipSpaceNoSpaces) {
609 kmp_str_ref s("hello");
610
611 s.skip_space();
612
613 EXPECT_TRUE(equals(s, "hello"));
614}
615
616TEST(kmp_str_ref_test, SkipSpaceAllSpaces) {
617 kmp_str_ref s(" ");
618
619 s.skip_space();
620
621 EXPECT_EQ(s.length(), 0u);
622}
623
624TEST(kmp_str_ref_test, SkipSpaceOnlyLeading) {
625 kmp_str_ref s(" hello world ");
626
627 s.skip_space();
628
629 EXPECT_TRUE(equals(s, "hello world "));
630}
631
632TEST(kmp_str_ref_test, SkipSpaceWithTabs) {
633 kmp_str_ref s("\t\n hello");
634
635 s.skip_space();
636
637 EXPECT_TRUE(equals(s, "hello"));
638}
639
640//===----------------------------------------------------------------------===//
641// take_while
642//===----------------------------------------------------------------------===//
643
644TEST(kmp_str_ref_test, TakeWhileDigits) {
645 kmp_str_ref s("123abc");
646
647 kmp_str_ref digits = s.take_while([](char c) {
648 return static_cast<bool>(isdigit(static_cast<unsigned char>(c)));
649 });
650
651 EXPECT_EQ(digits.length(), 3u);
652 EXPECT_TRUE(equals(digits, "123"));
653 // Original unchanged
654 EXPECT_EQ(s.length(), 6u);
655}
656
657TEST(kmp_str_ref_test, TakeWhileAlpha) {
658 kmp_str_ref s("hello123");
659
660 kmp_str_ref alpha = s.take_while([](char c) {
661 return static_cast<bool>(isalpha(static_cast<unsigned char>(c)));
662 });
663
664 EXPECT_EQ(alpha.length(), 5u);
665 EXPECT_TRUE(equals(alpha, "hello"));
666}
667
668TEST(kmp_str_ref_test, TakeWhileNone) {
669 kmp_str_ref s("123abc");
670
671 kmp_str_ref result = s.take_while([](char c) {
672 return static_cast<bool>(isalpha(static_cast<unsigned char>(c)));
673 });
674
675 EXPECT_EQ(result.length(), 0u);
676}
677
678TEST(kmp_str_ref_test, TakeWhileAll) {
679 kmp_str_ref s("hello");
680
681 kmp_str_ref result = s.take_while([](char c) {
682 return static_cast<bool>(isalpha(static_cast<unsigned char>(c)));
683 });
684
685 EXPECT_EQ(result.length(), 5u);
686 EXPECT_TRUE(equals(result, "hello"));
687}
688
689//===----------------------------------------------------------------------===//
690// Integration / Complex Scenarios
691//===----------------------------------------------------------------------===//
692
693TEST(kmp_str_ref_test, ParseKeyValuePair) {
694 kmp_str_ref s("key=value");
695
696 kmp_str_ref key = s.take_while([](char c) { return c != '='; });
697 s.drop_front(key.length());
698 s.consume_front("=");
699
700 EXPECT_EQ(key.length(), 3u);
701 EXPECT_TRUE(equals(key, "key"));
702 EXPECT_TRUE(equals(s, "value"));
703}
704
705TEST(kmp_str_ref_test, ParseCommaSeparated) {
706 kmp_str_ref s("1,2,3");
707 int values[3] = {0, 0, 0};
708 int count = 0;
709
710 while (s.length() > 0 && count < 3) {
711 s.consume_integer(values[count++]);
712 s.consume_front(",");
713 }
714
715 EXPECT_EQ(count, 3);
716 EXPECT_EQ(values[0], 1);
717 EXPECT_EQ(values[1], 2);
718 EXPECT_EQ(values[2], 3);
719}
720
721TEST(kmp_str_ref_test, ParseWithWhitespace) {
722 kmp_str_ref s(" hello world ");
723
724 s.skip_space();
725 kmp_str_ref word1 = s.take_while([](char c) { return c != ' '; });
726 s.drop_front(word1.length());
727 s.skip_space();
728 kmp_str_ref word2 = s.take_while([](char c) { return c != ' '; });
729
730 EXPECT_EQ(word1.length(), 5u);
731 EXPECT_TRUE(equals(word1, "hello"));
732 EXPECT_EQ(word2.length(), 5u);
733 EXPECT_TRUE(equals(word2, "world"));
734}
735
736} // namespace
#define TEST(test_suite_name, test_name)
int result[2]
kmp_str_ref is a non-owning string class (similar to llvm::StringRef).
Definition kmp_adt.h:31
static constexpr size_t npos
Definition kmp_adt.h:36
size_t length() const
Get the length of the string.
Definition kmp_adt.h:119
void const char const char int ITT_FORMAT __itt_group_sync s
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t count
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t length
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle * key
#define KMP_INTERNAL_FREE(p)
Definition kmp.h:117
sub
#define i
Definition kmp_stub.cpp:87