Benchmark.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. /*
  2. * Copyright (c) 2020, Emanuel Sprung <emanuel.sprung@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h> // import first, to prevent warning of VERIFY* redefinition
  7. #include <LibRegex/Regex.h>
  8. #include <stdio.h>
  9. #ifndef REGEX_DEBUG
  10. # define BENCHMARK_LOOP_ITERATIONS 100000
  11. //# define REGEX_BENCHMARK_OUR
  12. # ifndef __serenity__
  13. //# define REGEX_BENCHMARK_OTHER
  14. # endif
  15. # if defined(REGEX_BENCHMARK_OTHER)
  16. # include <regex>
  17. # endif
  18. # if not(defined(REGEX_BENCHMARK_OUR) && defined(REGEX_BENCHMARK_OUR))
  19. BENCHMARK_CASE(dummy_benchmark)
  20. {
  21. }
  22. # endif
  23. # if defined(REGEX_BENCHMARK_OUR)
  24. BENCHMARK_CASE(catch_all_benchmark)
  25. {
  26. Regex<PosixExtended> re("^.*$");
  27. RegexResult m;
  28. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  29. EXPECT(re.match("Hello World", m));
  30. }
  31. }
  32. # endif
  33. # if defined(REGEX_BENCHMARK_OTHER)
  34. BENCHMARK_CASE(catch_all_benchmark_reference_stdcpp)
  35. {
  36. std::regex re("^.*$");
  37. std::cmatch m;
  38. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  39. EXPECT_EQ(std::regex_match("Hello World", m, re), true);
  40. }
  41. }
  42. # endif
  43. # if defined(REGEX_BENCHMARK_OUR)
  44. BENCHMARK_CASE(simple_start_benchmark)
  45. {
  46. Regex<PosixExtended> re("^hello friends");
  47. RegexResult m;
  48. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  49. EXPECT_EQ(re.match("Hello!", m), false);
  50. EXPECT_EQ(re.match("hello friends", m), true);
  51. EXPECT_EQ(re.match("Well, hello friends", m), false);
  52. }
  53. }
  54. # endif
  55. # if defined(REGEX_BENCHMARK_OTHER)
  56. BENCHMARK_CASE(simple_start_benchmark_reference_stdcpp)
  57. {
  58. std::regex re("^hello friends");
  59. std::cmatch m;
  60. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  61. EXPECT_EQ(std::regex_match("Hello", m, re), false);
  62. EXPECT_EQ(std::regex_match("hello friends", m, re), true);
  63. EXPECT_EQ(std::regex_match("Well, hello friends", m, re), false);
  64. }
  65. }
  66. # endif
  67. # if defined(REGEX_BENCHMARK_OUR)
  68. BENCHMARK_CASE(simple_end_benchmark)
  69. {
  70. Regex<PosixExtended> re(".*hello\\.\\.\\. there$");
  71. RegexResult m;
  72. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  73. EXPECT_EQ(re.match("Hallo", m), false);
  74. EXPECT_EQ(re.match("I said fyhello... there", m), true);
  75. EXPECT_EQ(re.match("ahello... therea", m), false);
  76. EXPECT_EQ(re.match("hello.. there", m), false);
  77. }
  78. }
  79. # endif
  80. # if defined(REGEX_BENCHMARK_OTHER)
  81. BENCHMARK_CASE(simple_end_benchmark_reference_stdcpp)
  82. {
  83. std::regex re(".*hello\\.\\.\\. there$");
  84. std::cmatch m;
  85. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  86. EXPECT_EQ(std::regex_search("Hallo", m, re), false);
  87. EXPECT_EQ(std::regex_search("I said fyhello... there", m, re), true);
  88. EXPECT_EQ(std::regex_search("ahello... therea", m, re), false);
  89. EXPECT_EQ(std::regex_search("hello.. there", m, re), false);
  90. }
  91. }
  92. # endif
  93. # if defined(REGEX_BENCHMARK_OUR)
  94. BENCHMARK_CASE(simple_period_benchmark)
  95. {
  96. Regex<PosixExtended> re("hello.");
  97. RegexResult m;
  98. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  99. EXPECT_EQ(re.match("Hello1", m), false);
  100. EXPECT_EQ(re.match("hello1", m), true);
  101. EXPECT_EQ(re.match("hello2", m), true);
  102. EXPECT_EQ(re.match("hello?", m), true);
  103. }
  104. }
  105. # endif
  106. # if defined(REGEX_BENCHMARK_OTHER)
  107. BENCHMARK_CASE(simple_period_benchmark_reference_stdcpp)
  108. {
  109. std::regex re("hello.");
  110. std::cmatch m;
  111. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  112. EXPECT_EQ(std::regex_match("Hello1", m, re), false);
  113. EXPECT_EQ(std::regex_match("hello1", m, re), true);
  114. EXPECT_EQ(std::regex_match("hello2", m, re), true);
  115. EXPECT_EQ(std::regex_match("hello?", m, re), true);
  116. }
  117. }
  118. # endif
  119. # if defined(REGEX_BENCHMARK_OUR)
  120. BENCHMARK_CASE(simple_period_end_benchmark)
  121. {
  122. Regex<PosixExtended> re("hello.$");
  123. RegexResult m;
  124. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  125. EXPECT_EQ(re.search("Hello1", m), false);
  126. EXPECT_EQ(re.search("hello1hello1", m), true);
  127. EXPECT_EQ(re.search("hello2hell", m), false);
  128. EXPECT_EQ(re.search("hello?", m), true);
  129. }
  130. }
  131. # endif
  132. # if defined(REGEX_BENCHMARK_OTHER)
  133. BENCHMARK_CASE(simple_period_end_benchmark_reference_stdcpp)
  134. {
  135. std::regex re("hello.$");
  136. std::cmatch m;
  137. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  138. EXPECT_EQ(std::regex_search("Hello1", m, re), false);
  139. EXPECT_EQ(std::regex_search("hello1hello1", m, re), true);
  140. EXPECT_EQ(std::regex_search("hello2hell", m, re), false);
  141. EXPECT_EQ(std::regex_search("hello?", m, re), true);
  142. }
  143. }
  144. # endif
  145. # if defined(REGEX_BENCHMARK_OUR)
  146. BENCHMARK_CASE(simple_escaped_benchmark)
  147. {
  148. Regex<PosixExtended> re("hello\\.");
  149. RegexResult m;
  150. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  151. EXPECT_EQ(re.match("hello", m), false);
  152. EXPECT_EQ(re.match("hello.", m), true);
  153. }
  154. }
  155. # endif
  156. # if defined(REGEX_BENCHMARK_OTHER)
  157. BENCHMARK_CASE(simple_escaped_benchmark_reference_stdcpp)
  158. {
  159. std::regex re("hello\\.");
  160. std::cmatch m;
  161. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  162. EXPECT_EQ(std::regex_match("hello", m, re), false);
  163. EXPECT_EQ(std::regex_match("hello.", m, re), true);
  164. }
  165. }
  166. # endif
  167. # if defined(REGEX_BENCHMARK_OUR)
  168. BENCHMARK_CASE(simple_period2_end_benchmark)
  169. {
  170. Regex<PosixExtended> re(".*hi... there$");
  171. RegexResult m;
  172. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  173. EXPECT_EQ(re.search("Hello there", m), false);
  174. EXPECT_EQ(re.search("I said fyhi... there", m), true);
  175. EXPECT_EQ(re.search("....hi... ", m), false);
  176. EXPECT_EQ(re.search("I said fyhihii there", m), true);
  177. EXPECT_EQ(re.search("I said fyhihi there", m), false);
  178. }
  179. }
  180. # endif
  181. # if defined(REGEX_BENCHMARK_OTHER)
  182. BENCHMARK_CASE(simple_period2_end_benchmark_reference_stdcpp)
  183. {
  184. std::regex re(".*hi... there$");
  185. std::cmatch m;
  186. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  187. EXPECT_EQ(std::regex_search("Hello there", m, re), false);
  188. EXPECT_EQ(std::regex_search("I said fyhi... there", m, re), true);
  189. EXPECT_EQ(std::regex_search("....hi... ", m, re), false);
  190. EXPECT_EQ(std::regex_search("I said fyhihii there", m, re), true);
  191. EXPECT_EQ(std::regex_search("I said fyhihi there", m, re), false);
  192. }
  193. }
  194. # endif
  195. # if defined(REGEX_BENCHMARK_OUR)
  196. BENCHMARK_CASE(simple_plus_benchmark)
  197. {
  198. Regex<PosixExtended> re("a+");
  199. RegexResult m;
  200. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  201. EXPECT_EQ(re.search("b", m), false);
  202. EXPECT_EQ(re.search("a", m), true);
  203. EXPECT_EQ(re.search("aaaaaabbbbb", m), true);
  204. EXPECT_EQ(re.search("aaaaaaaaaaa", m), true);
  205. }
  206. }
  207. # endif
  208. # if defined(REGEX_BENCHMARK_OTHER)
  209. BENCHMARK_CASE(simple_plus_benchmark_reference_stdcpp)
  210. {
  211. std::regex re("a+");
  212. std::cmatch m;
  213. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  214. EXPECT_EQ(std::regex_search("b", m, re), false);
  215. EXPECT_EQ(std::regex_search("a", m, re), true);
  216. EXPECT_EQ(std::regex_search("aaaaaabbbbb", m, re), true);
  217. EXPECT_EQ(std::regex_search("aaaaaaaaaaa", m, re), true);
  218. }
  219. }
  220. # endif
  221. # if defined(REGEX_BENCHMARK_OUR)
  222. BENCHMARK_CASE(simple_questionmark_benchmark)
  223. {
  224. Regex<PosixExtended> re("da?d");
  225. RegexResult m;
  226. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  227. EXPECT_EQ(re.search("a", m), false);
  228. EXPECT_EQ(re.search("daa", m), false);
  229. EXPECT_EQ(re.search("ddddd", m), true);
  230. EXPECT_EQ(re.search("dd", m), true);
  231. EXPECT_EQ(re.search("dad", m), true);
  232. EXPECT_EQ(re.search("dada", m), true);
  233. EXPECT_EQ(re.search("adadaa", m), true);
  234. }
  235. }
  236. # endif
  237. # if defined(REGEX_BENCHMARK_OTHER)
  238. BENCHMARK_CASE(simple_questionmark_benchmark_reference_stdcpp)
  239. {
  240. std::regex re("da?d");
  241. std::cmatch m;
  242. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  243. EXPECT_EQ(std::regex_search("a", m, re), false);
  244. EXPECT_EQ(std::regex_search("daa", m, re), false);
  245. EXPECT_EQ(std::regex_search("ddddd", m, re), true);
  246. EXPECT_EQ(std::regex_search("dd", m, re), true);
  247. EXPECT_EQ(std::regex_search("dad", m, re), true);
  248. EXPECT_EQ(std::regex_search("dada", m, re), true);
  249. EXPECT_EQ(std::regex_search("adadaa", m, re), true);
  250. }
  251. }
  252. # endif
  253. # if defined(REGEX_BENCHMARK_OUR)
  254. BENCHMARK_CASE(character_class_benchmark)
  255. {
  256. Regex<PosixExtended> re("[[:alpha:]]");
  257. RegexResult m;
  258. String haystack = "[Window]\nOpacity=255\nAudibleBeep=0\n";
  259. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  260. EXPECT_EQ(re.match(haystack.characters(), m), false);
  261. EXPECT_EQ(re.search(haystack.characters(), m), true);
  262. }
  263. }
  264. # endif
  265. # if defined(REGEX_BENCHMARK_OTHER)
  266. BENCHMARK_CASE(character_class_benchmark_reference_stdcpp)
  267. {
  268. std::regex re("[[:alpha:]]");
  269. std::cmatch m;
  270. String haystack = "[Window]\nOpacity=255\nAudibleBeep=0\n";
  271. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  272. EXPECT_EQ(std::regex_match(haystack.characters(), m, re), false);
  273. EXPECT_EQ(std::regex_search(haystack.characters(), m, re), true);
  274. }
  275. }
  276. # endif
  277. # if defined(REGEX_BENCHMARK_OUR)
  278. BENCHMARK_CASE(escaped_char_questionmark_benchmark)
  279. {
  280. Regex<PosixExtended> re("This\\.?And\\.?That");
  281. RegexResult m;
  282. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  283. EXPECT_EQ(re.match("ThisAndThat", m), true);
  284. EXPECT_EQ(re.match("This.And.That", m), true);
  285. EXPECT_EQ(re.match("This And That", m), false);
  286. EXPECT_EQ(re.match("This..And..That", m), false);
  287. }
  288. }
  289. # endif
  290. # if defined(REGEX_BENCHMARK_OTHER)
  291. BENCHMARK_CASE(escaped_char_questionmark_benchmark_reference_stdcpp)
  292. {
  293. std::regex re("This\\.?And\\.?That");
  294. std::cmatch m;
  295. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  296. EXPECT_EQ(std::regex_match("ThisAndThat", m, re), true);
  297. EXPECT_EQ(std::regex_match("This.And.That", m, re), true);
  298. EXPECT_EQ(std::regex_match("This And That", m, re), false);
  299. EXPECT_EQ(std::regex_match("This..And..That", m, re), false);
  300. }
  301. }
  302. # endif
  303. # if defined(REGEX_BENCHMARK_OUR)
  304. BENCHMARK_CASE(char_qualifier_asterisk_benchmark)
  305. {
  306. Regex<PosixExtended> re("regex*");
  307. RegexResult m;
  308. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  309. EXPECT_EQ(re.search("#include <regex.h>", m), true);
  310. EXPECT_EQ(re.search("#include <stdio.h>", m), false);
  311. }
  312. }
  313. # endif
  314. # if defined(REGEX_BENCHMARK_OTHER)
  315. BENCHMARK_CASE(char_qualifier_asterisk_benchmark_reference_stdcpp)
  316. {
  317. std::regex re("regex*");
  318. std::cmatch m;
  319. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  320. EXPECT_EQ(std::regex_search("#include <regex.h>", m, re), true);
  321. EXPECT_EQ(std::regex_search("#include <stdio.h>", m, re), false);
  322. }
  323. }
  324. # endif
  325. # if defined(REGEX_BENCHMARK_OUR)
  326. BENCHMARK_CASE(parens_qualifier_questionmark_benchmark)
  327. {
  328. Regex<PosixExtended> re("test(hello)?test");
  329. RegexResult m;
  330. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  331. EXPECT_EQ(re.match("testtest", m), true);
  332. EXPECT_EQ(re.match("testhellotest", m), true);
  333. EXPECT_EQ(re.match("testasfdtest", m), false);
  334. }
  335. }
  336. # endif
  337. # if defined(REGEX_BENCHMARK_OTHER)
  338. BENCHMARK_CASE(parens_qualifier_questionmark_benchmark_reference_stdcpp)
  339. {
  340. std::regex re("test(hello)?test");
  341. std::cmatch m;
  342. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  343. EXPECT_EQ(std::regex_match("testtest", m, re), true);
  344. EXPECT_EQ(std::regex_match("testhellotest", m, re), true);
  345. EXPECT_EQ(std::regex_match("testasfdtest", m, re), false);
  346. }
  347. }
  348. # endif
  349. # if defined(REGEX_BENCHMARK_OUR)
  350. BENCHMARK_CASE(parens_qualifier_asterisk_benchmark)
  351. {
  352. Regex<PosixExtended> re("test(hello)*test");
  353. RegexResult m;
  354. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  355. EXPECT_EQ(re.match("testtest", m), true);
  356. EXPECT_EQ(re.match("testhellohellotest", m), true);
  357. EXPECT_EQ(re.search("testhellohellotest, testhellotest", m), true);
  358. EXPECT_EQ(re.match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m), false);
  359. }
  360. }
  361. # endif
  362. # if defined(REGEX_BENCHMARK_OTHER)
  363. BENCHMARK_CASE(parens_qualifier_asterisk_benchmark_reference_stdcpp)
  364. {
  365. std::regex re("test(hello)*test");
  366. std::cmatch m;
  367. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  368. EXPECT_EQ(std::regex_match("testtest", m, re), true);
  369. EXPECT_EQ(std::regex_match("testhellohellotest", m, re), true);
  370. EXPECT_EQ(std::regex_search("testhellohellotest, testhellotest", m, re), true);
  371. EXPECT_EQ(std::regex_match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m, re), false);
  372. }
  373. }
  374. # endif
  375. # if defined(REGEX_BENCHMARK_OUR)
  376. BENCHMARK_CASE(parens_qualifier_asterisk_2_benchmark)
  377. {
  378. Regex<PosixExtended> re("test(.*)test");
  379. RegexResult m;
  380. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  381. EXPECT_EQ(re.match("testasdftest", m), true);
  382. EXPECT_EQ(re.match("testasdfasdftest", m), true);
  383. EXPECT_EQ(re.search("testaaaatest, testbbbtest, testtest", m), true);
  384. EXPECT_EQ(re.match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m), false);
  385. }
  386. }
  387. # endif
  388. # if defined(REGEX_BENCHMARK_OTHER)
  389. BENCHMARK_CASE(parens_qualifier_asterisk_2_benchmark_reference_stdcpp)
  390. {
  391. std::regex re("test(.*)test");
  392. std::cmatch m;
  393. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  394. EXPECT_EQ(std::regex_match("testasdftest", m, re), true);
  395. EXPECT_EQ(std::regex_match("testasdfasdftest", m, re), true);
  396. EXPECT_EQ(std::regex_search("testaaaatest, testbbbtest, testtest", m, re), true);
  397. EXPECT_EQ(std::regex_match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m, re), false);
  398. }
  399. }
  400. # endif
  401. # if defined(REGEX_BENCHMARK_OUR)
  402. BENCHMARK_CASE(multi_parens_qualifier_questionmark_benchmark)
  403. {
  404. Regex<PosixExtended> re("test(a)?(b)?(c)?test");
  405. RegexResult m;
  406. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  407. EXPECT_EQ(re.match("testtest", m), true);
  408. EXPECT_EQ(re.match("testabctest", m), true);
  409. EXPECT_EQ(re.search("testabctest, testactest", m), true);
  410. EXPECT_EQ(re.match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m), false);
  411. EXPECT_EQ(re.match("test", m), false);
  412. EXPECT_EQ(re.match("whaaaaat", m), false);
  413. }
  414. }
  415. # endif
  416. # if defined(REGEX_BENCHMARK_OTHER)
  417. BENCHMARK_CASE(multi_parens_qualifier_questionmark_benchmark_reference_stdcpp)
  418. {
  419. std::regex re("test(a)?(b)?(c)?test");
  420. std::cmatch m;
  421. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  422. EXPECT_EQ(std::regex_match("testtest", m, re), true);
  423. EXPECT_EQ(std::regex_match("testabctest", m, re), true);
  424. EXPECT_EQ(std::regex_search("testabctest, testactest", m, re), true);
  425. EXPECT_EQ(std::regex_match("aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb", m, re), false);
  426. EXPECT_EQ(std::regex_match("test", m, re), false);
  427. EXPECT_EQ(std::regex_match("whaaaaat", m, re), false);
  428. }
  429. }
  430. # endif
  431. # if defined(REGEX_BENCHMARK_OUR)
  432. BENCHMARK_CASE(simple_alternative_benchmark)
  433. {
  434. Regex<PosixExtended> re("test|hello|friends");
  435. RegexResult m;
  436. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  437. EXPECT_EQ(re.match("test", m), true);
  438. EXPECT_EQ(re.match("hello", m), true);
  439. EXPECT_EQ(re.match("friends", m), true);
  440. EXPECT_EQ(re.match("whaaaaat", m), false);
  441. }
  442. }
  443. # endif
  444. # if defined(REGEX_BENCHMARK_OTHER)
  445. BENCHMARK_CASE(simple_alternative_benchmark_reference_stdcpp)
  446. {
  447. std::regex re("test|hello|friends");
  448. std::cmatch m;
  449. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  450. EXPECT_EQ(std::regex_match("test", m, re), true);
  451. EXPECT_EQ(std::regex_match("hello", m, re), true);
  452. EXPECT_EQ(std::regex_match("friends", m, re), true);
  453. EXPECT_EQ(std::regex_match("whaaaaat", m, re), false);
  454. }
  455. }
  456. # endif
  457. # if defined(REGEX_BENCHMARK_OUR)
  458. BENCHMARK_CASE(alternative_match_groups_benchmark)
  459. {
  460. Regex<PosixExtended> re("test(a)?(b)?|hello ?(dear|my)? friends");
  461. RegexResult m;
  462. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  463. EXPECT_EQ(re.match("test", m), true);
  464. EXPECT_EQ(re.match("testa", m), true);
  465. EXPECT_EQ(re.match("testb", m), true);
  466. EXPECT_EQ(re.match("hello friends", m), true);
  467. EXPECT_EQ(re.match("hello dear friends", m), true);
  468. EXPECT_EQ(re.match("hello my friends", m), true);
  469. EXPECT_EQ(re.match("testabc", m), false);
  470. EXPECT_EQ(re.match("hello test friends", m), false);
  471. }
  472. }
  473. # endif
  474. # if defined(REGEX_BENCHMARK_OTHER)
  475. BENCHMARK_CASE(alternative_match_groups_benchmark_reference_stdcpp)
  476. {
  477. std::regex re("test(a)?(b)?|hello ?(dear|my)? friends");
  478. std::cmatch m;
  479. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  480. EXPECT_EQ(std::regex_match("test", m, re), true);
  481. EXPECT_EQ(std::regex_match("testa", m, re), true);
  482. EXPECT_EQ(std::regex_match("testb", m, re), true);
  483. EXPECT_EQ(std::regex_match("hello friends", m, re), true);
  484. EXPECT_EQ(std::regex_match("hello dear friends", m, re), true);
  485. EXPECT_EQ(std::regex_match("hello my friends", m, re), true);
  486. EXPECT_EQ(std::regex_match("testabc", m, re), false);
  487. EXPECT_EQ(std::regex_match("hello test friends", m, re), false);
  488. }
  489. }
  490. # endif
  491. # if defined(REGEX_BENCHMARK_OUR)
  492. BENCHMARK_CASE(parens_qualifier_exact_benchmark)
  493. {
  494. Regex<PosixExtended> re("(hello){3}");
  495. RegexResult m;
  496. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  497. EXPECT_EQ(re.match("hello", m), false);
  498. EXPECT_EQ(re.match("hellohellohello", m), true);
  499. EXPECT_EQ(re.search("hellohellohellohello", m), true);
  500. EXPECT_EQ(re.search("test hellohellohello", m), true);
  501. }
  502. }
  503. # endif
  504. # if defined(REGEX_BENCHMARK_OTHER)
  505. BENCHMARK_CASE(parens_qualifier_exact_benchmark_reference_stdcpp)
  506. {
  507. std::regex re("(hello){3}");
  508. std::cmatch m;
  509. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  510. EXPECT_EQ(std::regex_match("hello", m, re), false);
  511. EXPECT_EQ(std::regex_match("hellohellohello", m, re), true);
  512. EXPECT_EQ(std::regex_search("hellohellohellohello", m, re), true);
  513. EXPECT_EQ(std::regex_search("test hellohellohello", m, re), true);
  514. }
  515. }
  516. # endif
  517. # if defined(REGEX_BENCHMARK_OUR)
  518. BENCHMARK_CASE(parens_qualifier_minimum_benchmark)
  519. {
  520. Regex<PosixExtended> re("(hello){3,}");
  521. RegexResult m;
  522. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  523. EXPECT_EQ(re.match("hello", m), false);
  524. EXPECT_EQ(re.match("hellohellohello", m), true);
  525. EXPECT_EQ(re.search("hellohellohellohello", m), true);
  526. EXPECT_EQ(re.search("test hellohellohello", m), true);
  527. EXPECT_EQ(re.search("test hellohellohellohello", m), true);
  528. }
  529. }
  530. # endif
  531. # if defined(REGEX_BENCHMARK_OTHER)
  532. BENCHMARK_CASE(parens_qualifier_minimum_benchmark_reference_stdcpp)
  533. {
  534. std::regex re("(hello){3,}");
  535. std::cmatch m;
  536. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  537. EXPECT_EQ(std::regex_match("hello", m, re), false);
  538. EXPECT_EQ(std::regex_match("hellohellohello", m, re), true);
  539. EXPECT_EQ(std::regex_search("hellohellohellohello", m, re), true);
  540. EXPECT_EQ(std::regex_search("test hellohellohello", m, re), true);
  541. EXPECT_EQ(std::regex_search("test hellohellohellohello", m, re), true);
  542. }
  543. }
  544. # endif
  545. # if defined(REGEX_BENCHMARK_OUR)
  546. BENCHMARK_CASE(parens_qualifier_maximum_benchmark)
  547. {
  548. Regex<PosixExtended> re("(hello){2,3}");
  549. RegexResult m;
  550. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  551. EXPECT_EQ(re.match("hello", m), false);
  552. EXPECT_EQ(re.match("hellohellohello", m), true);
  553. EXPECT_EQ(re.search("hellohellohellohello", m), true);
  554. EXPECT_EQ(re.search("test hellohellohello", m), true);
  555. EXPECT_EQ(re.search("test hellohellohellohello", m), true);
  556. EXPECT_EQ(re.match("test hellohellohellohello", m), false);
  557. EXPECT_EQ(re.search("test hellohellohellohello", m), true);
  558. }
  559. }
  560. # endif
  561. # if defined(REGEX_BENCHMARK_OTHER)
  562. BENCHMARK_CASE(parens_qualifier_maximum_benchmark_reference_stdcpp)
  563. {
  564. std::regex re("(hello){2,3}");
  565. std::cmatch m;
  566. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  567. EXPECT_EQ(std::regex_match("hello", m, re), false);
  568. EXPECT_EQ(std::regex_match("hellohellohello", m, re), true);
  569. EXPECT_EQ(std::regex_search("hellohellohellohello", m, re), true);
  570. EXPECT_EQ(std::regex_search("test hellohellohello", m, re), true);
  571. EXPECT_EQ(std::regex_search("test hellohellohellohello", m, re), true);
  572. EXPECT_EQ(std::regex_match("test hellohellohellohello", m, re), false);
  573. EXPECT_EQ(std::regex_search("test hellohellohellohello", m, re), true);
  574. }
  575. }
  576. # endif
  577. # if defined(REGEX_BENCHMARK_OUR)
  578. BENCHMARK_CASE(char_qualifier_min_max_benchmark)
  579. {
  580. Regex<PosixExtended> re("c{3,30}");
  581. RegexResult m;
  582. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  583. EXPECT_EQ(re.match("cc", m), false);
  584. EXPECT_EQ(re.match("ccc", m), true);
  585. EXPECT_EQ(re.match("cccccccccccccccccccccccccccccc", m), true);
  586. EXPECT_EQ(re.match("ccccccccccccccccccccccccccccccc", m), false);
  587. EXPECT_EQ(re.search("ccccccccccccccccccccccccccccccc", m), true);
  588. EXPECT_EQ(re.match("cccccccccccccccccccccccccccccccc", m), false);
  589. }
  590. }
  591. # endif
  592. # if defined(REGEX_BENCHMARK_OTHER)
  593. BENCHMARK_CASE(char_qualifier_min_max_benchmark_reference_stdcpp)
  594. {
  595. std::regex re("c{3,30}");
  596. std::cmatch m;
  597. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  598. EXPECT_EQ(std::regex_match("cc", m, re), false);
  599. EXPECT_EQ(std::regex_match("ccc", m, re), true);
  600. EXPECT_EQ(std::regex_match("cccccccccccccccccccccccccccccc", m, re), true);
  601. EXPECT_EQ(std::regex_match("ccccccccccccccccccccccccccccccc", m, re), false);
  602. EXPECT_EQ(std::regex_search("ccccccccccccccccccccccccccccccc", m, re), true);
  603. EXPECT_EQ(std::regex_match("cccccccccccccccccccccccccccccccc", m, re), false);
  604. }
  605. }
  606. # endif
  607. # if defined(REGEX_BENCHMARK_OUR)
  608. BENCHMARK_CASE(simple_bracket_chars_benchmark)
  609. {
  610. Regex<PosixExtended> re("[abc]");
  611. RegexResult m;
  612. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  613. EXPECT_EQ(re.match("a", m), true);
  614. EXPECT_EQ(re.match("b", m), true);
  615. EXPECT_EQ(re.match("c", m), true);
  616. EXPECT_EQ(re.match("d", m), false);
  617. EXPECT_EQ(re.match("e", m), false);
  618. }
  619. }
  620. # endif
  621. # if defined(REGEX_BENCHMARK_OTHER)
  622. BENCHMARK_CASE(simple_bracket_chars_benchmark_reference_stdcpp)
  623. {
  624. std::regex re("[abc]");
  625. std::cmatch m;
  626. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  627. EXPECT_EQ(std::regex_match("a", m, re), true);
  628. EXPECT_EQ(std::regex_match("b", m, re), true);
  629. EXPECT_EQ(std::regex_match("c", m, re), true);
  630. EXPECT_EQ(std::regex_match("d", m, re), false);
  631. EXPECT_EQ(std::regex_match("e", m, re), false);
  632. }
  633. }
  634. # endif
  635. # if defined(REGEX_BENCHMARK_OUR)
  636. BENCHMARK_CASE(simple_bracket_chars_inverse_benchmark)
  637. {
  638. Regex<PosixExtended> re("[^abc]");
  639. RegexResult m;
  640. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  641. EXPECT_EQ(re.match("a", m), false);
  642. EXPECT_EQ(re.match("b", m), false);
  643. EXPECT_EQ(re.match("c", m), false);
  644. EXPECT_EQ(re.match("d", m), true);
  645. EXPECT_EQ(re.match("e", m), true);
  646. }
  647. }
  648. # endif
  649. # if defined(REGEX_BENCHMARK_OTHER)
  650. BENCHMARK_CASE(simple_bracket_chars_inverse_benchmark_reference_stdcpp)
  651. {
  652. std::regex re("[^abc]");
  653. std::cmatch m;
  654. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  655. EXPECT_EQ(std::regex_match("a", m, re), false);
  656. EXPECT_EQ(std::regex_match("b", m, re), false);
  657. EXPECT_EQ(std::regex_match("c", m, re), false);
  658. EXPECT_EQ(std::regex_match("d", m, re), true);
  659. EXPECT_EQ(std::regex_match("e", m, re), true);
  660. }
  661. }
  662. # endif
  663. # if defined(REGEX_BENCHMARK_OUR)
  664. BENCHMARK_CASE(simple_bracket_chars_range_benchmark)
  665. {
  666. Regex<PosixExtended> re("[a-d]");
  667. RegexResult m;
  668. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  669. EXPECT_EQ(re.match("a", m), true);
  670. EXPECT_EQ(re.match("b", m), true);
  671. EXPECT_EQ(re.match("c", m), true);
  672. EXPECT_EQ(re.match("d", m), true);
  673. EXPECT_EQ(re.match("e", m), false);
  674. }
  675. }
  676. # endif
  677. # if defined(REGEX_BENCHMARK_OTHER)
  678. BENCHMARK_CASE(simple_bracket_chars_range_benchmark_reference_stdcpp)
  679. {
  680. std::regex re("[a-d]");
  681. std::cmatch m;
  682. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  683. EXPECT_EQ(std::regex_match("a", m, re), true);
  684. EXPECT_EQ(std::regex_match("b", m, re), true);
  685. EXPECT_EQ(std::regex_match("c", m, re), true);
  686. EXPECT_EQ(std::regex_match("d", m, re), true);
  687. EXPECT_EQ(std::regex_match("e", m, re), false);
  688. }
  689. }
  690. # endif
  691. # if defined(REGEX_BENCHMARK_OUR)
  692. BENCHMARK_CASE(simple_bracket_chars_range_inverse_benchmark)
  693. {
  694. Regex<PosixExtended> re("[^a-df-z]");
  695. RegexResult m;
  696. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  697. EXPECT_EQ(re.match("a", m), false);
  698. EXPECT_EQ(re.match("b", m), false);
  699. EXPECT_EQ(re.match("c", m), false);
  700. EXPECT_EQ(re.match("d", m), false);
  701. EXPECT_EQ(re.match("e", m), true);
  702. EXPECT_EQ(re.match("k", m), false);
  703. EXPECT_EQ(re.match("z", m), false);
  704. }
  705. }
  706. # endif
  707. # if defined(REGEX_BENCHMARK_OTHER)
  708. BENCHMARK_CASE(simple_bracket_chars_range_inverse_benchmark_reference_stdcpp)
  709. {
  710. std::regex re("[^a-df-z]");
  711. std::cmatch m;
  712. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  713. EXPECT_EQ(std::regex_match("a", m, re), false);
  714. EXPECT_EQ(std::regex_match("b", m, re), false);
  715. EXPECT_EQ(std::regex_match("c", m, re), false);
  716. EXPECT_EQ(std::regex_match("d", m, re), false);
  717. EXPECT_EQ(std::regex_match("e", m, re), true);
  718. EXPECT_EQ(std::regex_match("k", m, re), false);
  719. EXPECT_EQ(std::regex_match("z", m, re), false);
  720. }
  721. }
  722. # endif
  723. # if defined(REGEX_BENCHMARK_OUR)
  724. BENCHMARK_CASE(bracket_character_class_uuid_benchmark)
  725. {
  726. Regex<PosixExtended> re("^([[:xdigit:]]{8})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{12})$");
  727. RegexResult m;
  728. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  729. EXPECT_EQ(re.match("fb9b62a2-1579-4e3a-afba-76239ccb6583", m), true);
  730. EXPECT_EQ(re.match("fb9b62a2", m), false);
  731. }
  732. }
  733. # endif
  734. # if defined(REGEX_BENCHMARK_OTHER)
  735. BENCHMARK_CASE(bracket_character_class_uuid_benchmark_reference_stdcpp)
  736. {
  737. std::regex re("^([[:xdigit:]]{8})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{4})-([[:xdigit:]]{12})$");
  738. std::cmatch m;
  739. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  740. EXPECT_EQ(std::regex_match("fb9b62a2-1579-4e3a-afba-76239ccb6583", m, re), true);
  741. EXPECT_EQ(std::regex_match("fb9b62a2", m, re), false);
  742. }
  743. }
  744. # endif
  745. # if defined(REGEX_BENCHMARK_OUR)
  746. BENCHMARK_CASE(simple_bracket_character_class_inverse_benchmark)
  747. {
  748. Regex<PosixExtended> re("[^[:digit:]]");
  749. RegexResult m;
  750. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  751. EXPECT_EQ(re.match("1", m), false);
  752. EXPECT_EQ(re.match("2", m), false);
  753. EXPECT_EQ(re.match("3", m), false);
  754. EXPECT_EQ(re.match("d", m), true);
  755. EXPECT_EQ(re.match("e", m), true);
  756. }
  757. }
  758. # endif
  759. # if defined(REGEX_BENCHMARK_OTHER)
  760. BENCHMARK_CASE(simple_bracket_character_class_inverse_benchmark_reference_stdcpp)
  761. {
  762. std::regex re("[^[:digit:]]");
  763. std::cmatch m;
  764. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  765. EXPECT_EQ(std::regex_match("1", m, re), false);
  766. EXPECT_EQ(std::regex_match("2", m, re), false);
  767. EXPECT_EQ(std::regex_match("3", m, re), false);
  768. EXPECT_EQ(std::regex_match("d", m, re), true);
  769. EXPECT_EQ(std::regex_match("e", m, re), true);
  770. }
  771. }
  772. # endif
  773. # if defined(REGEX_BENCHMARK_OUR)
  774. BENCHMARK_CASE(email_address_benchmark)
  775. {
  776. Regex<PosixExtended> re("^[A-Z0-9a-z._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\\.){1,125}[A-Za-z]{2,63}$");
  777. RegexResult m;
  778. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  779. EXPECT_EQ(re.match("hello.world@domain.tld", m), true);
  780. EXPECT_EQ(re.match("this.is.a.very_long_email_address@world.wide.web", m), true);
  781. }
  782. }
  783. # endif
  784. # if defined(REGEX_BENCHMARK_OTHER)
  785. BENCHMARK_CASE(email_address_benchmark_reference_stdcpp)
  786. {
  787. std::regex re("^[A-Z0-9a-z._%+-]{1,64}@(?:[A-Za-z0-9-]{1,63}\\.){1,125}[A-Za-z]{2,63}$");
  788. std::cmatch m;
  789. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  790. EXPECT_EQ(std::regex_match("hello.world@domain.tld", m, re), true);
  791. EXPECT_EQ(std::regex_match("this.is.a.very_long_email_address@world.wide.web", m, re), true);
  792. }
  793. }
  794. # endif
  795. # if defined(REGEX_BENCHMARK_OUR)
  796. BENCHMARK_CASE(simple_ignorecase_benchmark)
  797. {
  798. Regex<PosixExtended> re("^hello friends", PosixFlags::Insensitive);
  799. RegexResult m;
  800. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  801. EXPECT_EQ(re.match("Hello Friends", m), true);
  802. EXPECT_EQ(re.match("hello Friends", m), true);
  803. EXPECT_EQ(re.match("hello Friends!", m), false);
  804. EXPECT_EQ(re.search("hello Friends", m), true);
  805. EXPECT_EQ(re.match("hell Friends", m), false);
  806. EXPECT_EQ(re.search("hell Friends", m), false);
  807. }
  808. }
  809. # endif
  810. # if defined(REGEX_BENCHMARK_OTHER)
  811. BENCHMARK_CASE(simple_ignorecase_benchmark_reference_stdcpp)
  812. {
  813. std::regex re("^hello friends", std::regex_constants::icase);
  814. std::cmatch m;
  815. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  816. EXPECT_EQ(std::regex_match("Hello Friends", m, re), true);
  817. EXPECT_EQ(std::regex_match("hello Friends", m, re), true);
  818. EXPECT_EQ(std::regex_match("hello Friends!", m, re), false);
  819. EXPECT_EQ(std::regex_search("hello Friends", m, re), true);
  820. EXPECT_EQ(std::regex_match("hell Friends", m, re), false);
  821. EXPECT_EQ(std::regex_search("hell Friends", m, re), false);
  822. }
  823. }
  824. # endif
  825. # if defined(REGEX_BENCHMARK_OUR)
  826. BENCHMARK_CASE(simple_notbol_noteol_benchmark)
  827. {
  828. String pattern = "^hello friends$";
  829. String pattern2 = "hello friends";
  830. regex_t regex, regex2;
  831. EXPECT_EQ(regcomp(&regex, pattern.characters(), REG_EXTENDED | REG_NOSUB | REG_ICASE), REG_NOERR);
  832. EXPECT_EQ(regcomp(&regex2, pattern2.characters(), REG_EXTENDED | REG_NOSUB | REG_ICASE), REG_NOERR);
  833. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  834. EXPECT_EQ(regexec(&regex, "hello friends", 0, NULL, REG_NOTBOL), REG_NOMATCH);
  835. EXPECT_EQ(regexec(&regex, "hello friends", 0, NULL, REG_NOTEOL), REG_NOMATCH);
  836. EXPECT_EQ(regexec(&regex, "hello friends", 0, NULL, REG_NOTBOL | REG_NOTEOL), REG_NOMATCH);
  837. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTBOL), REG_NOMATCH);
  838. EXPECT_EQ(regexec(&regex, "a hello friends", 0, NULL, REG_NOTBOL), REG_NOMATCH);
  839. EXPECT_EQ(regexec(&regex, "a hello friends", 0, NULL, REG_NOTBOL | REG_SEARCH), REG_NOERR);
  840. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTBOL | REG_SEARCH), REG_NOERR);
  841. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTEOL), REG_NOMATCH);
  842. EXPECT_EQ(regexec(&regex, "hello friends b", 0, NULL, REG_NOTEOL), REG_NOMATCH);
  843. EXPECT_EQ(regexec(&regex, "hello friends b", 0, NULL, REG_NOTEOL | REG_SEARCH), REG_NOERR);
  844. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTEOL | REG_SEARCH), REG_NOMATCH);
  845. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTBOL | REG_NOTEOL), REG_NOMATCH);
  846. EXPECT_EQ(regexec(&regex, "a hello friends b", 0, NULL, REG_NOTBOL | REG_NOTEOL | REG_SEARCH), REG_NOMATCH);
  847. EXPECT_EQ(regexec(&regex2, "hello friends", 0, NULL, REG_NOTBOL), REG_NOMATCH);
  848. EXPECT_EQ(regexec(&regex2, "hello friends", 0, NULL, REG_NOTEOL), REG_NOMATCH);
  849. }
  850. regfree(&regex);
  851. }
  852. # endif
  853. # if defined(REGEX_BENCHMARK_OTHER)
  854. BENCHMARK_CASE(simple_notbol_noteol_benchmark_reference_stdcpp)
  855. {
  856. std::regex re1("^hello friends$", std::regex_constants::match_not_bol);
  857. std::regex re2("^hello friends$", std::regex_constants::match_not_eol);
  858. std::regex re3("^hello friends$", std::regex_constants::match_not_bol | std::regex_constants::match_not_eol);
  859. std::regex re4("hello friends", std::regex_constants::match_not_bol);
  860. std::regex re5("hello friends", std::regex_constants::match_not_eol);
  861. std::cmatch m;
  862. for (size_t i = 0; i < BENCHMARK_LOOP_ITERATIONS; ++i) {
  863. EXPECT_EQ(std::regex_match("hello friends", m, re1), false);
  864. EXPECT_EQ(std::regex_match("hello friends", m, re2), false);
  865. EXPECT_EQ(std::regex_match("hello friends", m, re3), false);
  866. EXPECT_EQ(std::regex_match("a hello friends b", m, re1), false);
  867. EXPECT_EQ(std::regex_match("a hello friends", m, re1), false);
  868. EXPECT_EQ(std::regex_search("a hello friends", m, re1), true);
  869. EXPECT_EQ(std::regex_search("a hello friends b", m, re1), true);
  870. EXPECT_EQ(std::regex_match("a hello friends b", m, re2), false);
  871. EXPECT_EQ(std::regex_match("hello friends b", m, re2), false);
  872. EXPECT_EQ(std::regex_search("hello friends b", m, re2), true);
  873. EXPECT_EQ(std::regex_search("a hello friends b", m, re2), false);
  874. EXPECT_EQ(std::regex_match("a hello friends b", m, re3), false);
  875. EXPECT_EQ(std::regex_search("a hello friends b", m, re3), false);
  876. EXPECT_EQ(std::regex_match("hello friends", m, re4), false);
  877. EXPECT_EQ(std::regex_match("hello friends", m, re5), false);
  878. }
  879. }
  880. # endif
  881. #endif