Benchmark.cpp 35 KB

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