From 409d7c2994d3f288c495c5944ccd0e562c3cdb1c Mon Sep 17 00:00:00 2001 From: mguludag Date: Tue, 19 Nov 2024 22:01:11 +0000 Subject: [PATCH] deploy: 965a89f30e682ce5551ecada2adc7e590e2d98d2 --- git-main/annotated.html | 156 +- ...assert__returns__disabled_8cpp_source.html | 134 + git-main/classMoveOnly-members.html | 105 + git-main/classMoveOnly.html | 123 + ...1AssertData_1_1StringContains-members.html | 112 + ...ctest_1_1AssertData_1_1StringContains.html | 140 + .../classdoctest_1_1Contains-members.html | 107 + git-main/classdoctest_1_1Contains.html | 130 + git-main/classdoctest_1_1Context-members.html | 136 + git-main/classdoctest_1_1Context.html | 207 + git-main/classdoctest_1_1String-members.html | 153 + git-main/classdoctest_1_1String.html | 258 + ...est_1_1detail_1_1ContextScope-members.html | 131 + ...lassdoctest_1_1detail_1_1ContextScope.html | 262 + ...classdoctest_1_1detail_1_1ContextScope.png | Bin 0 -> 2092 bytes ...ctest_1_1detail_1_1ErrnoGuard-members.html | 104 + .../classdoctest_1_1detail_1_1ErrnoGuard.html | 104 + ...detail_1_1ExceptionTranslator-members.html | 106 + ...test_1_1detail_1_1ExceptionTranslator.html | 197 + ...ctest_1_1detail_1_1ExceptionTranslator.png | Bin 0 -> 1117 bytes ..._1_1detail_1_1MultiLaneAtomic-members.html | 110 + ...sdoctest_1_1detail_1_1MultiLaneAtomic.html | 133 + git-main/classes.html | 50 +- ...classmgutility_1_1basic__string__view.html | 192 +- .../classmgutility_1_1enum__for__each.html | 22 +- git-main/classmgutility_1_1optional.html | 154 +- git-main/classstd_1_1basic__istream.html | 102 + git-main/classstd_1_1basic__ostream.html | 104 + git-main/classstd_1_1tuple.html | 102 + .../dir_12250f07495b82a5468dcd73f04130d2.html | 111 + .../dir_19d6e67e2a8c9c02f99b05222b5702e0.html | 99 + .../dir_211db8a2c69420f4ce572fd277c5fa9d.html | 109 + .../dir_2da0d08c090dfc162bcb1050ad85461d.html | 105 + .../dir_3aed5d9a354d80b98b13c56957e9e40d.html | 109 + .../dir_42566503585505dc2e60fa3dcde9fb9b.html | 107 + .../dir_43253e74d6ea82bdbabf005ef1d7a846.html | 99 + .../dir_5b519a8d1f6ad2560e623a56ba70dd2c.html | 113 + .../dir_5ce394648a2ce49effa43d7c8c1d0ab7.html | 105 + .../dir_7eb8d58cad924ffc9253fe5769504e6c.html | 99 + .../dir_8b925520cb613cf2392a9f8548a542a4.html | 99 + .../dir_9a2b83ecc9199c13815ef5c7cb1df230.html | 99 + .../dir_9b84b44367723a1d0d88a431bcd23f48.html | 107 + .../dir_a4fd227c5a8e0bc1498d3ae6ee4886a0.html | 107 + .../dir_a57a94e38c03835eed49274b75b0176d.html | 99 + .../dir_a64aea07de2f8e4b0652b4f49e88934d.html | 112 + .../dir_c528b7bc4a3fa6117001302291996482.html | 99 + .../dir_cf0ad092fd70688f67b23e9319dfdbf7.html | 109 + .../dir_d7feab101fc42698e063f6e64b4257c6.html | 99 + .../dir_dc93519aa0008696ff29cd2f84adb2a1.html | 99 + .../dir_f2245241ea565ce482a8cba7c024245b.html | 99 + .../dir_f40c3ec3501908b5834e804abc5d7b28.html | 105 + git-main/dll_8h_source.html | 111 + git-main/doctest_2doctest_8h_source.html | 7346 +++++++++++++++++ git-main/doctest_8cpp_source.html | 4148 ++++++++++ git-main/doctest__fwd_8h_source.html | 3201 +++++++ git-main/doctest__mpi_8h_source.html | 273 + git-main/doctest__proxy_8h_source.html | 175 + git-main/doctest__util_8h_source.html | 142 + git-main/doxygen_crawl.html | 246 + git-main/enum__for__each_8hpp_source.html | 9 +- git-main/enum__name_8hpp_source.html | 35 +- git-main/enum__name__impl_8hpp_source.html | 414 +- git-main/exporting_8h_source.html | 119 + git-main/files.html | 56 +- git-main/foo_8h_source.html | 145 + git-main/functions.html | 14 +- git-main/functions_func.html | 14 +- git-main/header_8h_source.html | 176 + git-main/hierarchy.html | 166 +- ...2work_2enum__name_2enum__name_2README.html | 21 +- ...build_2__deps_2doctest-src_2CHANGELOG.html | 995 +++ ...ld_2__deps_2doctest-src_2CONTRIBUTING.html | 111 + ...e_2build_2__deps_2doctest-src_2README.html | 178 + ...octest-src_2doc_2markdown_2assertions.html | 232 + ...octest-src_2doc_2markdown_2benchmarks.html | 315 + ...est-src_2doc_2markdown_2build-systems.html | 169 + ...ctest-src_2doc_2markdown_2commandline.html | 253 + ...est-src_2doc_2markdown_2configuration.html | 321 + ...octest-src_2doc_2markdown_2extensions.html | 231 + ...deps_2doctest-src_2doc_2markdown_2faq.html | 236 + ...2doctest-src_2doc_2markdown_2features.html | 180 + ..._2doctest-src_2doc_2markdown_2logging.html | 144 + ...eps_2doctest-src_2doc_2markdown_2main.html | 142 + ...c_2doc_2markdown_2parameterized-tests.html | 228 + ...s_2doctest-src_2doc_2markdown_2readme.html | 126 + ...doctest-src_2doc_2markdown_2reporters.html | 202 + ...t-src_2doc_2markdown_2stringification.html | 163 + ...doctest-src_2doc_2markdown_2testcases.html | 235 + ...2doctest-src_2doc_2markdown_2tutorial.html | 258 + ...test-src_2scripts_2random__dev__notes.html | 126 + ...octest-src_2scripts_2release__process.html | 127 + git-main/menudata.js | 4 + git-main/meta_8hpp_source.html | 18 +- git-main/mpi__reporter_8h_source.html | 376 + git-main/mpi__sub__comm_8h_source.html | 191 + git-main/namespacemgutility.html | 54 +- git-main/optional_8hpp_source.html | 103 +- git-main/pages.html | 23 +- ...ent__only_2doctest_2doctest_8h_source.html | 109 + git-main/search/all_0.js | 44 +- git-main/search/all_1.js | 43 +- git-main/search/all_10.js | 27 +- git-main/search/all_11.js | 54 +- git-main/search/all_12.js | 111 +- git-main/search/all_13.js | 31 +- git-main/search/all_14.js | 12 +- git-main/search/all_15.js | 32 +- git-main/search/all_16.js | 8 +- git-main/search/all_17.js | 29 + git-main/search/all_18.js | 17 + git-main/search/all_19.js | 4 + git-main/search/all_1a.js | 22 + git-main/search/all_1b.js | 38 + git-main/search/all_1c.js | 132 + git-main/search/all_1d.js | 15 + git-main/search/all_1e.js | 11 + git-main/search/all_1f.js | 19 + git-main/search/all_2.js | 91 +- git-main/search/all_20.js | 4 + git-main/search/all_21.js | 4 + git-main/search/all_3.js | 18 +- git-main/search/all_4.js | 17 +- git-main/search/all_5.js | 19 +- git-main/search/all_6.js | 6 +- git-main/search/all_7.js | 4 +- git-main/search/all_8.js | 8 +- git-main/search/all_9.js | 4 +- git-main/search/all_a.js | 3 +- git-main/search/all_b.js | 72 +- git-main/search/all_c.js | 17 +- git-main/search/all_d.js | 97 +- git-main/search/all_e.js | 111 +- git-main/search/all_f.js | 34 +- git-main/search/classes_0.js | 5 +- git-main/search/classes_1.js | 7 +- git-main/search/classes_10.js | 14 + git-main/search/classes_11.js | 4 + git-main/search/classes_2.js | 19 +- git-main/search/classes_3.js | 3 +- git-main/search/classes_4.js | 15 +- git-main/search/classes_5.js | 8 +- git-main/search/classes_6.js | 5 +- git-main/search/classes_7.js | 18 +- git-main/search/classes_8.js | 4 + git-main/search/classes_9.js | 14 + git-main/search/classes_a.js | 4 + git-main/search/classes_b.js | 4 + git-main/search/classes_c.js | 6 + git-main/search/classes_d.js | 4 + git-main/search/classes_e.js | 11 + git-main/search/classes_f.js | 14 + git-main/search/functions_5.js | 2 +- git-main/search/functions_6.js | 8 +- git-main/search/functions_7.js | 10 +- git-main/search/functions_8.js | 6 +- git-main/search/functions_9.js | 4 +- git-main/search/functions_a.js | 3 +- git-main/search/functions_b.js | 2 +- git-main/search/functions_c.js | 3 +- git-main/search/functions_d.js | 4 + git-main/search/functions_e.js | 4 + git-main/search/pages_0.js | 3 +- git-main/search/pages_1.js | 3 +- git-main/search/pages_2.js | 7 +- git-main/search/pages_3.js | 4 + git-main/search/pages_4.js | 6 + git-main/search/pages_5.js | 5 + git-main/search/pages_6.js | 4 + git-main/search/pages_7.js | 6 + git-main/search/pages_8.js | 6 + git-main/search/pages_9.js | 6 + git-main/search/pages_a.js | 8 + git-main/search/pages_b.js | 5 + git-main/search/pages_c.js | 8 + git-main/search/searchdata.js | 8 +- git-main/string__view_8hpp_source.html | 112 +- git-main/structApp_1_1Foo.html | 102 + git-main/structBar_1_1Foo-members.html | 103 + git-main/structBar_1_1Foo.html | 112 + .../structBar_1_1MyOtherType-members.html | 104 + git-main/structBar_1_1MyOtherType.html | 119 + git-main/structITranslator-members.html | 99 + git-main/structITranslator.html | 117 + git-main/structITranslator.png | Bin 0 -> 497 bytes git-main/structMyType-members.html | 100 + git-main/structMyType.html | 111 + git-main/structMyTypeInherited-members.html | 97 + git-main/structMyTypeInherited.html | 120 + git-main/structMyTypeInherited.png | Bin 0 -> 682 bytes git-main/structMyXmlReporter-members.html | 123 + git-main/structMyXmlReporter.html | 510 ++ git-main/structMyXmlReporter.png | Bin 0 -> 546 bytes git-main/structN_1_1A.html | 102 + git-main/structN_1_1B-members.html | 103 + git-main/structN_1_1B.html | 112 + git-main/structN_1_1C.html | 102 + git-main/structSomeFixture-members.html | 101 + git-main/structSomeFixture.html | 108 + git-main/structSubcase-members.html | 104 + git-main/structSubcase.html | 124 + git-main/structTranslator-members.html | 101 + git-main/structTranslator.html | 156 + git-main/structTranslator.png | Bin 0 -> 492 bytes git-main/structTypePair-members.html | 100 + git-main/structTypePair.html | 111 + git-main/structdoctest_1_1Approx-members.html | 137 + git-main/structdoctest_1_1Approx.html | 224 + .../structdoctest_1_1AssertData-members.html | 116 + git-main/structdoctest_1_1AssertData.html | 173 + git-main/structdoctest_1_1AssertData.png | Bin 0 -> 902 bytes ...ructdoctest_1_1ContextOptions-members.html | 139 + git-main/structdoctest_1_1ContextOptions.html | 237 + git-main/structdoctest_1_1ContextOptions.png | Bin 0 -> 697 bytes ...ctest_1_1CurrentTestCaseStats-members.html | 107 + ...structdoctest_1_1CurrentTestCaseStats.html | 134 + .../structdoctest_1_1CurrentTestCaseStats.png | Bin 0 -> 737 bytes ...tructdoctest_1_1IContextScope-members.html | 104 + git-main/structdoctest_1_1IContextScope.html | 130 + git-main/structdoctest_1_1IContextScope.png | Bin 0 -> 2119 bytes .../structdoctest_1_1IReporter-members.html | 134 + git-main/structdoctest_1_1IReporter.html | 220 + git-main/structdoctest_1_1IReporter.png | Bin 0 -> 544 bytes git-main/structdoctest_1_1IsNaN-members.html | 110 + git-main/structdoctest_1_1IsNaN.html | 139 + .../structdoctest_1_1MessageData-members.html | 106 + git-main/structdoctest_1_1MessageData.html | 132 + git-main/structdoctest_1_1MessageData.png | Bin 0 -> 995 bytes .../structdoctest_1_1QueryData-members.html | 105 + git-main/structdoctest_1_1QueryData.html | 119 + .../structdoctest_1_1StringMaker-members.html | 101 + git-main/structdoctest_1_1StringMaker.html | 125 + git-main/structdoctest_1_1StringMaker.png | Bin 0 -> 2533 bytes ...01std_1_1list_3_01T_01_4_01_4-members.html | 103 + ...Maker_3_01std_1_1list_3_01T_01_4_01_4.html | 112 + ...ctdoctest_1_1SubcaseSignature-members.html | 109 + .../structdoctest_1_1SubcaseSignature.html | 136 + ...structdoctest_1_1TestCaseData-members.html | 114 + git-main/structdoctest_1_1TestCaseData.html | 156 + git-main/structdoctest_1_1TestCaseData.png | Bin 0 -> 878 bytes ...tdoctest_1_1TestCaseException-members.html | 104 + .../structdoctest_1_1TestCaseException.html | 116 + ...structdoctest_1_1TestRunStats-members.html | 108 + git-main/structdoctest_1_1TestRunStats.html | 137 + git-main/structdoctest_1_1TestRunStats.png | Bin 0 -> 686 bytes ...1_1detail_1_1ContextScopeBase-members.html | 119 + ...doctest_1_1detail_1_1ContextScopeBase.html | 171 + ...tdoctest_1_1detail_1_1ContextScopeBase.png | Bin 0 -> 1531 bytes ...est_1_1detail_1_1ContextState-members.html | 165 + ...ructdoctest_1_1detail_1_1ContextState.html | 316 + ...tructdoctest_1_1detail_1_1ContextState.png | Bin 0 -> 1374 bytes ...etail_1_1ExpressionDecomposer-members.html | 109 + ...est_1_1detail_1_1ExpressionDecomposer.html | 140 + ..._1_1detail_1_1Expression__lhs-members.html | 110 + ...tdoctest_1_1detail_1_1Expression__lhs.html | 193 + ...etail_1_1IExceptionTranslator-members.html | 104 + ...est_1_1detail_1_1IExceptionTranslator.html | 126 + ...test_1_1detail_1_1IExceptionTranslator.png | Bin 0 -> 1113 bytes ...t_1_1detail_1_1MessageBuilder-members.html | 130 + ...ctdoctest_1_1detail_1_1MessageBuilder.html | 228 + ...uctdoctest_1_1detail_1_1MessageBuilder.png | Bin 0 -> 997 bytes ...etail_1_1RelationalComparator-members.html | 104 + ...est_1_1detail_1_1RelationalComparator.html | 116 + ...ctdoctest_1_1detail_1_1Result-members.html | 108 + .../structdoctest_1_1detail_1_1Result.html | 127 + ...st_1_1detail_1_1ResultBuilder-members.html | 132 + ...uctdoctest_1_1detail_1_1ResultBuilder.html | 296 + ...ructdoctest_1_1detail_1_1ResultBuilder.png | Bin 0 -> 910 bytes ..._1_1detail_1_1StringMakerBase-members.html | 104 + ...tdoctest_1_1detail_1_1StringMakerBase.html | 118 + ...StringMakerBase_3_01true_01_4-members.html | 104 + ...tail_1_1StringMakerBase_3_01true_01_4.html | 118 + ...tdoctest_1_1detail_1_1Subcase-members.html | 118 + .../structdoctest_1_1detail_1_1Subcase.html | 157 + ...doctest_1_1detail_1_1TestCase-members.html | 136 + .../structdoctest_1_1detail_1_1TestCase.html | 224 + .../structdoctest_1_1detail_1_1TestCase.png | Bin 0 -> 879 bytes ...est_1_1detail_1_1TestFailureException.html | 102 + ...octest_1_1detail_1_1TestSuite-members.html | 115 + .../structdoctest_1_1detail_1_1TestSuite.html | 156 + ...uctdoctest_1_1detail_1_1Timer-members.html | 105 + .../structdoctest_1_1detail_1_1Timer.html | 118 + ..._1_1detail_1_1deferred__false-members.html | 103 + ...tdoctest_1_1detail_1_1deferred__false.html | 122 + ...ctdoctest_1_1detail_1_1deferred__false.png | Bin 0 -> 1073 bytes ...doctest_1_1detail_1_1filldata-members.html | 104 + .../structdoctest_1_1detail_1_1filldata.html | 116 + ...l_1_1filldata_3_01T_01_5_01_4-members.html | 104 + ...1_1detail_1_1filldata_3_01T_01_5_01_4.html | 116 + ...il_1_1filldata_3_01T_0fN_0e_4-members.html | 104 + ..._1_1detail_1_1filldata_3_01T_0fN_0e_4.html | 116 + ...ata_3_01const_01char_0fN_0e_4-members.html | 104 + ...1_1filldata_3_01const_01char_0fN_0e_4.html | 116 + ...ta_3_01const_01void_01_5_01_4-members.html | 104 + ..._1filldata_3_01const_01void_01_5_01_4.html | 116 + ...l_1_1has__insertion__operator-members.html | 103 + ...1_1detail_1_1has__insertion__operator.html | 122 + ..._1_1detail_1_1has__insertion__operator.png | Bin 0 -> 1486 bytes ...clval8c97dd8f47530329f29e7e769b7430cb.html | 103 + ...clvald5a5a279653bbfeef238ad5c984744e2.html | 122 + ...eclvald5a5a279653bbfeef238ad5c984744e2.png | Bin 0 -> 2283 bytes ...ringify__as__underlying__type-members.html | 103 + ...ould__stringify__as__underlying__type.html | 113 + ...test_1_1detail_1_1types_1_1enable__if.html | 102 + ...able__if_3_01true_00_01T_01_4-members.html | 104 + ...es_1_1enable__if_3_01true_00_01T_01_4.html | 116 + ...etail_1_1types_1_1false__type-members.html | 103 + ...est_1_1detail_1_1types_1_1false__type.html | 131 + ...test_1_1detail_1_1types_1_1false__type.png | Bin 0 -> 7421 bytes ...1detail_1_1types_1_1is__array-members.html | 103 + ...ctest_1_1detail_1_1types_1_1is__array.html | 122 + ...octest_1_1detail_1_1types_1_1is__array.png | Bin 0 -> 1091 bytes ..._1is__array_3_01T_0fSIZE_0e_4-members.html | 103 + ...1types_1_1is__array_3_01T_0fSIZE_0e_4.html | 122 + ..._1types_1_1is__array_3_01T_0fSIZE_0e_4.png | Bin 0 -> 1155 bytes ..._1detail_1_1types_1_1is__enum-members.html | 103 + ...octest_1_1detail_1_1types_1_1is__enum.html | 113 + ...etail_1_1types_1_1is__pointer-members.html | 103 + ...est_1_1detail_1_1types_1_1is__pointer.html | 122 + ...test_1_1detail_1_1types_1_1is__pointer.png | Bin 0 -> 1115 bytes ..._1is__pointer_3_01T_01_5_01_4-members.html | 103 + ...1types_1_1is__pointer_3_01T_01_5_01_4.html | 122 + ..._1types_1_1is__pointer_3_01T_01_5_01_4.png | Bin 0 -> 1115 bytes ...ypes_1_1is__rvalue__reference-members.html | 103 + ...ail_1_1types_1_1is__rvalue__reference.html | 122 + ...tail_1_1types_1_1is__rvalue__reference.png | Bin 0 -> 1387 bytes ...__reference_3_01T_01_6_6_01_4-members.html | 103 + ...__rvalue__reference_3_01T_01_6_6_01_4.html | 122 + ...s__rvalue__reference_3_01T_01_6_6_01_4.png | Bin 0 -> 1441 bytes ...ail_1_1types_1_1remove__const-members.html | 104 + ...t_1_1detail_1_1types_1_1remove__const.html | 116 + ...ove__const_3_01const_01T_01_4-members.html | 104 + ...s_1_1remove__const_3_01const_01T_01_4.html | 116 + ...1_1types_1_1remove__reference-members.html | 104 + ...1detail_1_1types_1_1remove__reference.html | 116 + ...ve__reference_3_01T_01_6_01_4-members.html | 104 + ..._1_1remove__reference_3_01T_01_6_01_4.html | 116 + ...__reference_3_01T_01_6_6_01_4-members.html | 104 + ..._1remove__reference_3_01T_01_6_6_01_4.html | 116 + ...detail_1_1types_1_1true__type-members.html | 103 + ...test_1_1detail_1_1types_1_1true__type.html | 129 + ...ctest_1_1detail_1_1types_1_1true__type.png | Bin 0 -> 9496 bytes ..._1_1types_1_1underlying__type-members.html | 104 + ..._1detail_1_1types_1_1underlying__type.html | 116 + ...ructdoctest_1_1mpi__sub__comm-members.html | 112 + git-main/structdoctest_1_1mpi__sub__comm.html | 140 + git-main/structint__holder-members.html | 100 + git-main/structint__holder.html | 115 + git-main/structint__pointer-members.html | 103 + git-main/structint__pointer.html | 121 + ...uctmgutility_1_1bad__optional__access.html | 4 +- git-main/structmgutility_1_1custom__enum.html | 4 +- ...ity_1_1custom__enum_3_01Position_01_4.html | 4 +- ...mgutility_1_1detail_1_1enum__sequence.html | 2 +- ...y_1_1detail_1_1enum__sequence__helper.html | 2 +- ...0_01Min_00_01Min_00_01Next_8_8_8_01_4.html | 4 +- ...ructmgutility_1_1detail_1_1enum__type.html | 16 +- ...ctmgutility_1_1detail_1_1has__bit__or.html | 2 +- ...2_03_7T_02_03_08_00_01void_07_08_08_4.html | 2 +- ...utility_1_1detail_1_1is__scoped__enum.html | 8 +- git-main/structmgutility_1_1enum__range.html | 6 +- ...lity_1_1enum__range_3_01Position_01_4.html | 4 +- ...utility_1_1enum__range_3_01color_01_4.html | 4 +- git-main/structmgutility_1_1nullopt__t.html | 8 +- git-main/structmgutility_1_1pair.html | 4 +- git-main/structstd_1_1char__traits.html | 102 + git-main/structuser1_1_1label-members.html | 104 + git-main/structuser1_1_1label.html | 112 + git-main/structuser2_1_1label-members.html | 105 + git-main/structuser2_1_1label.html | 119 + git-main/structuser3_1_1label-members.html | 105 + git-main/structuser3_1_1label.html | 119 + git-main/structuser4_1_1label-members.html | 105 + git-main/structuser4_1_1label.html | 119 + git-main/structuser5_1_1label-members.html | 105 + git-main/structuser5_1_1label.html | 119 + git-main/structuser6_1_1label-members.html | 111 + git-main/structuser6_1_1label.html | 135 + git-main/structuser7_1_1label-members.html | 108 + git-main/structuser7_1_1label.html | 124 + git-main/structuser8_1_1label-members.html | 104 + git-main/structuser8_1_1label.html | 112 + git-main/structuser9a_1_1label-members.html | 104 + git-main/structuser9a_1_1label.html | 112 + git-main/structuser9b_1_1label-members.html | 104 + git-main/structuser9b_1_1label.html | 112 + 385 files changed, 49707 insertions(+), 798 deletions(-) create mode 100644 git-main/assert__returns__disabled_8cpp_source.html create mode 100644 git-main/classMoveOnly-members.html create mode 100644 git-main/classMoveOnly.html create mode 100644 git-main/classdoctest_1_1AssertData_1_1StringContains-members.html create mode 100644 git-main/classdoctest_1_1AssertData_1_1StringContains.html create mode 100644 git-main/classdoctest_1_1Contains-members.html create mode 100644 git-main/classdoctest_1_1Contains.html create mode 100644 git-main/classdoctest_1_1Context-members.html create mode 100644 git-main/classdoctest_1_1Context.html create mode 100644 git-main/classdoctest_1_1String-members.html create mode 100644 git-main/classdoctest_1_1String.html create mode 100644 git-main/classdoctest_1_1detail_1_1ContextScope-members.html create mode 100644 git-main/classdoctest_1_1detail_1_1ContextScope.html create mode 100644 git-main/classdoctest_1_1detail_1_1ContextScope.png create mode 100644 git-main/classdoctest_1_1detail_1_1ErrnoGuard-members.html create mode 100644 git-main/classdoctest_1_1detail_1_1ErrnoGuard.html create mode 100644 git-main/classdoctest_1_1detail_1_1ExceptionTranslator-members.html create mode 100644 git-main/classdoctest_1_1detail_1_1ExceptionTranslator.html create mode 100644 git-main/classdoctest_1_1detail_1_1ExceptionTranslator.png create mode 100644 git-main/classdoctest_1_1detail_1_1MultiLaneAtomic-members.html create mode 100644 git-main/classdoctest_1_1detail_1_1MultiLaneAtomic.html create mode 100644 git-main/classstd_1_1basic__istream.html create mode 100644 git-main/classstd_1_1basic__ostream.html create mode 100644 git-main/classstd_1_1tuple.html create mode 100644 git-main/dir_12250f07495b82a5468dcd73f04130d2.html create mode 100644 git-main/dir_19d6e67e2a8c9c02f99b05222b5702e0.html create mode 100644 git-main/dir_211db8a2c69420f4ce572fd277c5fa9d.html create mode 100644 git-main/dir_2da0d08c090dfc162bcb1050ad85461d.html create mode 100644 git-main/dir_3aed5d9a354d80b98b13c56957e9e40d.html create mode 100644 git-main/dir_42566503585505dc2e60fa3dcde9fb9b.html create mode 100644 git-main/dir_43253e74d6ea82bdbabf005ef1d7a846.html create mode 100644 git-main/dir_5b519a8d1f6ad2560e623a56ba70dd2c.html create mode 100644 git-main/dir_5ce394648a2ce49effa43d7c8c1d0ab7.html create mode 100644 git-main/dir_7eb8d58cad924ffc9253fe5769504e6c.html create mode 100644 git-main/dir_8b925520cb613cf2392a9f8548a542a4.html create mode 100644 git-main/dir_9a2b83ecc9199c13815ef5c7cb1df230.html create mode 100644 git-main/dir_9b84b44367723a1d0d88a431bcd23f48.html create mode 100644 git-main/dir_a4fd227c5a8e0bc1498d3ae6ee4886a0.html create mode 100644 git-main/dir_a57a94e38c03835eed49274b75b0176d.html create mode 100644 git-main/dir_a64aea07de2f8e4b0652b4f49e88934d.html create mode 100644 git-main/dir_c528b7bc4a3fa6117001302291996482.html create mode 100644 git-main/dir_cf0ad092fd70688f67b23e9319dfdbf7.html create mode 100644 git-main/dir_d7feab101fc42698e063f6e64b4257c6.html create mode 100644 git-main/dir_dc93519aa0008696ff29cd2f84adb2a1.html create mode 100644 git-main/dir_f2245241ea565ce482a8cba7c024245b.html create mode 100644 git-main/dir_f40c3ec3501908b5834e804abc5d7b28.html create mode 100644 git-main/dll_8h_source.html create mode 100644 git-main/doctest_2doctest_8h_source.html create mode 100644 git-main/doctest_8cpp_source.html create mode 100644 git-main/doctest__fwd_8h_source.html create mode 100644 git-main/doctest__mpi_8h_source.html create mode 100644 git-main/doctest__proxy_8h_source.html create mode 100644 git-main/doctest__util_8h_source.html create mode 100644 git-main/exporting_8h_source.html create mode 100644 git-main/foo_8h_source.html create mode 100644 git-main/header_8h_source.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CONTRIBUTING.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2commandline.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2readme.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2reporters.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2random__dev__notes.html create mode 100644 git-main/md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2release__process.html create mode 100644 git-main/mpi__reporter_8h_source.html create mode 100644 git-main/mpi__sub__comm_8h_source.html create mode 100644 git-main/scripts_2development__only_2doctest_2doctest_8h_source.html create mode 100644 git-main/search/all_17.js create mode 100644 git-main/search/all_18.js create mode 100644 git-main/search/all_19.js create mode 100644 git-main/search/all_1a.js create mode 100644 git-main/search/all_1b.js create mode 100644 git-main/search/all_1c.js create mode 100644 git-main/search/all_1d.js create mode 100644 git-main/search/all_1e.js create mode 100644 git-main/search/all_1f.js create mode 100644 git-main/search/all_20.js create mode 100644 git-main/search/all_21.js create mode 100644 git-main/search/classes_10.js create mode 100644 git-main/search/classes_11.js create mode 100644 git-main/search/classes_8.js create mode 100644 git-main/search/classes_9.js create mode 100644 git-main/search/classes_a.js create mode 100644 git-main/search/classes_b.js create mode 100644 git-main/search/classes_c.js create mode 100644 git-main/search/classes_d.js create mode 100644 git-main/search/classes_e.js create mode 100644 git-main/search/classes_f.js create mode 100644 git-main/search/functions_d.js create mode 100644 git-main/search/functions_e.js create mode 100644 git-main/search/pages_3.js create mode 100644 git-main/search/pages_4.js create mode 100644 git-main/search/pages_5.js create mode 100644 git-main/search/pages_6.js create mode 100644 git-main/search/pages_7.js create mode 100644 git-main/search/pages_8.js create mode 100644 git-main/search/pages_9.js create mode 100644 git-main/search/pages_a.js create mode 100644 git-main/search/pages_b.js create mode 100644 git-main/search/pages_c.js create mode 100644 git-main/structApp_1_1Foo.html create mode 100644 git-main/structBar_1_1Foo-members.html create mode 100644 git-main/structBar_1_1Foo.html create mode 100644 git-main/structBar_1_1MyOtherType-members.html create mode 100644 git-main/structBar_1_1MyOtherType.html create mode 100644 git-main/structITranslator-members.html create mode 100644 git-main/structITranslator.html create mode 100644 git-main/structITranslator.png create mode 100644 git-main/structMyType-members.html create mode 100644 git-main/structMyType.html create mode 100644 git-main/structMyTypeInherited-members.html create mode 100644 git-main/structMyTypeInherited.html create mode 100644 git-main/structMyTypeInherited.png create mode 100644 git-main/structMyXmlReporter-members.html create mode 100644 git-main/structMyXmlReporter.html create mode 100644 git-main/structMyXmlReporter.png create mode 100644 git-main/structN_1_1A.html create mode 100644 git-main/structN_1_1B-members.html create mode 100644 git-main/structN_1_1B.html create mode 100644 git-main/structN_1_1C.html create mode 100644 git-main/structSomeFixture-members.html create mode 100644 git-main/structSomeFixture.html create mode 100644 git-main/structSubcase-members.html create mode 100644 git-main/structSubcase.html create mode 100644 git-main/structTranslator-members.html create mode 100644 git-main/structTranslator.html create mode 100644 git-main/structTranslator.png create mode 100644 git-main/structTypePair-members.html create mode 100644 git-main/structTypePair.html create mode 100644 git-main/structdoctest_1_1Approx-members.html create mode 100644 git-main/structdoctest_1_1Approx.html create mode 100644 git-main/structdoctest_1_1AssertData-members.html create mode 100644 git-main/structdoctest_1_1AssertData.html create mode 100644 git-main/structdoctest_1_1AssertData.png create mode 100644 git-main/structdoctest_1_1ContextOptions-members.html create mode 100644 git-main/structdoctest_1_1ContextOptions.html create mode 100644 git-main/structdoctest_1_1ContextOptions.png create mode 100644 git-main/structdoctest_1_1CurrentTestCaseStats-members.html create mode 100644 git-main/structdoctest_1_1CurrentTestCaseStats.html create mode 100644 git-main/structdoctest_1_1CurrentTestCaseStats.png create mode 100644 git-main/structdoctest_1_1IContextScope-members.html create mode 100644 git-main/structdoctest_1_1IContextScope.html create mode 100644 git-main/structdoctest_1_1IContextScope.png create mode 100644 git-main/structdoctest_1_1IReporter-members.html create mode 100644 git-main/structdoctest_1_1IReporter.html create mode 100644 git-main/structdoctest_1_1IReporter.png create mode 100644 git-main/structdoctest_1_1IsNaN-members.html create mode 100644 git-main/structdoctest_1_1IsNaN.html create mode 100644 git-main/structdoctest_1_1MessageData-members.html create mode 100644 git-main/structdoctest_1_1MessageData.html create mode 100644 git-main/structdoctest_1_1MessageData.png create mode 100644 git-main/structdoctest_1_1QueryData-members.html create mode 100644 git-main/structdoctest_1_1QueryData.html create mode 100644 git-main/structdoctest_1_1StringMaker-members.html create mode 100644 git-main/structdoctest_1_1StringMaker.html create mode 100644 git-main/structdoctest_1_1StringMaker.png create mode 100644 git-main/structdoctest_1_1StringMaker_3_01std_1_1list_3_01T_01_4_01_4-members.html create mode 100644 git-main/structdoctest_1_1StringMaker_3_01std_1_1list_3_01T_01_4_01_4.html create mode 100644 git-main/structdoctest_1_1SubcaseSignature-members.html create mode 100644 git-main/structdoctest_1_1SubcaseSignature.html create mode 100644 git-main/structdoctest_1_1TestCaseData-members.html create mode 100644 git-main/structdoctest_1_1TestCaseData.html create mode 100644 git-main/structdoctest_1_1TestCaseData.png create mode 100644 git-main/structdoctest_1_1TestCaseException-members.html create mode 100644 git-main/structdoctest_1_1TestCaseException.html create mode 100644 git-main/structdoctest_1_1TestRunStats-members.html create mode 100644 git-main/structdoctest_1_1TestRunStats.html create mode 100644 git-main/structdoctest_1_1TestRunStats.png create mode 100644 git-main/structdoctest_1_1detail_1_1ContextScopeBase-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1ContextScopeBase.html create mode 100644 git-main/structdoctest_1_1detail_1_1ContextScopeBase.png create mode 100644 git-main/structdoctest_1_1detail_1_1ContextState-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1ContextState.html create mode 100644 git-main/structdoctest_1_1detail_1_1ContextState.png create mode 100644 git-main/structdoctest_1_1detail_1_1ExpressionDecomposer-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1ExpressionDecomposer.html create mode 100644 git-main/structdoctest_1_1detail_1_1Expression__lhs-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1Expression__lhs.html create mode 100644 git-main/structdoctest_1_1detail_1_1IExceptionTranslator-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1IExceptionTranslator.html create mode 100644 git-main/structdoctest_1_1detail_1_1IExceptionTranslator.png create mode 100644 git-main/structdoctest_1_1detail_1_1MessageBuilder-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1MessageBuilder.html create mode 100644 git-main/structdoctest_1_1detail_1_1MessageBuilder.png create mode 100644 git-main/structdoctest_1_1detail_1_1RelationalComparator-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1RelationalComparator.html create mode 100644 git-main/structdoctest_1_1detail_1_1Result-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1Result.html create mode 100644 git-main/structdoctest_1_1detail_1_1ResultBuilder-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1ResultBuilder.html create mode 100644 git-main/structdoctest_1_1detail_1_1ResultBuilder.png create mode 100644 git-main/structdoctest_1_1detail_1_1StringMakerBase-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1StringMakerBase.html create mode 100644 git-main/structdoctest_1_1detail_1_1StringMakerBase_3_01true_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1StringMakerBase_3_01true_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1Subcase-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1Subcase.html create mode 100644 git-main/structdoctest_1_1detail_1_1TestCase-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1TestCase.html create mode 100644 git-main/structdoctest_1_1detail_1_1TestCase.png create mode 100644 git-main/structdoctest_1_1detail_1_1TestFailureException.html create mode 100644 git-main/structdoctest_1_1detail_1_1TestSuite-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1TestSuite.html create mode 100644 git-main/structdoctest_1_1detail_1_1Timer-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1Timer.html create mode 100644 git-main/structdoctest_1_1detail_1_1deferred__false-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1deferred__false.html create mode 100644 git-main/structdoctest_1_1detail_1_1deferred__false.png create mode 100644 git-main/structdoctest_1_1detail_1_1filldata-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01T_01_5_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01T_01_5_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01T_0fN_0e_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01T_0fN_0e_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01const_01char_0fN_0e_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01const_01char_0fN_0e_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01const_01void_01_5_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1filldata_3_01const_01void_01_5_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator.html create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator.png create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator_3_01T_00_01decltype_07operator_3_3_07declval8c97dd8f47530329f29e7e769b7430cb.html create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator_3_01T_00_01decltype_07operator_3_3_07declvald5a5a279653bbfeef238ad5c984744e2.html create mode 100644 git-main/structdoctest_1_1detail_1_1has__insertion__operator_3_01T_00_01decltype_07operator_3_3_07declvald5a5a279653bbfeef238ad5c984744e2.png create mode 100644 git-main/structdoctest_1_1detail_1_1should__stringify__as__underlying__type-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1should__stringify__as__underlying__type.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1enable__if.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1enable__if_3_01true_00_01T_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1enable__if_3_01true_00_01T_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1false__type-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1false__type.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1false__type.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array_3_01T_0fSIZE_0e_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array_3_01T_0fSIZE_0e_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__array_3_01T_0fSIZE_0e_4.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__enum-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__enum.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer_3_01T_01_5_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer_3_01T_01_5_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__pointer_3_01T_01_5_01_4.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference_3_01T_01_6_6_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference_3_01T_01_6_6_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1is__rvalue__reference_3_01T_01_6_6_01_4.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__const-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__const.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__const_3_01const_01T_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__const_3_01const_01T_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_6_01_4-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_6_01_4.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1true__type-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1true__type.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1true__type.png create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1underlying__type-members.html create mode 100644 git-main/structdoctest_1_1detail_1_1types_1_1underlying__type.html create mode 100644 git-main/structdoctest_1_1mpi__sub__comm-members.html create mode 100644 git-main/structdoctest_1_1mpi__sub__comm.html create mode 100644 git-main/structint__holder-members.html create mode 100644 git-main/structint__holder.html create mode 100644 git-main/structint__pointer-members.html create mode 100644 git-main/structint__pointer.html create mode 100644 git-main/structstd_1_1char__traits.html create mode 100644 git-main/structuser1_1_1label-members.html create mode 100644 git-main/structuser1_1_1label.html create mode 100644 git-main/structuser2_1_1label-members.html create mode 100644 git-main/structuser2_1_1label.html create mode 100644 git-main/structuser3_1_1label-members.html create mode 100644 git-main/structuser3_1_1label.html create mode 100644 git-main/structuser4_1_1label-members.html create mode 100644 git-main/structuser4_1_1label.html create mode 100644 git-main/structuser5_1_1label-members.html create mode 100644 git-main/structuser5_1_1label.html create mode 100644 git-main/structuser6_1_1label-members.html create mode 100644 git-main/structuser6_1_1label.html create mode 100644 git-main/structuser7_1_1label-members.html create mode 100644 git-main/structuser7_1_1label.html create mode 100644 git-main/structuser8_1_1label-members.html create mode 100644 git-main/structuser8_1_1label.html create mode 100644 git-main/structuser9a_1_1label-members.html create mode 100644 git-main/structuser9a_1_1label.html create mode 100644 git-main/structuser9b_1_1label-members.html create mode 100644 git-main/structuser9b_1_1label.html diff --git a/git-main/annotated.html b/git-main/annotated.html index 0f0c39b..359f906 100644 --- a/git-main/annotated.html +++ b/git-main/annotated.html @@ -87,27 +87,141 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 123]
- - - - - - - - - - - - - - - - - - - - +
[detail level 1234]
 NmgutilityChecks for MSVC compiler version
 Ndetail
 Cenum_sequenceRepresents a sequence of enumeration values
 Cenum_sequence_helperHelper for generating a sequence of enumeration values
 Cenum_sequence_helper< Enum, Min, Min, Next... >Specialization of enum_sequence_helper for the end of the sequence
 Cenum_type
 Chas_bit_orTrait to check if a type supports the bitwise OR operator
 Chas_bit_or< T, decltype((T{}|T{}), void())>Specialization of has_bit_or for types that support the bitwise OR operator
 Cis_scoped_enumTrait to check if a type is a scoped enumeration
 Cbad_optional_accessException thrown when accessing an empty optional
 Cbasic_string_viewA basic string view class template
 Ccustom_enumProvides the custom names map for an enumeration type
 Ccustom_enum< Position >
 Cenum_for_eachA class template for iterating over enum values
 Cenum_rangeProvides the range for an enumeration type
 Cenum_range< color >
 Cenum_range< Position >
 Cnullopt_tRepresents a null optional
 CoptionalA class template that provides optional (nullable) objects
 Cpair
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NApp
 CFoo
 NBar
 CFoo
 CMyOtherType
 Ndoctest
 Ndetail
 CApprox
 CAssertData
 CContains
 CContext
 CContextOptionsOCLINT too many fields
 CCurrentTestCaseStats
 CIContextScope
 CIReporter
 CIsNaN
 CMessageData
 Cmpi_sub_comm
 CQueryData
 CString
 CStringMaker
 CStringMaker< std::list< T > >
 CSubcaseSignature
 CTestCaseData
 CTestCaseException
 CTestRunStats
 NmgutilityChecks for MSVC compiler version
 Ndetail
 Cbad_optional_accessException thrown when accessing an empty optional
 Cbasic_string_viewA basic string view class template
 Ccustom_enumProvides the custom names map for an enumeration type
 Ccustom_enum< Position >
 Cenum_for_eachA class template for iterating over enum values
 Cenum_rangeProvides the range for an enumeration type
 Cenum_range< color >
 Cenum_range< Position >
 Cnullopt_tRepresents a null optional
 CoptionalA class template that provides optional (nullable) objects
 Cpair
 NN
 CA
 CB
 CC
 Nstd
 Cbasic_istream
 Cbasic_ostream
 Cchar_traits
 Ctuple
 Nuser1
 Clabel
 Nuser2
 Clabel
 Nuser3
 Clabel
 Nuser4
 Clabel
 Nuser5
 Clabel
 Nuser6
 Clabel
 Nuser7
 Clabel
 Nuser8
 Clabel
 Nuser9a
 Clabel
 Nuser9b
 Clabel
 Cint_holder
 Cint_pointer
 CITranslator
 CMoveOnly
 CMyType
 CMyTypeInherited
 CMyXmlReporter
 CSomeFixture
 CSubcase
 CTranslator
 CTypePair
diff --git a/git-main/assert__returns__disabled_8cpp_source.html b/git-main/assert__returns__disabled_8cpp_source.html new file mode 100644 index 0000000..b597d51 --- /dev/null +++ b/git-main/assert__returns__disabled_8cpp_source.html @@ -0,0 +1,134 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/assert_returns_disabled.cpp Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
assert_returns_disabled.cpp
+
+
+
1#define DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
+
2#include <doctest/doctest.h>
+
3
+
4DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+
5#include <iostream>
+
6DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
7
+
8#ifndef TEST_FLIP
+
9#define TEST_FLIP 0
+
10#endif
+
11
+
12#define TEST_FAIL() std::cout << "FAILED ON: " << __LINE__ \
+
13 << "(" << (TEST_FLIP ? "EVALUATED" : "DISABLED") << ")" << std::endl
+
14
+
15static int test_disabled_var_ = [] { // NOLINT
+
16 // none may return true
+
17 if (TEST_FLIP ^ CHECK(0 == 0)) { TEST_FAIL(); }
+
18 if (TEST_FLIP ^ CHECK_FALSE(0 != 0)) { TEST_FAIL(); }
+
19 if (TEST_FLIP ^ CHECK_EQ(0, 0)) { TEST_FAIL(); }
+
20 if (TEST_FLIP ^ CHECK_UNARY(true)) { TEST_FAIL(); }
+
21 if (TEST_FLIP ^ CHECK_UNARY_FALSE(false)) { TEST_FAIL(); }
+
22#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
23 int i = 2; (void)i;
+
24 if (TEST_FLIP ^ CHECK_THROWS([=] { throw i; }())) { TEST_FAIL(); }
+
25 if (TEST_FLIP ^ CHECK_THROWS_AS([=] { throw i; }(), int)) { TEST_FAIL(); }
+
26 if (TEST_FLIP ^ CHECK_NOTHROW([=]{ }())) { TEST_FAIL(); }
+
27#endif
+
28
+
29 return 0;
+
30}();
+
+ + + + diff --git a/git-main/classMoveOnly-members.html b/git-main/classMoveOnly-members.html new file mode 100644 index 0000000..79b66c6 --- /dev/null +++ b/git-main/classMoveOnly-members.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
MoveOnly Member List
+
+
+ +

This is the complete list of members for MoveOnly, including all inherited members.

+ + + + + + + + +
MoveOnly(int iIn) (defined in MoveOnly)MoveOnlyinline
MoveOnly(MoveOnly &&)=default (defined in MoveOnly)MoveOnly
MoveOnly(const MoveOnly &)=delete (defined in MoveOnly)MoveOnly
operator bool() (defined in MoveOnly)MoveOnlyinline
operator=(MoveOnly &&)=default (defined in MoveOnly)MoveOnly
operator=(const MoveOnly &)=default (defined in MoveOnly)MoveOnly
~MoveOnly()=default (defined in MoveOnly)MoveOnly
+ + + + diff --git a/git-main/classMoveOnly.html b/git-main/classMoveOnly.html new file mode 100644 index 0000000..d2dd80d --- /dev/null +++ b/git-main/classMoveOnly.html @@ -0,0 +1,123 @@ + + + + + + + + + enum_name: MoveOnly Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
MoveOnly Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

MoveOnly (int iIn)
 
MoveOnly (MoveOnly &&)=default
 
MoveOnly (const MoveOnly &)=delete
 
+MoveOnlyoperator= (MoveOnly &&)=default
 
+MoveOnlyoperator= (const MoveOnly &)=default
 
operator bool ()
 
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/git-main/classdoctest_1_1AssertData_1_1StringContains-members.html b/git-main/classdoctest_1_1AssertData_1_1StringContains-members.html new file mode 100644 index 0000000..2499df2 --- /dev/null +++ b/git-main/classdoctest_1_1AssertData_1_1StringContains-members.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::AssertData::StringContains Member List
+
+
+ +

This is the complete list of members for doctest::AssertData::StringContains, including all inherited members.

+ + + + + + + + + + + +
c_str() const (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
c_str() const (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
check(const String &str) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
check(const String &str) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
operator const String &() const (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
operator const String &() const (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
StringContains(const String &str) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
StringContains(Contains cntn) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
StringContains(const String &str) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
StringContains(Contains cntn) (defined in doctest::AssertData::StringContains)doctest::AssertData::StringContainsinline
+ + + + diff --git a/git-main/classdoctest_1_1AssertData_1_1StringContains.html b/git-main/classdoctest_1_1AssertData_1_1StringContains.html new file mode 100644 index 0000000..01b7aab --- /dev/null +++ b/git-main/classdoctest_1_1AssertData_1_1StringContains.html @@ -0,0 +1,140 @@ + + + + + + + + + enum_name: doctest::AssertData::StringContains Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::AssertData::StringContains Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

StringContains (const String &str)
 
StringContains (Contains cntn)
 
+bool check (const String &str)
 
operator const String & () const
 
+const char * c_str () const
 
StringContains (const String &str)
 
StringContains (Contains cntn)
 
+bool check (const String &str)
 
operator const String & () const
 
+const char * c_str () const
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/git-main/classdoctest_1_1Contains-members.html b/git-main/classdoctest_1_1Contains-members.html new file mode 100644 index 0000000..dc9b361 --- /dev/null +++ b/git-main/classdoctest_1_1Contains-members.html @@ -0,0 +1,107 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::Contains Member List
+
+
+ +

This is the complete list of members for doctest::Contains, including all inherited members.

+ + + + + + +
checkWith(const String &other) const (defined in doctest::Contains)doctest::Contains
checkWith(const String &other) const (defined in doctest::Contains)doctest::Contains
Contains(const String &string) (defined in doctest::Contains)doctest::Containsexplicit
Contains(const String &string) (defined in doctest::Contains)doctest::Containsexplicit
string (defined in doctest::Contains)doctest::Contains
+ + + + diff --git a/git-main/classdoctest_1_1Contains.html b/git-main/classdoctest_1_1Contains.html new file mode 100644 index 0000000..feb14db --- /dev/null +++ b/git-main/classdoctest_1_1Contains.html @@ -0,0 +1,130 @@ + + + + + + + + + enum_name: doctest::Contains Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::Contains Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

Contains (const String &string)
 
+bool checkWith (const String &other) const
 
Contains (const String &string)
 
+bool checkWith (const String &other) const
 
+ + + +

+Public Attributes

+String string
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/git-main/classdoctest_1_1Context-members.html b/git-main/classdoctest_1_1Context-members.html new file mode 100644 index 0000000..15e1a9a --- /dev/null +++ b/git-main/classdoctest_1_1Context-members.html @@ -0,0 +1,136 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::Context Member List
+
+
+ +

This is the complete list of members for doctest::Context, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addFilter(const char *filter, const char *value) (defined in doctest::Context)doctest::Context
addFilter(const char *filter, const char *value) (defined in doctest::Context)doctest::Context
applyCommandLine(int argc, const char *const *argv) (defined in doctest::Context)doctest::Context
applyCommandLine(int argc, const char *const *argv) (defined in doctest::Context)doctest::Context
clearFilters() (defined in doctest::Context)doctest::Context
clearFilters() (defined in doctest::Context)doctest::Context
Context(int argc=0, const char *const *argv=nullptr) (defined in doctest::Context)doctest::Contextexplicit
Context(const Context &)=delete (defined in doctest::Context)doctest::Context
Context(Context &&)=delete (defined in doctest::Context)doctest::Context
Context(int argc=0, const char *const *argv=nullptr) (defined in doctest::Context)doctest::Contextexplicit
Context(const Context &)=delete (defined in doctest::Context)doctest::Context
Context(Context &&)=delete (defined in doctest::Context)doctest::Context
operator=(const Context &)=delete (defined in doctest::Context)doctest::Context
operator=(Context &&)=delete (defined in doctest::Context)doctest::Context
operator=(const Context &)=delete (defined in doctest::Context)doctest::Context
operator=(Context &&)=delete (defined in doctest::Context)doctest::Context
run() (defined in doctest::Context)doctest::Context
run() (defined in doctest::Context)doctest::Context
setAsDefaultForAssertsOutOfTestCases() (defined in doctest::Context)doctest::Context
setAsDefaultForAssertsOutOfTestCases() (defined in doctest::Context)doctest::Context
setAssertHandler(detail::assert_handler ah) (defined in doctest::Context)doctest::Context
setAssertHandler(detail::assert_handler ah) (defined in doctest::Context)doctest::Context
setCout(std::ostream *out) (defined in doctest::Context)doctest::Context
setCout(std::ostream *out) (defined in doctest::Context)doctest::Context
setOption(const char *option, bool value) (defined in doctest::Context)doctest::Context
setOption(const char *option, int value) (defined in doctest::Context)doctest::Context
setOption(const char *option, const char *value) (defined in doctest::Context)doctest::Context
setOption(const char *option, bool value) (defined in doctest::Context)doctest::Context
setOption(const char *option, int value) (defined in doctest::Context)doctest::Context
setOption(const char *option, const char *value) (defined in doctest::Context)doctest::Context
shouldExit() (defined in doctest::Context)doctest::Context
shouldExit() (defined in doctest::Context)doctest::Context
~Context() (defined in doctest::Context)doctest::Context
~Context() (defined in doctest::Context)doctest::Context
+ + + + diff --git a/git-main/classdoctest_1_1Context.html b/git-main/classdoctest_1_1Context.html new file mode 100644 index 0000000..340fd0d --- /dev/null +++ b/git-main/classdoctest_1_1Context.html @@ -0,0 +1,207 @@ + + + + + + + + + enum_name: doctest::Context Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::Context Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Context (int argc=0, const char *const *argv=nullptr)
 
Context (const Context &)=delete
 
Context (Context &&)=delete
 
+Contextoperator= (const Context &)=delete
 
+Contextoperator= (Context &&)=delete
 
+void applyCommandLine (int argc, const char *const *argv)
 
+void addFilter (const char *filter, const char *value)
 
+void clearFilters ()
 
+void setOption (const char *option, bool value)
 
+void setOption (const char *option, int value)
 
+void setOption (const char *option, const char *value)
 
+bool shouldExit ()
 
+void setAsDefaultForAssertsOutOfTestCases ()
 
+void setAssertHandler (detail::assert_handler ah)
 
+void setCout (std::ostream *out)
 
+int run ()
 
Context (int argc=0, const char *const *argv=nullptr)
 
Context (const Context &)=delete
 
Context (Context &&)=delete
 
+Contextoperator= (const Context &)=delete
 
+Contextoperator= (Context &&)=delete
 
+void applyCommandLine (int argc, const char *const *argv)
 
+void addFilter (const char *filter, const char *value)
 
+void clearFilters ()
 
+void setOption (const char *option, bool value)
 
+void setOption (const char *option, int value)
 
+void setOption (const char *option, const char *value)
 
+bool shouldExit ()
 
+void setAsDefaultForAssertsOutOfTestCases ()
 
+void setAssertHandler (detail::assert_handler ah)
 
+void setCout (std::ostream *out)
 
+int run ()
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/git-main/classdoctest_1_1String-members.html b/git-main/classdoctest_1_1String-members.html new file mode 100644 index 0000000..3705bcc --- /dev/null +++ b/git-main/classdoctest_1_1String-members.html @@ -0,0 +1,153 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::String Member List
+
+
+ +

This is the complete list of members for doctest::String, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
buf (defined in doctest::String)doctest::String
c_str() const (defined in doctest::String)doctest::Stringinline
c_str() (defined in doctest::String)doctest::Stringinline
c_str() const (defined in doctest::String)doctest::Stringinline
c_str() (defined in doctest::String)doctest::Stringinline
capacity() const (defined in doctest::String)doctest::String
capacity() const (defined in doctest::String)doctest::String
compare(const char *other, bool no_case=false) const (defined in doctest::String)doctest::String
compare(const String &other, bool no_case=false) const (defined in doctest::String)doctest::String
compare(const char *other, bool no_case=false) const (defined in doctest::String)doctest::String
compare(const String &other, bool no_case=false) const (defined in doctest::String)doctest::String
data (defined in doctest::String)doctest::String
find(char ch, size_type pos=0) const (defined in doctest::String)doctest::String
find(char ch, size_type pos=0) const (defined in doctest::String)doctest::String
npos (defined in doctest::String)doctest::Stringstatic
operator+=(const String &other) (defined in doctest::String)doctest::String
operator+=(const String &other) (defined in doctest::String)doctest::String
operator<< (defined in doctest::String)doctest::Stringfriend
operator<< (defined in doctest::String)doctest::Stringfriend
operator=(const String &other) (defined in doctest::String)doctest::String
operator=(String &&other) noexcept (defined in doctest::String)doctest::String
operator=(const String &other) (defined in doctest::String)doctest::String
operator=(String &&other) noexcept (defined in doctest::String)doctest::String
operator[](size_type i) const (defined in doctest::String)doctest::String
operator[](size_type i) (defined in doctest::String)doctest::String
operator[](size_type i) const (defined in doctest::String)doctest::String
operator[](size_type i) (defined in doctest::String)doctest::String
rfind(char ch, size_type pos=npos) const (defined in doctest::String)doctest::String
rfind(char ch, size_type pos=npos) const (defined in doctest::String)doctest::String
size() const (defined in doctest::String)doctest::String
size() const (defined in doctest::String)doctest::String
size_type typedef (defined in doctest::String)doctest::String
size_type typedef (defined in doctest::String)doctest::String
String() noexcept (defined in doctest::String)doctest::String
String(const char *in) (defined in doctest::String)doctest::String
String(const char *in, size_type in_size) (defined in doctest::String)doctest::String
String(std::istream &in, size_type in_size) (defined in doctest::String)doctest::String
String(const String &other) (defined in doctest::String)doctest::String
String(String &&other) noexcept (defined in doctest::String)doctest::String
String() noexcept (defined in doctest::String)doctest::String
String(const char *in) (defined in doctest::String)doctest::String
String(const char *in, size_type in_size) (defined in doctest::String)doctest::String
String(std::istream &in, size_type in_size) (defined in doctest::String)doctest::String
String(const String &other) (defined in doctest::String)doctest::String
String(String &&other) noexcept (defined in doctest::String)doctest::String
substr(size_type pos, size_type cnt=npos) && (defined in doctest::String)doctest::String
substr(size_type pos, size_type cnt=npos) const & (defined in doctest::String)doctest::String
substr(size_type pos, size_type cnt=npos) && (defined in doctest::String)doctest::String
substr(size_type pos, size_type cnt=npos) const & (defined in doctest::String)doctest::String
~String() (defined in doctest::String)doctest::String
~String() (defined in doctest::String)doctest::String
+ + + + diff --git a/git-main/classdoctest_1_1String.html b/git-main/classdoctest_1_1String.html new file mode 100644 index 0000000..7aa3fca --- /dev/null +++ b/git-main/classdoctest_1_1String.html @@ -0,0 +1,258 @@ + + + + + + + + + enum_name: doctest::String Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::String Class Reference
+
+
+ + + + + + +

+Public Types

+using size_type = DOCTEST_CONFIG_STRING_SIZE_TYPE
 
+using size_type = DOCTEST_CONFIG_STRING_SIZE_TYPE
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

String (const char *in)
 
String (const char *in, size_type in_size)
 
String (std::istream &in, size_type in_size)
 
String (const String &other)
 
+Stringoperator= (const String &other)
 
+Stringoperator+= (const String &other)
 
String (String &&other) noexcept
 
+Stringoperator= (String &&other) noexcept
 
+char operator[] (size_type i) const
 
+char & operator[] (size_type i)
 
+const char * c_str () const
 
+char * c_str ()
 
+size_type size () const
 
+size_type capacity () const
 
+String substr (size_type pos, size_type cnt=npos) &&
 
+String substr (size_type pos, size_type cnt=npos) const &
 
+size_type find (char ch, size_type pos=0) const
 
+size_type rfind (char ch, size_type pos=npos) const
 
+int compare (const char *other, bool no_case=false) const
 
+int compare (const String &other, bool no_case=false) const
 
String (const char *in)
 
String (const char *in, size_type in_size)
 
String (std::istream &in, size_type in_size)
 
String (const String &other)
 
+Stringoperator= (const String &other)
 
+Stringoperator+= (const String &other)
 
String (String &&other) noexcept
 
+Stringoperator= (String &&other) noexcept
 
+char operator[] (size_type i) const
 
+char & operator[] (size_type i)
 
+const char * c_str () const
 
+char * c_str ()
 
+size_type size () const
 
+size_type capacity () const
 
+String substr (size_type pos, size_type cnt=npos) &&
 
+String substr (size_type pos, size_type cnt=npos) const &
 
+size_type find (char ch, size_type pos=0) const
 
+size_type rfind (char ch, size_type pos=npos) const
 
+int compare (const char *other, bool no_case=false) const
 
+int compare (const String &other, bool no_case=false) const
 
+ + + +

+Static Public Attributes

+static DOCTEST_CONSTEXPR size_type npos = static_cast<size_type>(-1)
 
+ + + + + +

+Friends

+DOCTEST_INTERFACE std::ostreamoperator<< (std::ostream &s, const String &in)
 
+DOCTEST_INTERFACE std::ostreamoperator<< (std::ostream &s, const String &in)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ContextScope-members.html b/git-main/classdoctest_1_1detail_1_1ContextScope-members.html new file mode 100644 index 0000000..8395553 --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1ContextScope-members.html @@ -0,0 +1,131 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::detail::ContextScope< L > Member List
+
+
+ +

This is the complete list of members for doctest::detail::ContextScope< L >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ContextScope(const L &lambda) (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlineexplicit
ContextScope(L &&lambda) (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlineexplicit
ContextScope(const ContextScope &)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
ContextScope(ContextScope &&) noexcept=default (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
ContextScope(const L &lambda) (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlineexplicit
ContextScope(L &&lambda) (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlineexplicit
ContextScope(const ContextScope &)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
ContextScope(ContextScope &&) noexcept=default (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
ContextScopeBase(const ContextScopeBase &)=delete (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
ContextScopeBase() (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
ContextScopeBase(ContextScopeBase &&other) noexcept (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
ContextScopeBase(const ContextScopeBase &)=delete (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
ContextScopeBase() (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
ContextScopeBase(ContextScopeBase &&other) noexcept (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
destroy() (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
destroy() (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
need_to_destroy (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBaseprotected
operator=(const ContextScope &)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
operator=(ContextScope &&)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
operator=(const ContextScope &)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
operator=(ContextScope &&)=delete (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >
operator=(const ContextScopeBase &)=delete (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
operator=(ContextScopeBase &&)=delete (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
stringify(std::ostream *s) const override (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlinevirtual
stringify(std::ostream *s) const override (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inlinevirtual
~ContextScope() override (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inline
~ContextScope() override (defined in doctest::detail::ContextScope< L >)doctest::detail::ContextScope< L >inline
~ContextScopeBase() override=default (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
~ContextScopeBase() override=default (defined in doctest::detail::ContextScopeBase)doctest::detail::ContextScopeBase
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ContextScope.html b/git-main/classdoctest_1_1detail_1_1ContextScope.html new file mode 100644 index 0000000..d97db9a --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1ContextScope.html @@ -0,0 +1,262 @@ + + + + + + + + + enum_name: doctest::detail::ContextScope< L > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::detail::ContextScope< L > Class Template Reference
+
+
+
+Inheritance diagram for doctest::detail::ContextScope< L >:
+
+
+ + +doctest::detail::ContextScopeBase +doctest::detail::ContextScopeBase +doctest::IContextScope +doctest::IContextScope +doctest::IContextScope +doctest::IContextScope + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ContextScope (const L &lambda)
 
ContextScope (L &&lambda)
 
ContextScope (const ContextScope &)=delete
 
ContextScope (ContextScope &&) noexcept=default
 
+ContextScopeoperator= (const ContextScope &)=delete
 
+ContextScopeoperator= (ContextScope &&)=delete
 
void stringify (std::ostream *s) const override
 
ContextScope (const L &lambda)
 
ContextScope (L &&lambda)
 
ContextScope (const ContextScope &)=delete
 
ContextScope (ContextScope &&) noexcept=default
 
+ContextScopeoperator= (const ContextScope &)=delete
 
+ContextScopeoperator= (ContextScope &&)=delete
 
void stringify (std::ostream *s) const override
 
- Public Member Functions inherited from doctest::detail::ContextScopeBase
ContextScopeBase (const ContextScopeBase &)=delete
 
+ContextScopeBaseoperator= (const ContextScopeBase &)=delete
 
+ContextScopeBaseoperator= (ContextScopeBase &&)=delete
 
ContextScopeBase (const ContextScopeBase &)=delete
 
+ContextScopeBaseoperator= (const ContextScopeBase &)=delete
 
+ContextScopeBaseoperator= (ContextScopeBase &&)=delete
 
+ + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from doctest::detail::ContextScopeBase
ContextScopeBase (ContextScopeBase &&other) noexcept
 
+void destroy ()
 
ContextScopeBase (ContextScopeBase &&other) noexcept
 
+void destroy ()
 
- Protected Attributes inherited from doctest::detail::ContextScopeBase
+bool need_to_destroy {true}
 
+

Member Function Documentation

+ +

◆ stringify() [1/2]

+ +
+
+
+template<typename L >
+ + + + + +
+ + + + + + + +
void doctest::detail::ContextScope< L >::stringify (std::ostream * s) const
+
+inlineoverridevirtual
+
+ +

Implements doctest::IContextScope.

+ +
+
+ +

◆ stringify() [2/2]

+ +
+
+
+template<typename L >
+ + + + + +
+ + + + + + + +
void doctest::detail::ContextScope< L >::stringify (std::ostream * s) const
+
+inlineoverridevirtual
+
+ +

Implements doctest::IContextScope.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ContextScope.png b/git-main/classdoctest_1_1detail_1_1ContextScope.png new file mode 100644 index 0000000000000000000000000000000000000000..23c83f1212c624ea4464a643ef60368c22c30759 GIT binary patch literal 2092 zcmb`IdsvcJ7{Do$HixtM*hSN7d$0&sv6))tW4WmdYbf4I&9LRAoR{YEk^&B~nK;+> z$-HC=(-73sw9OkTrc)y@wyBZg1@l6RM5xFmm3`vc{%Cvl&(0t3Ip@8d^S$ryIbWt1 z<`ZKh3nK^wVvIiS>J5Pyc!29`Zy12`IbXUAPTRds`nu_KI&k@HRvCZ2op}hg_tLgJ z{xh*y4C?KA{BMD_H!pi*d?4UnKOEK<_CX*U>(Q<*zDet3!y@nTW{dQ(j08WVDz)>i z2ahoAuuuh=I!(pBn98~B&t~}WYTx%vn~x31okX)(VF9`3ci~*0yY>ilaT>(~FuyRBM_Tj_R*RF#t_!~sza!iku3 z06x1LR>7iZcVl%0x#VJa;W#Ge zWNufqXreamOn6AYs)jgx5m?IHsL$ezrS;7@r++zeKxZFufUAA-{yW`|6K_~xn*H0z=-a8- zz~^=Ymzx5toLf4Hr7oNOu(+*CV_y5PLU$#gVI=hEV*pMYPZ2hOmpwqyHs{tS5q}Df zac>;ldNd{uk7tCn?7$N;2yLrhBR5r|_r(%+)^&DN3Q{ICU5!&t&C#;RYs`Qvy>UZs z2d+xAJw0&ETQ~<+336t;8^Qksums0F3Eb&`KobEQh|wxa+l3Nz&XFz zy6r``c5Q%KbA_ybF8)7sNQl_St99CFL(UBgC?-<^bHfVOspSLr?_seh0|C4OdLQO% z_6;vamHxJ$8Nbaov%&>su-R~Y4mqi@tU%`u`S!TTC5=?B&uQSJPXrCG7s-lElI#=M z!_PHet;f;tL2bR5YcWM@&hbY2^nH8R^8SCu9p_i+{%TLSev+I=15ELBDHZPN0t$m( zgf$m-&;$J;D%%_2AA4QZc61XX4`f%{HKmQKIULmA+`IyWcCdFW z_Haiv5hYak$5>|MrjsB4jYRkvGB9DY+8+b3Kd_Tve{6pRTh{h(DuD$9e8wb@;(T!0 zv(5-#U}d)LrlX;rM6evZm{S=cc<^XF#6GC~)hm7PZY%!F0rshkWX|$gqZ+e@^WVll zgY?M%mvJ_M9XudQV2_d38xqrr@m}<{j)NZmvlL&^4^#Rv5^XAsGb*R0xxZ<&WRz`c zhIoN`T~;E7Z_T_yS*6m7C-P($MR$Y3n)d_3qP)ixJvpoL+m8N^d)U zvy~?#j5WAeI#87~RX4L&I^#Exd@3+(MjaJ|PZs>h^cyQ9&OZiEhdofR@wzq>-1OAw z)NB}sV@X4>@ftnD1&u^ancDm3?B9_Q;O*3#_hSc%lT7@b*r8kF7^SRg0qbP)!RgM4 zjvsG7O<>yun?enZmJX(7{VtNv1mU7B3SD2iQ)Q5GShP2-p#!blIP>;mCu zF27}$orjk=@AMt5948wSIW48=Zg~F1@RyEtMR!c&9*za&bSNucoZ&P!W(s62t99Oz z*vefda&&}Nr@OD!y~F(?*bt6u=>|jMRnTgdl>fTS0|$tyQ + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::detail::ErrnoGuard Member List
+
+
+ +

This is the complete list of members for doctest::detail::ErrnoGuard, including all inherited members.

+ + + +
ErrnoGuard() (defined in doctest::detail::ErrnoGuard)doctest::detail::ErrnoGuardinline
~ErrnoGuard() (defined in doctest::detail::ErrnoGuard)doctest::detail::ErrnoGuardinline
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ErrnoGuard.html b/git-main/classdoctest_1_1detail_1_1ErrnoGuard.html new file mode 100644 index 0000000..b91dea8 --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1ErrnoGuard.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: doctest::detail::ErrnoGuard Class Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::detail::ErrnoGuard Class Reference
+
+
+
The documentation for this class was generated from the following file:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts/doctest.cpp
  • +
+
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ExceptionTranslator-members.html b/git-main/classdoctest_1_1detail_1_1ExceptionTranslator-members.html new file mode 100644 index 0000000..fddd96f --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1ExceptionTranslator-members.html @@ -0,0 +1,106 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::detail::ExceptionTranslator< T > Member List
+
+
+ +

This is the complete list of members for doctest::detail::ExceptionTranslator< T >, including all inherited members.

+ + + + + +
ExceptionTranslator(String(*translateFunction)(T)) (defined in doctest::detail::ExceptionTranslator< T >)doctest::detail::ExceptionTranslator< T >inlineexplicit
ExceptionTranslator(String(*translateFunction)(T)) (defined in doctest::detail::ExceptionTranslator< T >)doctest::detail::ExceptionTranslator< T >inlineexplicit
translate(String &res) const override (defined in doctest::detail::ExceptionTranslator< T >)doctest::detail::ExceptionTranslator< T >inlinevirtual
translate(String &res) const override (defined in doctest::detail::ExceptionTranslator< T >)doctest::detail::ExceptionTranslator< T >inlinevirtual
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ExceptionTranslator.html b/git-main/classdoctest_1_1detail_1_1ExceptionTranslator.html new file mode 100644 index 0000000..7aae265 --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1ExceptionTranslator.html @@ -0,0 +1,197 @@ + + + + + + + + + enum_name: doctest::detail::ExceptionTranslator< T > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::detail::ExceptionTranslator< T > Class Template Reference
+
+
+ +

OCLINT destructor of virtual class. + More...

+ +

#include <doctest.h>

+
+Inheritance diagram for doctest::detail::ExceptionTranslator< T >:
+
+
+ + +doctest::detail::IExceptionTranslator +doctest::detail::IExceptionTranslator + +
+ + + + + + + + + + +

+Public Member Functions

ExceptionTranslator (String(*translateFunction)(T))
 
bool translate (String &res) const override
 
ExceptionTranslator (String(*translateFunction)(T))
 
bool translate (String &res) const override
 
+

Detailed Description

+
template<typename T>
+class doctest::detail::ExceptionTranslator< T >

OCLINT destructor of virtual class.

+

Member Function Documentation

+ +

◆ translate() [1/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + +
bool doctest::detail::ExceptionTranslator< T >::translate (String & res) const
+
+inlineoverridevirtual
+
+
+ +

◆ translate() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + +
bool doctest::detail::ExceptionTranslator< T >::translate (String & res) const
+
+inlineoverridevirtual
+
+
+
The documentation for this class was generated from the following files:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h
  • +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts/doctest_fwd.h
  • +
+
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1ExceptionTranslator.png b/git-main/classdoctest_1_1detail_1_1ExceptionTranslator.png new file mode 100644 index 0000000000000000000000000000000000000000..8114a718da61b1c43af87ed5f6ee0ef1f7b89b32 GIT binary patch literal 1117 zcmeAS@N?(olHy`uVBq!ia0y~yV0;2(2XHV0$^S9mWPp@(fKQ0)|NsAi%olIImi8Z7 zZegHVATj;Siw6%L0L4wuhAjcgah3%61v3EoU|`NP`w9aC^9xTG$B+ufw{u_Ttu_!~ zYvtWxTv6*w zvC}3MOLZ9IxyvU7&E2P(-c;6~c(<+n`rj|=p1zmlvM+{izjbC($iu#r>52anw!Cy! z<@3~9VZQT^(|+$y`aHYk-WK!j{iTa{4Z(3!B>Aie1_tL^=%d)rE-rAYd zowVvy_O(bY{RrN_L7T2`Sbfp&?zF~B^WWr6`1U$(v&x60H;!KGOU{_yDtmqS%y>;rh8h7qF znPRz>F0+^Hti7=0a&N}wYmxVU1)i+8eWS1c^3?6^;dQ#V);!y=$$znK_N_|qNqm3K z`~AC|`2YIDD;c#?Z-ox@9)78HYx7~xNqjZeXa0G9Xr0^dS+ytGy|+bdIuf>F>&^FF zY1wb<&RS;iD#%;Q7HO}3w)U@gYGt-$l5FTCz8KFk=`!0W&noq=+b1u1|0HOW%HGN4 zt+JC;Uplv>c>an51@rUkp3|1hhX*#C@m#Y~=J-Z&p_7j-`t~w>V3cF{dolcmqT~Vd ze)s9qesfu?F#mWanbQwp?pS_0=WaAe+L93NKmPclG6Um*^Fs1cgjHiV?LjWjVS^H8 zhkl;4w7CM4&Yqbgj84qIf8flf)jB8UeQ$r0S1qy3-gvWG=I1rnJ-6T5k~S@Nt)tVY zat}ZGyd@n~lTWu6E|1;1sruyk*8jU=%?^Co{D1bU>$f+RUedXJ@}$4jxjT7pH=nnh zo-4b2)to>vLv>=l?wL zvLZUtH1<8Wiud)?0 + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest::detail::MultiLaneAtomic< T > Member List
+
+
+ +

This is the complete list of members for doctest::detail::MultiLaneAtomic< T >, including all inherited members.

+ + + + + + + + + +
fetch_add(T arg, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
fetch_sub(T arg, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
load(std::memory_order order=std::memory_order_seq_cst) const DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
operator T() const DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
operator++() DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
operator++(int) DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
operator=(T desired) DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
store(T desired, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT (defined in doctest::detail::MultiLaneAtomic< T >)doctest::detail::MultiLaneAtomic< T >inline
+ + + + diff --git a/git-main/classdoctest_1_1detail_1_1MultiLaneAtomic.html b/git-main/classdoctest_1_1detail_1_1MultiLaneAtomic.html new file mode 100644 index 0000000..051ea4c --- /dev/null +++ b/git-main/classdoctest_1_1detail_1_1MultiLaneAtomic.html @@ -0,0 +1,133 @@ + + + + + + + + + enum_name: doctest::detail::MultiLaneAtomic< T > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+ +
doctest::detail::MultiLaneAtomic< T > Class Template Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+T operator++ () DOCTEST_NOEXCEPT
 
+T operator++ (int) DOCTEST_NOEXCEPT
 
+T fetch_add (T arg, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT
 
+T fetch_sub (T arg, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT
 
operator T () const DOCTEST_NOEXCEPT
 
+T load (std::memory_order order=std::memory_order_seq_cst) const DOCTEST_NOEXCEPT
 
+T operator= (T desired) DOCTEST_NOEXCEPT
 
+void store (T desired, std::memory_order order=std::memory_order_seq_cst) DOCTEST_NOEXCEPT
 
+
The documentation for this class was generated from the following file:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts/doctest.cpp
  • +
+
+ + + + diff --git a/git-main/classes.html b/git-main/classes.html index f67e33c..f1fc425 100644 --- a/git-main/classes.html +++ b/git-main/classes.html @@ -86,32 +86,62 @@
Class Index
-
B | C | E | H | I | N | O | P
+
A | B | C | D | E | F | H | I | L | M | N | O | P | Q | R | S | T | U
-
B
-
bad_optional_access (mgutility)
basic_string_view (mgutility)
+
A
+
A (N)
Approx (doctest)
AssertData (doctest)
+
B
+
B (N)
bad_optional_access (mgutility)
basic_istream (std)
basic_ostream (std)
basic_string_view (mgutility)
+
C
-
custom_enum (mgutility)
custom_enum< Position > (mgutility)
+
C (N)
char_traits (std)
Contains (doctest)
Context (doctest)
ContextOptions (doctest)
ContextScope (doctest::detail)
ContextScopeBase (doctest::detail)
ContextState (doctest::detail)
CurrentTestCaseStats (doctest)
custom_enum (mgutility)
custom_enum< Position > (mgutility)
+
+
D
+
deferred_false (doctest::detail)
E
-
enum_for_each (mgutility)
enum_range (mgutility)
enum_range< color > (mgutility)
enum_range< Position > (mgutility)
enum_sequence (mgutility::detail)
enum_sequence_helper (mgutility::detail)
enum_sequence_helper< Enum, Min, Min, Next... > (mgutility::detail)
enum_type (mgutility::detail)
+
enable_if (doctest::detail::types)
enable_if< true, T > (doctest::detail::types)
enum_for_each (mgutility)
enum_range (mgutility)
enum_range< color > (mgutility)
enum_range< Position > (mgutility)
enum_sequence (mgutility::detail)
enum_sequence_helper (mgutility::detail)
enum_sequence_helper< Enum, Min, Min, Next... > (mgutility::detail)
enum_type (mgutility::detail)
ErrnoGuard (doctest::detail)
ExceptionTranslator (doctest::detail)
Expression_lhs (doctest::detail)
ExpressionDecomposer (doctest::detail)
-
H
-
has_bit_or (mgutility::detail)
has_bit_or< T, decltype((T{}|T{}), void())> (mgutility::detail)
+
F
+
false_type (doctest::detail::types)
filldata (doctest::detail)
filldata< const char[N]> (doctest::detail)
filldata< const void * > (doctest::detail)
filldata< T * > (doctest::detail)
filldata< T[N]> (doctest::detail)
Foo (App)
Foo (Bar)
+
H
+
has_bit_or (mgutility::detail)
has_bit_or< T, decltype((T{}|T{}), void())> (mgutility::detail)
has_insertion_operator (doctest::detail)
has_insertion_operator< T, decltype(operator<<(declval< std::ostream & >(), declval< const T & >()), void())> (doctest::detail)
+
I
-
is_scoped_enum (mgutility::detail)
+
IContextScope (doctest)
IExceptionTranslator (doctest::detail)
int_holder
int_pointer
IReporter (doctest)
is_array (doctest::detail::types)
is_array< T[SIZE]> (doctest::detail::types)
is_enum (doctest::detail::types)
is_pointer (doctest::detail::types)
is_pointer< T * > (doctest::detail::types)
is_rvalue_reference (doctest::detail::types)
is_rvalue_reference< T && > (doctest::detail::types)
is_scoped_enum (mgutility::detail)
IsNaN (doctest)
ITranslator
+
+
L
+
label (user1)
label (user2)
label (user3)
label (user4)
label (user5)
label (user6)
label (user7)
label (user8)
label (user9a)
label (user9b)
+
M
+
MessageBuilder (doctest::detail)
MessageData (doctest)
MoveOnly
mpi_sub_comm (doctest)
MultiLaneAtomic (doctest::detail)
MyOtherType (Bar)
MyType
MyTypeInherited
MyXmlReporter
+
N
nullopt_t (mgutility)
-
+
O
optional (mgutility)
-
+
P
pair (mgutility)
+
+
Q
+
QueryData (doctest)
+
+
R
+
RelationalComparator (doctest::detail)
remove_const (doctest::detail::types)
remove_const< const T > (doctest::detail::types)
remove_reference (doctest::detail::types)
remove_reference< T & > (doctest::detail::types)
remove_reference< T && > (doctest::detail::types)
Result (doctest::detail)
ResultBuilder (doctest::detail)
+
+
S
+
should_stringify_as_underlying_type (doctest::detail)
SomeFixture
String (doctest)
AssertData::StringContains (doctest)
StringMaker (doctest)
StringMaker< std::list< T > > (doctest)
StringMakerBase (doctest::detail)
StringMakerBase< true > (doctest::detail)
Subcase (doctest::detail)
Subcase
SubcaseSignature (doctest)
+
+
T
+
TestCase (doctest::detail)
TestCaseData (doctest)
TestCaseException (doctest)
TestFailureException (doctest::detail)
TestRunStats (doctest)
TestSuite (doctest::detail)
Timer (doctest::detail)
Translator
true_type (doctest::detail::types)
tuple (std)
TypePair
+
+
U
+
underlying_type (doctest::detail::types)
diff --git a/git-main/classmgutility_1_1basic__string__view.html b/git-main/classmgutility_1_1basic__string__view.html index d4194f8..9adf802 100644 --- a/git-main/classmgutility_1_1basic__string__view.html +++ b/git-main/classmgutility_1_1basic__string__view.html @@ -104,90 +104,90 @@

Public Member Functions

-constexpr basic_string_view () noexcept +constexpr basic_string_view () noexcept  Default constructor.
  -constexpr basic_string_view (const Char *str) noexcept +constexpr basic_string_view (const Char *str) noexcept  Constructs a basic_string_view from a C-string.
  -constexpr basic_string_view (const std::basic_string< Char > &str) noexcept +constexpr basic_string_view (const std::basic_string< Char > &str) noexcept  Constructs a basic_string_view from a std::string.
  -constexpr basic_string_view (const Char *str, size_t len) noexcept +constexpr basic_string_view (const Char *str, size_t len) noexcept  Constructs a basic_string_view from a C-string and length.
  -constexpr basic_string_view (const basic_string_view &other) +constexpr basic_string_view (const basic_string_view &other)  Copy constructor.
  -constexpr basic_string_view (basic_string_view &&other) noexcept +constexpr basic_string_view (basic_string_view &&other) noexcept  Move constructor.
  -MGUTILITY_CNSTXPR basic_string_view< Char > & operator= (const basic_string_view &other) noexcept +MGUTILITY_CNSTXPR basic_string_view< Char > & operator= (const basic_string_view &other) noexcept  Copy assignment operator.
  -MGUTILITY_CNSTXPR basic_string_view< Char > & operator= (basic_string_view &&other) noexcept +MGUTILITY_CNSTXPR basic_string_view< Char > & operator= (basic_string_view &&other) noexcept  Move assignment operator.
  -constexpr const Char operator[] (size_t index) const noexcept +constexpr const Char operator[] (size_t index) const noexcept  Accesses the character at the given index.
  -constexpr const Charbegin () const noexcept +constexpr const Char * begin () const noexcept  Returns an iterator to the beginning of the string.
  -constexpr const Charend () const noexcept +constexpr const Char * end () const noexcept  Returns an iterator to the end of the string.
  -constexpr bool empty () const noexcept +constexpr bool empty () const noexcept  Checks if the string is empty.
  -constexpr size_t size () const noexcept +constexpr size_t size () const noexcept  Returns the size of the string.
  -constexpr const Chardata () const noexcept +constexpr const Char * data () const noexcept  Returns a pointer to the underlying data.
  -constexpr basic_string_view< Charsubstr (size_t begin, size_t len=0U) const noexcept +constexpr basic_string_view< Char > substr (size_t begin, size_t len=0U) const noexcept  Returns a substring view.
  -constexpr size_t rfind (Char c, size_t pos=npos) const noexcept +constexpr size_t rfind (Char c, size_t pos=npos) const noexcept  Finds the last occurrence of a character.
  -constexpr size_t find (Char c, size_t pos=0) const noexcept +constexpr size_t find (Char c, size_t pos=0) const noexcept  Finds the first occurrence of a character.
   operator std::string ()  Converts the string view to an std::string.
  - operator std::string () constoperator std::string () const  Converts the string view to an std::string (const version).
  +static constexpr auto 

Static Public Attributes

-static constexpr auto npos = -1
npos = -1
 
- + - + - + - + - +

Friends

constexpr friend bool operator== (basic_string_view< Char > lhs, basic_string_view< Char > rhs) noexcept
constexpr friend bool operator== (basic_string_view< Char > lhs, basic_string_view< Char > rhs) noexcept
 Equality operator.
 
constexpr friend bool operator== (basic_string_view< Char > lhs, const Char *rhs) noexcept
constexpr friend bool operator== (basic_string_view< Char > lhs, const Char *rhs) noexcept
 Equality operator.
 
constexpr friend bool operator!= (basic_string_view< Char > lhs, basic_string_view< Char > rhs) noexcept
constexpr friend bool operator!= (basic_string_view< Char > lhs, basic_string_view< Char > rhs) noexcept
 Inequality operator.
 
constexpr friend bool operator!= (basic_string_view< Char > lhs, const Char *rhs) noexcept
constexpr friend bool operator!= (basic_string_view< Char > lhs, const Char *rhs) noexcept
 Inequality operator.
 
std::ostream & operator<< (std::ostream &os, const basic_string_view< Char > &sv)
std::ostreamoperator<< (std::ostream &os, const basic_string_view< Char > &sv)
 Stream insertion operator.
 

Detailed Description

-
template<typename Char = char>
+
template<typename Char = char>
class mgutility::basic_string_view< Char >

A basic string view class template.

Template Parameters
@@ -202,15 +202,15 @@

+template<typename Char = char>

- + - +
constexpr mgutility::basic_string_view< Char >::basic_string_view constexpr mgutility::basic_string_view< Char >::basic_string_view (const Char * str)const Char * str)
@@ -237,15 +237,15 @@

+template<typename Char = char>
- + - +
constexpr mgutility::basic_string_view< Char >::basic_string_view constexpr mgutility::basic_string_view< Char >::basic_string_view (const std::basic_string< Char > & str)const std::basic_string< Char > & str)
@@ -272,20 +272,20 @@

+template<typename Char = char>
@@ -312,15 +312,15 @@

+template<typename Char = char>

- + - + - +
constexpr mgutility::basic_string_view< Char >::basic_string_view constexpr mgutility::basic_string_view< Char >::basic_string_view (const Char * str, const Char * str,
size_t len )size_t len )
- + - +
constexpr mgutility::basic_string_view< Char >::basic_string_view constexpr mgutility::basic_string_view< Char >::basic_string_view (const basic_string_view< Char > & other)const basic_string_view< Char > & other)
@@ -347,15 +347,15 @@

+template<typename Char = char>
- + - +
constexpr mgutility::basic_string_view< Char >::basic_string_view constexpr mgutility::basic_string_view< Char >::basic_string_view (basic_string_view< Char > && other)basic_string_view< Char > && other)
@@ -383,13 +383,13 @@

+template<typename Char = char>
- + @@ -413,13 +413,13 @@

+template<typename Char = char>

constexpr const Char * mgutility::basic_string_view< Char >::begin constexpr const Char * mgutility::basic_string_view< Char >::begin ( ) const
- + @@ -443,13 +443,13 @@

+template<typename Char = char>

constexpr const Char * mgutility::basic_string_view< Char >::data constexpr const Char * mgutility::basic_string_view< Char >::data ( ) const
- + @@ -473,13 +473,13 @@

+template<typename Char = char>

constexpr bool mgutility::basic_string_view< Char >::empty constexpr bool mgutility::basic_string_view< Char >::empty ( ) const
- + @@ -503,20 +503,20 @@

+template<typename Char = char>

constexpr const Char * mgutility::basic_string_view< Char >::end constexpr const Char * mgutility::basic_string_view< Char >::end ( ) const
@@ -544,13 +544,13 @@

+template<typename Char = char>

- + - + - +
constexpr size_t mgutility::basic_string_view< Char >::find constexpr size_t mgutility::basic_string_view< Char >::find (Char c, Char c,
size_t pos = 0 ) constsize_t pos = 0 ) const
- + @@ -574,13 +574,13 @@

+template<typename Char = char>

mgutility::basic_string_view< Char >::operator std::string mgutility::basic_string_view< Char >::operator std::string ( )
- + @@ -604,15 +604,15 @@

+template<typename Char = char>

mgutility::basic_string_view< Char >::operator std::string mgutility::basic_string_view< Char >::operator std::string ( ) const
- + - +
MGUTILITY_CNSTXPR basic_string_view< Char > & mgutility::basic_string_view< Char >::operator= MGUTILITY_CNSTXPR basic_string_view< Char > & mgutility::basic_string_view< Char >::operator= (basic_string_view< Char > && other)basic_string_view< Char > && other)
@@ -640,15 +640,15 @@

+template<typename Char = char>
- + - +
MGUTILITY_CNSTXPR basic_string_view< Char > & mgutility::basic_string_view< Char >::operator= MGUTILITY_CNSTXPR basic_string_view< Char > & mgutility::basic_string_view< Char >::operator= (const basic_string_view< Char > & other)const basic_string_view< Char > & other)
@@ -676,15 +676,15 @@

+template<typename Char = char>
- + - +
constexpr const Char mgutility::basic_string_view< Char >::operator[] constexpr const Char mgutility::basic_string_view< Char >::operator[] (size_t index)size_t index) const
@@ -712,20 +712,20 @@

+template<typename Char = char>
@@ -753,13 +753,13 @@

+template<typename Char = char>

- + - + - +
constexpr size_t mgutility::basic_string_view< Char >::rfind constexpr size_t mgutility::basic_string_view< Char >::rfind (Char c, Char c,
size_t pos = npos ) constsize_t pos = npos ) const
- + @@ -783,20 +783,20 @@

+template<typename Char = char>

constexpr size_t mgutility::basic_string_view< Char >::size constexpr size_t mgutility::basic_string_view< Char >::size ( ) const
@@ -825,20 +825,20 @@

+template<typename Char = char>

- + - + - +
constexpr basic_string_view< Char > mgutility::basic_string_view< Char >::substr constexpr basic_string_view< Char > mgutility::basic_string_view< Char >::substr (size_t begin, size_t begin,
size_t len = 0U ) constsize_t len = 0U ) const
@@ -866,20 +866,20 @@

+template<typename Char = char>

- + - + - +
constexpr friend bool operator!= constexpr friend bool operator!= (basic_string_view< Char > lhs, basic_string_view< Char > lhs,
basic_string_view< Char > rhs )basic_string_view< Char > rhs )
@@ -907,20 +907,20 @@

+template<typename Char = char>

- + - + - +
constexpr friend bool operator!= constexpr friend bool operator!= (basic_string_view< Char > lhs, basic_string_view< Char > lhs,
const Char * rhs )const Char * rhs )
@@ -948,20 +948,20 @@

+template<typename Char = char>

- + - + - +
std::ostream & operator<< std::ostream & operator<< (std::ostream & os, std::ostream & os,
const basic_string_view< Char > & sv )const basic_string_view< Char > & sv )
@@ -989,20 +989,20 @@

+template<typename Char = char>

- + - + - +
constexpr friend bool operator== constexpr friend bool operator== (basic_string_view< Char > lhs, basic_string_view< Char > lhs,
basic_string_view< Char > rhs )basic_string_view< Char > rhs )
diff --git a/git-main/classmgutility_1_1enum__for__each.html b/git-main/classmgutility_1_1enum__for__each.html index dd4fcb8..017c0ca 100644 --- a/git-main/classmgutility_1_1enum__for__each.html +++ b/git-main/classmgutility_1_1enum__for__each.html @@ -102,21 +102,21 @@ +  - + - + - +
- + - + - +
constexpr friend bool operator== constexpr friend bool operator== (basic_string_view< Char > lhs, basic_string_view< Char > lhs,
const Char * rhs )const Char * rhs )

Public Member Functions

enum_for_each ()=default
enum_for_each ()=default
 Default constructor.
 
auto begin () -> enum_iter &
auto begin () -> enum_iter &
 Returns an iterator to the beginning of the enum range.
 
auto end () -> enum_iter &
auto end () -> enum_iter &
 Returns an iterator to the end of the enum range.
 
auto size () -> std::size_t
auto size () -> std::size_t
 Returns the size of the enum range.
 

Detailed Description

-
template<typename Enum>
+
template<typename Enum>
class mgutility::enum_for_each< Enum >

A class template for iterating over enum values.

Template Parameters
@@ -131,13 +131,13 @@

+template<typename Enum >

- + @@ -161,13 +161,13 @@

+template<typename Enum >

auto mgutility::enum_for_each< Enum >::begin auto mgutility::enum_for_each< Enum >::begin ( ) -> enum_iter &
- + @@ -191,13 +191,13 @@

+template<typename Enum >

auto mgutility::enum_for_each< Enum >::end auto mgutility::enum_for_each< Enum >::end ( ) -> enum_iter &
- + diff --git a/git-main/classmgutility_1_1optional.html b/git-main/classmgutility_1_1optional.html index 0843826..2b42a9f 100644 --- a/git-main/classmgutility_1_1optional.html +++ b/git-main/classmgutility_1_1optional.html @@ -102,89 +102,89 @@ +MGUTILITY_CNSTXPR  +MGUTILITY_CNSTXPR  - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +template<typename U = T, detail::enable_if_t<!std::is_destructible< U >::value, bool > = true> + - +template<typename U = T, detail::enable_if_t< std::is_destructible< T >::value, bool > = true> + - +
auto mgutility::enum_for_each< Enum >::size auto mgutility::enum_for_each< Enum >::size ( ) -> std::size_t

Public Member Functions

-MGUTILITY_CNSTXPR optional (nullopt_t &)
optional (nullopt_t &)
 Constructs an empty optional.
 
-MGUTILITY_CNSTXPR optional ()
optional ()
 Constructs an empty optional.
 
template<typename... Args>
MGUTILITY_CNSTXPR optional (Args &&...args)
MGUTILITY_CNSTXPR optional (Args &&...args)
 Constructs an optional with a value.
 
MGUTILITY_CNSTXPR optional (T &&value)
MGUTILITY_CNSTXPR optional (T &&value)
 Constructs an optional with a value.
 
MGUTILITY_CNSTXPR optional (const optional &other)
MGUTILITY_CNSTXPR optional (const optional &other)
 Copy constructor.
 
MGUTILITY_CNSTXPR optional (optional &&other)
MGUTILITY_CNSTXPR optional (optional &&other)
 Move constructor.
 
 ~optional ()
 Destructor.
 
MGUTILITY_CNSTXPR optionaloperator= (const optional &other)
MGUTILITY_CNSTXPR optionaloperator= (const optional &other)
 Copy assignment operator.
 
MGUTILITY_CNSTXPR optionaloperator= (optional &&other)
MGUTILITY_CNSTXPR optionaloperator= (optional &&other)
 Move assignment operator.
 
MGUTILITY_CNSTXPR void swap (optional &&other)
MGUTILITY_CNSTXPR void swap (optional &&other)
 Swaps the contents of this optional with another.
 
MGUTILITY_CNSTXPR Toperator* ()
MGUTILITY_CNSTXPR T & operator* ()
 Dereferences the stored value.
 
MGUTILITY_CNSTXPR Toperator* () const
MGUTILITY_CNSTXPR T & operator* () const
 Dereferences the stored value (const version).
 
MGUTILITY_CNSTXPR Tvalue ()
MGUTILITY_CNSTXPR T & value ()
 Accesses the stored value.
 
MGUTILITY_CNSTXPR Tvalue () const
MGUTILITY_CNSTXPR T & value () const
 Accesses the stored value (const version).
 
MGUTILITY_CNSTXPR T value_or (T &&value)
MGUTILITY_CNSTXPR T value_or (T &&value)
 Returns the stored value or a default value if empty.
 
MGUTILITY_CNSTXPR T value_or (T &&value) const
MGUTILITY_CNSTXPR T value_or (T &&value) const
 Returns the stored value or a default value if empty (const version).
 
MGUTILITY_CNSTXPR T value_or (const T &value)
MGUTILITY_CNSTXPR T value_or (const T &value)
 Returns the stored value or a default value if empty.
 
MGUTILITY_CNSTXPR T value_or (const T &value) const
MGUTILITY_CNSTXPR T value_or (const T &value) const
 Returns the stored value or a default value if empty (const version).
 
MGUTILITY_CNSTXPR void emplace (T value)
MGUTILITY_CNSTXPR void emplace (T value)
 Constructs the value in-place.
 
template<typename... Args>
MGUTILITY_CNSTXPR void emplace (Args &&...args)
MGUTILITY_CNSTXPR void emplace (Args &&...args)
 Constructs the value in-place with arguments.
 
MGUTILITY_CNSTXPR bool has_value () const
MGUTILITY_CNSTXPR bool has_value () const
 Checks if the optional has a value.
 
-template<typename U = T, detail::enable_if_t<!std::is_destructible< U >::value, bool > = true>
MGUTILITY_CNSTXPR void reset ()
MGUTILITY_CNSTXPR void reset ()
 Resets the optional, making it empty.
 
-template<typename U = T, detail::enable_if_t< std::is_destructible< T >::value, bool > = true>
MGUTILITY_CNSTXPR void reset ()
MGUTILITY_CNSTXPR void reset ()
 Resets the optional, making it empty.
 
MGUTILITY_CNSTXPR operator bool ()
MGUTILITY_CNSTXPR operator bool ()
 Checks if the optional has a value.
 

Detailed Description

-
template<typename T>
+
template<typename T>
class mgutility::optional< T >

A class template that provides optional (nullable) objects.

Template Parameters
@@ -199,7 +199,7 @@

+template<typename T >
template<typename... Args>

@@ -207,9 +207,9 @@

- + - +
MGUTILITY_CNSTXPR mgutility::optional< T >::optional MGUTILITY_CNSTXPR mgutility::optional< T >::optional (Args &&... args)Args &&... args)
@@ -242,15 +242,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR mgutility::optional< T >::optional MGUTILITY_CNSTXPR mgutility::optional< T >::optional (T && value)T && value)
@@ -277,15 +277,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR mgutility::optional< T >::optional MGUTILITY_CNSTXPR mgutility::optional< T >::optional (const optional< T > & other)const optional< T > & other)
@@ -312,15 +312,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR mgutility::optional< T >::optional MGUTILITY_CNSTXPR mgutility::optional< T >::optional (optional< T > && other)optional< T > && other)
@@ -348,7 +348,7 @@

+template<typename T >
template<typename... Args>
@@ -356,9 +356,9 @@

- + - +
MGUTILITY_CNSTXPR void mgutility::optional< T >::emplace MGUTILITY_CNSTXPR void mgutility::optional< T >::emplace (Args &&... args)Args &&... args)
@@ -391,15 +391,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR void mgutility::optional< T >::emplace MGUTILITY_CNSTXPR void mgutility::optional< T >::emplace (T value)T value)
@@ -426,13 +426,13 @@

+template<typename T >
- + @@ -456,13 +456,13 @@

+template<typename T >

MGUTILITY_CNSTXPR bool mgutility::optional< T >::has_value MGUTILITY_CNSTXPR bool mgutility::optional< T >::has_value ( ) const
- + @@ -486,13 +486,13 @@

+template<typename T >

MGUTILITY_CNSTXPR mgutility::optional< T >::operator bool MGUTILITY_CNSTXPR mgutility::optional< T >::operator bool ( )
- + @@ -516,13 +516,13 @@

+template<typename T >

MGUTILITY_CNSTXPR T & mgutility::optional< T >::operator* MGUTILITY_CNSTXPR T & mgutility::optional< T >::operator* ( )
- + @@ -546,15 +546,15 @@

+template<typename T >

MGUTILITY_CNSTXPR T & mgutility::optional< T >::operator* MGUTILITY_CNSTXPR T & mgutility::optional< T >::operator* ( ) const
- + - +
MGUTILITY_CNSTXPR optional & mgutility::optional< T >::operator= MGUTILITY_CNSTXPR optional & mgutility::optional< T >::operator= (const optional< T > & other)const optional< T > & other)
@@ -582,15 +582,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR optional & mgutility::optional< T >::operator= MGUTILITY_CNSTXPR optional & mgutility::optional< T >::operator= (optional< T > && other)optional< T > && other)
@@ -618,15 +618,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR void mgutility::optional< T >::swap MGUTILITY_CNSTXPR void mgutility::optional< T >::swap (optional< T > && other)optional< T > && other)
@@ -653,13 +653,13 @@

+template<typename T >
- + @@ -689,13 +689,13 @@

+template<typename T >

MGUTILITY_CNSTXPR T & mgutility::optional< T >::value MGUTILITY_CNSTXPR T & mgutility::optional< T >::value ( )
- + @@ -725,15 +725,15 @@

+template<typename T >

MGUTILITY_CNSTXPR T & mgutility::optional< T >::value MGUTILITY_CNSTXPR T & mgutility::optional< T >::value ( ) const
- + - +
MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or (const T & value)const T & value)
@@ -761,15 +761,15 @@

+template<typename T >
- + - +
MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or (const T & value)const T & value) const
@@ -797,15 +797,15 @@

+template<typename T >
diff --git a/git-main/structmgutility_1_1detail_1_1enum__sequence.html b/git-main/structmgutility_1_1detail_1_1enum__sequence.html index 05aeca2..b825465 100644 --- a/git-main/structmgutility_1_1detail_1_1enum__sequence.html +++ b/git-main/structmgutility_1_1detail_1_1enum__sequence.html @@ -96,7 +96,7 @@

#include <meta.hpp>

Detailed Description

-
template<typename Enum, Enum...>
+
template<typename Enum, Enum...>
struct mgutility::detail::enum_sequence< Enum,... >

Represents a sequence of enumeration values.

Template Parameters
- + - +
MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or (T && value)T && value)
@@ -833,15 +833,15 @@

+template<typename T >
- +template<typename T > + +using 
- + - +
MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or MGUTILITY_CNSTXPR T mgutility::optional< T >::value_or (T && value)T && value) const
diff --git a/git-main/classstd_1_1basic__istream.html b/git-main/classstd_1_1basic__istream.html new file mode 100644 index 0000000..0df48af --- /dev/null +++ b/git-main/classstd_1_1basic__istream.html @@ -0,0 +1,102 @@ + + + + + + + + + enum_name: std::basic_istream< charT, traits > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
std::basic_istream< charT, traits > Class Template Reference
+
+
+
The documentation for this class was generated from the following file:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h
  • +
+
+ + + + diff --git a/git-main/classstd_1_1basic__ostream.html b/git-main/classstd_1_1basic__ostream.html new file mode 100644 index 0000000..ac3cf2b --- /dev/null +++ b/git-main/classstd_1_1basic__ostream.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: std::basic_ostream< charT, traits > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
std::basic_ostream< charT, traits > Class Template Reference
+
+
+ +

Inherited by doctest::DiscardOStream.

+
The documentation for this class was generated from the following file:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h
  • +
+
+ + + + diff --git a/git-main/classstd_1_1tuple.html b/git-main/classstd_1_1tuple.html new file mode 100644 index 0000000..abe3076 --- /dev/null +++ b/git-main/classstd_1_1tuple.html @@ -0,0 +1,102 @@ + + + + + + + + + enum_name: std::tuple< Types > Class Template Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
std::tuple< Types > Class Template Reference
+
+
+
The documentation for this class was generated from the following file:
    +
  • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h
  • +
+
+ + + + diff --git a/git-main/dir_12250f07495b82a5468dcd73f04130d2.html b/git-main/dir_12250f07495b82a5468dcd73f04130d2.html new file mode 100644 index 0000000..733f546 --- /dev/null +++ b/git-main/dir_12250f07495b82a5468dcd73f04130d2.html @@ -0,0 +1,111 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/extensions Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
extensions Directory Reference
+
+
+ + + + + + + + + + +

+Files

 doctest_mpi.h
 
 doctest_util.h
 
 mpi_reporter.h
 
 mpi_sub_comm.h
 
+
+ + + + diff --git a/git-main/dir_19d6e67e2a8c9c02f99b05222b5702e0.html b/git-main/dir_19d6e67e2a8c9c02f99b05222b5702e0.html new file mode 100644 index 0000000..a984f2f --- /dev/null +++ b/git-main/dir_19d6e67e2a8c9c02f99b05222b5702e0.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doc/markdown Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
markdown Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_211db8a2c69420f4ce572fd277c5fa9d.html b/git-main/dir_211db8a2c69420f4ce572fd277c5fa9d.html new file mode 100644 index 0000000..255f42b --- /dev/null +++ b/git-main/dir_211db8a2c69420f4ce572fd277c5fa9d.html @@ -0,0 +1,109 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
all_features Directory Reference
+
+
+ + + + + + + + +

+Files

 assert_returns_disabled.cpp
 
 doctest_proxy.h
 
 header.h
 
+
+ + + + diff --git a/git-main/dir_2da0d08c090dfc162bcb1050ad85461d.html b/git-main/dir_2da0d08c090dfc162bcb1050ad85461d.html new file mode 100644 index 0000000..d440407 --- /dev/null +++ b/git-main/dir_2da0d08c090dfc162bcb1050ad85461d.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/development_only Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
development_only Directory Reference
+
+
+ + + + +

+Directories

 doctest
 
+
+ + + + diff --git a/git-main/dir_3aed5d9a354d80b98b13c56957e9e40d.html b/git-main/dir_3aed5d9a354d80b98b13c56957e9e40d.html new file mode 100644 index 0000000..86fc9ba --- /dev/null +++ b/git-main/dir_3aed5d9a354d80b98b13c56957e9e40d.html @@ -0,0 +1,109 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest-src Directory Reference
+
+
+ + + + + + + + +

+Directories

 doctest
 
 examples
 
 scripts
 
+
+ + + + diff --git a/git-main/dir_42566503585505dc2e60fa3dcde9fb9b.html b/git-main/dir_42566503585505dc2e60fa3dcde9fb9b.html new file mode 100644 index 0000000..9ff7eae --- /dev/null +++ b/git-main/dir_42566503585505dc2e60fa3dcde9fb9b.html @@ -0,0 +1,107 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
parts Directory Reference
+
+
+ + + + + + +

+Files

 doctest.cpp
 
 doctest_fwd.h
 
+
+ + + + diff --git a/git-main/dir_43253e74d6ea82bdbabf005ef1d7a846.html b/git-main/dir_43253e74d6ea82bdbabf005ef1d7a846.html new file mode 100644 index 0000000..acedfc5 --- /dev/null +++ b/git-main/dir_43253e74d6ea82bdbabf005ef1d7a846.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/executable_dll_and_plugin Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
executable_dll_and_plugin Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_5b519a8d1f6ad2560e623a56ba70dd2c.html b/git-main/dir_5b519a8d1f6ad2560e623a56ba70dd2c.html new file mode 100644 index 0000000..4500d66 --- /dev/null +++ b/git-main/dir_5b519a8d1f6ad2560e623a56ba70dd2c.html @@ -0,0 +1,113 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
examples Directory Reference
+
+ + + + + diff --git a/git-main/dir_5ce394648a2ce49effa43d7c8c1d0ab7.html b/git-main/dir_5ce394648a2ce49effa43d7c8c1d0ab7.html new file mode 100644 index 0000000..7ca73ab --- /dev/null +++ b/git-main/dir_5ce394648a2ce49effa43d7c8c1d0ab7.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/development_only/doctest Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest Directory Reference
+
+
+ + + + +

+Files

 doctest.h
 
+
+ + + + diff --git a/git-main/dir_7eb8d58cad924ffc9253fe5769504e6c.html b/git-main/dir_7eb8d58cad924ffc9253fe5769504e6c.html new file mode 100644 index 0000000..ef32cc0 --- /dev/null +++ b/git-main/dir_7eb8d58cad924ffc9253fe5769504e6c.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doc Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doc Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_8b925520cb613cf2392a9f8548a542a4.html b/git-main/dir_8b925520cb613cf2392a9f8548a542a4.html new file mode 100644 index 0000000..48d7db0 --- /dev/null +++ b/git-main/dir_8b925520cb613cf2392a9f8548a542a4.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/mpi Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
mpi Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_9a2b83ecc9199c13815ef5c7cb1df230.html b/git-main/dir_9a2b83ecc9199c13815ef5c7cb1df230.html new file mode 100644 index 0000000..e01e69f --- /dev/null +++ b/git-main/dir_9a2b83ecc9199c13815ef5c7cb1df230.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/bench Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
bench Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_9b84b44367723a1d0d88a431bcd23f48.html b/git-main/dir_9b84b44367723a1d0d88a431bcd23f48.html new file mode 100644 index 0000000..80c411d --- /dev/null +++ b/git-main/dir_9b84b44367723a1d0d88a431bcd23f48.html @@ -0,0 +1,107 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/installed_doctest_cmake Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
installed_doctest_cmake Directory Reference
+
+
+ + + + + + +

+Directories

 dll
 
 executable
 
+
+ + + + diff --git a/git-main/dir_a4fd227c5a8e0bc1498d3ae6ee4886a0.html b/git-main/dir_a4fd227c5a8e0bc1498d3ae6ee4886a0.html new file mode 100644 index 0000000..1ff5398 --- /dev/null +++ b/git-main/dir_a4fd227c5a8e0bc1498d3ae6ee4886a0.html @@ -0,0 +1,107 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/installed_doctest_cmake/dll Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
dll Directory Reference
+
+
+ + + + + + +

+Files

 dll.h
 
 exporting.h
 
+
+ + + + diff --git a/git-main/dir_a57a94e38c03835eed49274b75b0176d.html b/git-main/dir_a57a94e38c03835eed49274b75b0176d.html new file mode 100644 index 0000000..f1886cb --- /dev/null +++ b/git-main/dir_a57a94e38c03835eed49274b75b0176d.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
_deps Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_a64aea07de2f8e4b0652b4f49e88934d.html b/git-main/dir_a64aea07de2f8e4b0652b4f49e88934d.html new file mode 100644 index 0000000..a6e7b97 --- /dev/null +++ b/git-main/dir_a64aea07de2f8e4b0652b4f49e88934d.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest Directory Reference
+
+
+ + + + + + +

+Directories

 extensions
 
 parts
 
+ + + +

+Files

 doctest.h
 
+
+ + + + diff --git a/git-main/dir_c528b7bc4a3fa6117001302291996482.html b/git-main/dir_c528b7bc4a3fa6117001302291996482.html new file mode 100644 index 0000000..dbf2089 --- /dev/null +++ b/git-main/dir_c528b7bc4a3fa6117001302291996482.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/exe_with_static_libs Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
exe_with_static_libs Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_cf0ad092fd70688f67b23e9319dfdbf7.html b/git-main/dir_cf0ad092fd70688f67b23e9319dfdbf7.html new file mode 100644 index 0000000..5f681eb --- /dev/null +++ b/git-main/dir_cf0ad092fd70688f67b23e9319dfdbf7.html @@ -0,0 +1,109 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
scripts Directory Reference
+
+
+ + + + + + + + +

+Directories

 bench
 
 how_stuff_works
 
 playground
 
+
+ + + + diff --git a/git-main/dir_d7feab101fc42698e063f6e64b4257c6.html b/git-main/dir_d7feab101fc42698e063f6e64b4257c6.html new file mode 100644 index 0000000..52d99a6 --- /dev/null +++ b/git-main/dir_d7feab101fc42698e063f6e64b4257c6.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/playground Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
playground Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_dc93519aa0008696ff29cd2f84adb2a1.html b/git-main/dir_dc93519aa0008696ff29cd2f84adb2a1.html new file mode 100644 index 0000000..97d2ed0 --- /dev/null +++ b/git-main/dir_dc93519aa0008696ff29cd2f84adb2a1.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/installed_doctest_cmake/executable Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
executable Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_f2245241ea565ce482a8cba7c024245b.html b/git-main/dir_f2245241ea565ce482a8cba7c024245b.html new file mode 100644 index 0000000..e310958 --- /dev/null +++ b/git-main/dir_f2245241ea565ce482a8cba7c024245b.html @@ -0,0 +1,99 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/how_stuff_works Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
how_stuff_works Directory Reference
+
+
+
+ + + + diff --git a/git-main/dir_f40c3ec3501908b5834e804abc5d7b28.html b/git-main/dir_f40c3ec3501908b5834e804abc5d7b28.html new file mode 100644 index 0000000..eea863e --- /dev/null +++ b/git-main/dir_f40c3ec3501908b5834e804abc5d7b28.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/combining_the_same_tests_built_differently_in_multiple_shared_objects Directory Reference + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
combining_the_same_tests_built_differently_in_multiple_shared_objects Directory Reference
+
+
+ + + + +

+Files

 foo.h
 
+
+ + + + diff --git a/git-main/dll_8h_source.html b/git-main/dll_8h_source.html new file mode 100644 index 0000000..16b940d --- /dev/null +++ b/git-main/dll_8h_source.html @@ -0,0 +1,111 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/installed_doctest_cmake/dll/dll.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
dll.h
+
+
+
1#pragma once
+
2
+
3#include "exporting.h"
+
4
+
5extern "C" {
+
6 DLL_API void say_hello_dll();
+
7}
+
+ + + + diff --git a/git-main/doctest_2doctest_8h_source.html b/git-main/doctest_2doctest_8h_source.html new file mode 100644 index 0000000..06e5196 --- /dev/null +++ b/git-main/doctest_2doctest_8h_source.html @@ -0,0 +1,7346 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest.h
+
+
+
1// ====================================================================== lgtm [cpp/missing-header-guard]
+
2// == DO NOT MODIFY THIS FILE BY HAND - IT IS AUTO GENERATED BY CMAKE! ==
+
3// ======================================================================
+
4//
+
5// doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD
+
6//
+
7// Copyright (c) 2016-2023 Viktor Kirilov
+
8//
+
9// Distributed under the MIT Software License
+
10// See accompanying file LICENSE.txt or copy at
+
11// https://opensource.org/licenses/MIT
+
12//
+
13// The documentation can be found at the library's page:
+
14// https://github.com/doctest/doctest/blob/master/doc/markdown/readme.md
+
15//
+
16// =================================================================================================
+
17// =================================================================================================
+
18// =================================================================================================
+
19//
+
20// The library is heavily influenced by Catch - https://github.com/catchorg/Catch2
+
21// which uses the Boost Software License - Version 1.0
+
22// see here - https://github.com/catchorg/Catch2/blob/master/LICENSE.txt
+
23//
+
24// The concept of subcases (sections in Catch) and expression decomposition are from there.
+
25// Some parts of the code are taken directly:
+
26// - stringification - the detection of "ostream& operator<<(ostream&, const T&)" and StringMaker<>
+
27// - the Approx() helper class for floating point comparison
+
28// - colors in the console
+
29// - breaking into a debugger
+
30// - signal / SEH handling
+
31// - timer
+
32// - XmlWriter class - thanks to Phil Nash for allowing the direct reuse (AKA copy/paste)
+
33//
+
34// The expression decomposing templates are taken from lest - https://github.com/martinmoene/lest
+
35// which uses the Boost Software License - Version 1.0
+
36// see here - https://github.com/martinmoene/lest/blob/master/LICENSE.txt
+
37//
+
38// =================================================================================================
+
39// =================================================================================================
+
40// =================================================================================================
+
41
+
42#ifndef DOCTEST_LIBRARY_INCLUDED
+
43#define DOCTEST_LIBRARY_INCLUDED
+
44
+
45// =================================================================================================
+
46// == VERSION ======================================================================================
+
47// =================================================================================================
+
48
+
49#define DOCTEST_VERSION_MAJOR 2
+
50#define DOCTEST_VERSION_MINOR 4
+
51#define DOCTEST_VERSION_PATCH 11
+
52
+
53// util we need here
+
54#define DOCTEST_TOSTR_IMPL(x) #x
+
55#define DOCTEST_TOSTR(x) DOCTEST_TOSTR_IMPL(x)
+
56
+
57#define DOCTEST_VERSION_STR \
+
58 DOCTEST_TOSTR(DOCTEST_VERSION_MAJOR) "." \
+
59 DOCTEST_TOSTR(DOCTEST_VERSION_MINOR) "." \
+
60 DOCTEST_TOSTR(DOCTEST_VERSION_PATCH)
+
61
+
62#define DOCTEST_VERSION \
+
63 (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
+
64
+
65// =================================================================================================
+
66// == COMPILER VERSION =============================================================================
+
67// =================================================================================================
+
68
+
69// ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect
+
70
+
71#ifdef _MSC_VER
+
72#define DOCTEST_CPLUSPLUS _MSVC_LANG
+
73#else
+
74#define DOCTEST_CPLUSPLUS __cplusplus
+
75#endif
+
76
+
77#define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))
+
78
+
79// GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl...
+
80#if defined(_MSC_VER) && defined(_MSC_FULL_VER)
+
81#if _MSC_VER == _MSC_FULL_VER / 10000
+
82#define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)
+
83#else // MSVC
+
84#define DOCTEST_MSVC \
+
85 DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)
+
86#endif // MSVC
+
87#endif // MSVC
+
88#if defined(__clang__) && defined(__clang_minor__) && defined(__clang_patchlevel__)
+
89#define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)
+
90#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && \
+
91 !defined(__INTEL_COMPILER)
+
92#define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+
93#endif // GCC
+
94#if defined(__INTEL_COMPILER)
+
95#define DOCTEST_ICC DOCTEST_COMPILER(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
+
96#endif // ICC
+
97
+
98#ifndef DOCTEST_MSVC
+
99#define DOCTEST_MSVC 0
+
100#endif // DOCTEST_MSVC
+
101#ifndef DOCTEST_CLANG
+
102#define DOCTEST_CLANG 0
+
103#endif // DOCTEST_CLANG
+
104#ifndef DOCTEST_GCC
+
105#define DOCTEST_GCC 0
+
106#endif // DOCTEST_GCC
+
107#ifndef DOCTEST_ICC
+
108#define DOCTEST_ICC 0
+
109#endif // DOCTEST_ICC
+
110
+
111// =================================================================================================
+
112// == COMPILER WARNINGS HELPERS ====================================================================
+
113// =================================================================================================
+
114
+
115#if DOCTEST_CLANG && !DOCTEST_ICC
+
116#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
+
117#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push")
+
118#define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)
+
119#define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop")
+
120#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w) \
+
121 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)
+
122#else // DOCTEST_CLANG
+
123#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
124#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
+
125#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
126#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
+
127#endif // DOCTEST_CLANG
+
128
+
129#if DOCTEST_GCC
+
130#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
+
131#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push")
+
132#define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)
+
133#define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop")
+
134#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w) \
+
135 DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)
+
136#else // DOCTEST_GCC
+
137#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
138#define DOCTEST_GCC_SUPPRESS_WARNING(w)
+
139#define DOCTEST_GCC_SUPPRESS_WARNING_POP
+
140#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
+
141#endif // DOCTEST_GCC
+
142
+
143#if DOCTEST_MSVC
+
144#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))
+
145#define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))
+
146#define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))
+
147#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w) \
+
148 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)
+
149#else // DOCTEST_MSVC
+
150#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
151#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
+
152#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
153#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
+
154#endif // DOCTEST_MSVC
+
155
+
156// =================================================================================================
+
157// == COMPILER WARNINGS ============================================================================
+
158// =================================================================================================
+
159
+
160// both the header and the implementation suppress all of these,
+
161// so it only makes sense to aggregate them like so
+
162#define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH \
+
163 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH \
+
164 DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas") \
+
165 DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables") \
+
166 DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded") \
+
167 DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes") \
+
168 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat") \
+
169 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic") \
+
170 \
+
171 DOCTEST_GCC_SUPPRESS_WARNING_PUSH \
+
172 DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas") \
+
173 DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas") \
+
174 DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++") \
+
175 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") \
+
176 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing") \
+
177 DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations") \
+
178 DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast") \
+
179 DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") \
+
180 \
+
181 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
+
182 /* these 4 also disabled globally via cmake: */ \
+
183 DOCTEST_MSVC_SUPPRESS_WARNING(4514) /* unreferenced inline function has been removed */ \
+
184 DOCTEST_MSVC_SUPPRESS_WARNING(4571) /* SEH related */ \
+
185 DOCTEST_MSVC_SUPPRESS_WARNING(4710) /* function not inlined */ \
+
186 DOCTEST_MSVC_SUPPRESS_WARNING(4711) /* function selected for inline expansion*/ \
+
187 /* common ones */ \
+
188 DOCTEST_MSVC_SUPPRESS_WARNING(4616) /* invalid compiler warning */ \
+
189 DOCTEST_MSVC_SUPPRESS_WARNING(4619) /* invalid compiler warning */ \
+
190 DOCTEST_MSVC_SUPPRESS_WARNING(4996) /* The compiler encountered a deprecated declaration */ \
+
191 DOCTEST_MSVC_SUPPRESS_WARNING(4706) /* assignment within conditional expression */ \
+
192 DOCTEST_MSVC_SUPPRESS_WARNING(4512) /* 'class' : assignment operator could not be generated */ \
+
193 DOCTEST_MSVC_SUPPRESS_WARNING(4127) /* conditional expression is constant */ \
+
194 DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
+
195 DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
+
196 DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
+
197 DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
+
198 DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
+
199 DOCTEST_MSVC_SUPPRESS_WARNING(4640) /* construction of local static object not thread-safe */ \
+
200 DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
+
201 DOCTEST_MSVC_SUPPRESS_WARNING(5264) /* 'variable-name': 'const' variable is not used */ \
+
202 /* static analysis */ \
+
203 DOCTEST_MSVC_SUPPRESS_WARNING(26439) /* Function may not throw. Declare it 'noexcept' */ \
+
204 DOCTEST_MSVC_SUPPRESS_WARNING(26495) /* Always initialize a member variable */ \
+
205 DOCTEST_MSVC_SUPPRESS_WARNING(26451) /* Arithmetic overflow ... */ \
+
206 DOCTEST_MSVC_SUPPRESS_WARNING(26444) /* Avoid unnamed objects with custom ctor and dtor... */ \
+
207 DOCTEST_MSVC_SUPPRESS_WARNING(26812) /* Prefer 'enum class' over 'enum' */
+
208
+
209#define DOCTEST_SUPPRESS_COMMON_WARNINGS_POP \
+
210 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
+
211 DOCTEST_GCC_SUPPRESS_WARNING_POP \
+
212 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
213
+
214DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
+
215
+
216DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
217DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor")
+
218DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated")
+
219
+
220DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
221DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy")
+
222DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor")
+
223DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-promo")
+
224
+
225DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
226DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted
+
227
+
228#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \
+
229 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
+
230 DOCTEST_MSVC_SUPPRESS_WARNING(4548) /* before comma no effect; expected side - effect */ \
+
231 DOCTEST_MSVC_SUPPRESS_WARNING(4265) /* virtual functions, but destructor is not virtual */ \
+
232 DOCTEST_MSVC_SUPPRESS_WARNING(4986) /* exception specification does not match previous */ \
+
233 DOCTEST_MSVC_SUPPRESS_WARNING(4350) /* 'member1' called instead of 'member2' */ \
+
234 DOCTEST_MSVC_SUPPRESS_WARNING(4668) /* not defined as a preprocessor macro */ \
+
235 DOCTEST_MSVC_SUPPRESS_WARNING(4365) /* signed/unsigned mismatch */ \
+
236 DOCTEST_MSVC_SUPPRESS_WARNING(4774) /* format string not a string literal */ \
+
237 DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
+
238 DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
+
239 DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
+
240 DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
+
241 DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
+
242 DOCTEST_MSVC_SUPPRESS_WARNING(4623) /* default constructor was implicitly deleted */ \
+
243 DOCTEST_MSVC_SUPPRESS_WARNING(5039) /* pointer to pot. throwing function passed to extern C */ \
+
244 DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
+
245 DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */ \
+
246 DOCTEST_MSVC_SUPPRESS_WARNING(4738) /* storing float result in memory, loss of performance */ \
+
247 DOCTEST_MSVC_SUPPRESS_WARNING(5262) /* implicit fall-through */
+
248
+
249#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
250
+
251// =================================================================================================
+
252// == FEATURE DETECTION ============================================================================
+
253// =================================================================================================
+
254
+
255// general compiler feature support table: https://en.cppreference.com/w/cpp/compiler_support
+
256// MSVC C++11 feature support table: https://msdn.microsoft.com/en-us/library/hh567368.aspx
+
257// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html
+
258// MSVC version table:
+
259// https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
+
260// MSVC++ 14.3 (17) _MSC_VER == 1930 (Visual Studio 2022)
+
261// MSVC++ 14.2 (16) _MSC_VER == 1920 (Visual Studio 2019)
+
262// MSVC++ 14.1 (15) _MSC_VER == 1910 (Visual Studio 2017)
+
263// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
+
264// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
+
265// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
+
266// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
+
267// MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
+
268// MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
+
269
+
270// Universal Windows Platform support
+
271#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+
272#define DOCTEST_CONFIG_NO_WINDOWS_SEH
+
273#endif // WINAPI_FAMILY
+
274#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
275#define DOCTEST_CONFIG_WINDOWS_SEH
+
276#endif // MSVC
+
277#if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
278#undef DOCTEST_CONFIG_WINDOWS_SEH
+
279#endif // DOCTEST_CONFIG_NO_WINDOWS_SEH
+
280
+
281#if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && \
+
282 !defined(__EMSCRIPTEN__) && !defined(__wasi__)
+
283#define DOCTEST_CONFIG_POSIX_SIGNALS
+
284#endif // _WIN32
+
285#if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)
+
286#undef DOCTEST_CONFIG_POSIX_SIGNALS
+
287#endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS
+
288
+
289#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
290#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) \
+
291 || defined(__wasi__)
+
292#define DOCTEST_CONFIG_NO_EXCEPTIONS
+
293#endif // no exceptions
+
294#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
295
+
296#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
297#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
298#define DOCTEST_CONFIG_NO_EXCEPTIONS
+
299#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
300#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
301
+
302#if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)
+
303#define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
304#endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
305
+
306#ifdef __wasi__
+
307#define DOCTEST_CONFIG_NO_MULTITHREADING
+
308#endif
+
309
+
310#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)
+
311#define DOCTEST_CONFIG_IMPLEMENT
+
312#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
313
+
314#if defined(_WIN32) || defined(__CYGWIN__)
+
315#if DOCTEST_MSVC
+
316#define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)
+
317#define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)
+
318#else // MSVC
+
319#define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))
+
320#define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))
+
321#endif // MSVC
+
322#else // _WIN32
+
323#define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default")))
+
324#define DOCTEST_SYMBOL_IMPORT
+
325#endif // _WIN32
+
326
+
327#ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
328#ifdef DOCTEST_CONFIG_IMPLEMENT
+
329#define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT
+
330#else // DOCTEST_CONFIG_IMPLEMENT
+
331#define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT
+
332#endif // DOCTEST_CONFIG_IMPLEMENT
+
333#else // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
334#define DOCTEST_INTERFACE
+
335#endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
336
+
337// needed for extern template instantiations
+
338// see https://github.com/fmtlib/fmt/issues/2228
+
339#if DOCTEST_MSVC
+
340#define DOCTEST_INTERFACE_DECL
+
341#define DOCTEST_INTERFACE_DEF DOCTEST_INTERFACE
+
342#else // DOCTEST_MSVC
+
343#define DOCTEST_INTERFACE_DECL DOCTEST_INTERFACE
+
344#define DOCTEST_INTERFACE_DEF
+
345#endif // DOCTEST_MSVC
+
346
+
347#define DOCTEST_EMPTY
+
348
+
349#if DOCTEST_MSVC
+
350#define DOCTEST_NOINLINE __declspec(noinline)
+
351#define DOCTEST_UNUSED
+
352#define DOCTEST_ALIGNMENT(x)
+
353#elif DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 5, 0)
+
354#define DOCTEST_NOINLINE
+
355#define DOCTEST_UNUSED
+
356#define DOCTEST_ALIGNMENT(x)
+
357#else
+
358#define DOCTEST_NOINLINE __attribute__((noinline))
+
359#define DOCTEST_UNUSED __attribute__((unused))
+
360#define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))
+
361#endif
+
362
+
363#ifdef DOCTEST_CONFIG_NO_CONTRADICTING_INLINE
+
364#define DOCTEST_INLINE_NOINLINE inline
+
365#else
+
366#define DOCTEST_INLINE_NOINLINE inline DOCTEST_NOINLINE
+
367#endif
+
368
+
369#ifndef DOCTEST_NORETURN
+
370#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
371#define DOCTEST_NORETURN
+
372#else // DOCTEST_MSVC
+
373#define DOCTEST_NORETURN [[noreturn]]
+
374#endif // DOCTEST_MSVC
+
375#endif // DOCTEST_NORETURN
+
376
+
377#ifndef DOCTEST_NOEXCEPT
+
378#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
379#define DOCTEST_NOEXCEPT
+
380#else // DOCTEST_MSVC
+
381#define DOCTEST_NOEXCEPT noexcept
+
382#endif // DOCTEST_MSVC
+
383#endif // DOCTEST_NOEXCEPT
+
384
+
385#ifndef DOCTEST_CONSTEXPR
+
386#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
387#define DOCTEST_CONSTEXPR const
+
388#define DOCTEST_CONSTEXPR_FUNC inline
+
389#else // DOCTEST_MSVC
+
390#define DOCTEST_CONSTEXPR constexpr
+
391#define DOCTEST_CONSTEXPR_FUNC constexpr
+
392#endif // DOCTEST_MSVC
+
393#endif // DOCTEST_CONSTEXPR
+
394
+
395#ifndef DOCTEST_NO_SANITIZE_INTEGER
+
396#if DOCTEST_CLANG >= DOCTEST_COMPILER(3, 7, 0)
+
397#define DOCTEST_NO_SANITIZE_INTEGER __attribute__((no_sanitize("integer")))
+
398#else
+
399#define DOCTEST_NO_SANITIZE_INTEGER
+
400#endif
+
401#endif // DOCTEST_NO_SANITIZE_INTEGER
+
402
+
403// =================================================================================================
+
404// == FEATURE DETECTION END ========================================================================
+
405// =================================================================================================
+
406
+
407#define DOCTEST_DECLARE_INTERFACE(name) \
+
408 virtual ~name(); \
+
409 name() = default; \
+
410 name(const name&) = delete; \
+
411 name(name&&) = delete; \
+
412 name& operator=(const name&) = delete; \
+
413 name& operator=(name&&) = delete;
+
414
+
415#define DOCTEST_DEFINE_INTERFACE(name) \
+
416 name::~name() = default;
+
417
+
418// internal macros for string concatenation and anonymous variable name generation
+
419#define DOCTEST_CAT_IMPL(s1, s2) s1##s2
+
420#define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)
+
421#ifdef __COUNTER__ // not standard and may be missing for some compilers
+
422#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)
+
423#else // __COUNTER__
+
424#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
+
425#endif // __COUNTER__
+
426
+
427#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
428#define DOCTEST_REF_WRAP(x) x&
+
429#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
430#define DOCTEST_REF_WRAP(x) x
+
431#endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
432
+
433// not using __APPLE__ because... this is how Catch does it
+
434#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
+
435#define DOCTEST_PLATFORM_MAC
+
436#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+
437#define DOCTEST_PLATFORM_IPHONE
+
438#elif defined(_WIN32)
+
439#define DOCTEST_PLATFORM_WINDOWS
+
440#elif defined(__wasi__)
+
441#define DOCTEST_PLATFORM_WASI
+
442#else // DOCTEST_PLATFORM
+
443#define DOCTEST_PLATFORM_LINUX
+
444#endif // DOCTEST_PLATFORM
+
445
+
446namespace doctest { namespace detail {
+
447 static DOCTEST_CONSTEXPR int consume(const int*, int) noexcept { return 0; }
+
448}}
+
449
+
450#define DOCTEST_GLOBAL_NO_WARNINGS(var, ...) \
+
451 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \
+
452 static const int var = doctest::detail::consume(&var, __VA_ARGS__); \
+
453 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
454
+
455#ifndef DOCTEST_BREAK_INTO_DEBUGGER
+
456// should probably take a look at https://github.com/scottt/debugbreak
+
457#ifdef DOCTEST_PLATFORM_LINUX
+
458#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
+
459// Break at the location of the failing check if possible
+
460#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
+
461#else
+
462#include <signal.h>
+
463#define DOCTEST_BREAK_INTO_DEBUGGER() raise(SIGTRAP)
+
464#endif
+
465#elif defined(DOCTEST_PLATFORM_MAC)
+
466#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__i386)
+
467#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
+
468#elif defined(__ppc__) || defined(__ppc64__)
+
469// https://www.cocoawithlove.com/2008/03/break-into-debugger.html
+
470#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n": : : "memory","r0","r3","r4") // NOLINT(hicpp-no-assembler)
+
471#else
+
472#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("brk #0"); // NOLINT(hicpp-no-assembler)
+
473#endif
+
474#elif DOCTEST_MSVC
+
475#define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()
+
476#elif defined(__MINGW32__)
+
477DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wredundant-decls")
+
478extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+
479DOCTEST_GCC_SUPPRESS_WARNING_POP
+
480#define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()
+
481#else // linux
+
482#define DOCTEST_BREAK_INTO_DEBUGGER() (static_cast<void>(0))
+
483#endif // linux
+
484#endif // DOCTEST_BREAK_INTO_DEBUGGER
+
485
+
486// this is kept here for backwards compatibility since the config option was changed
+
487#ifdef DOCTEST_CONFIG_USE_IOSFWD
+
488#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
+
489#define DOCTEST_CONFIG_USE_STD_HEADERS
+
490#endif
+
491#endif // DOCTEST_CONFIG_USE_IOSFWD
+
492
+
493// for clang - always include ciso646 (which drags some std stuff) because
+
494// we want to check if we are using libc++ with the _LIBCPP_VERSION macro in
+
495// which case we don't want to forward declare stuff from std - for reference:
+
496// https://github.com/doctest/doctest/issues/126
+
497// https://github.com/doctest/doctest/issues/356
+
498#if DOCTEST_CLANG
+
499#include <ciso646>
+
500#endif // clang
+
501
+
502#ifdef _LIBCPP_VERSION
+
503#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
+
504#define DOCTEST_CONFIG_USE_STD_HEADERS
+
505#endif
+
506#endif // _LIBCPP_VERSION
+
507
+
508#ifdef DOCTEST_CONFIG_USE_STD_HEADERS
+
509#ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
510#define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
511#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
512DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+
513#include <cstddef>
+
514#include <ostream>
+
515#include <istream>
+
516DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
517#else // DOCTEST_CONFIG_USE_STD_HEADERS
+
518
+
519// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
+
520DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)
+
521
+
522namespace std { // NOLINT(cert-dcl58-cpp)
+
523typedef decltype(nullptr) nullptr_t; // NOLINT(modernize-use-using)
+
524typedef decltype(sizeof(void*)) size_t; // NOLINT(modernize-use-using)
+
525template <class charT>
+ +
527template <>
+
528struct char_traits<char>;
+
529template <class charT, class traits>
+
530class basic_ostream; // NOLINT(fuchsia-virtual-inheritance)
+
531typedef basic_ostream<char, char_traits<char>> ostream; // NOLINT(modernize-use-using)
+
532template<class traits>
+
533// NOLINTNEXTLINE
+ +
535template <class charT, class traits>
+ +
537typedef basic_istream<char, char_traits<char>> istream; // NOLINT(modernize-use-using)
+
538template <class... Types>
+
539class tuple;
+
540#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
541// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
542template <class Ty>
+
543class allocator;
+
544template <class Elem, class Traits, class Alloc>
+
545class basic_string;
+
546using string = basic_string<char, char_traits<char>, allocator<char>>;
+
547#endif // VS 2019
+
548} // namespace std
+
549
+
550DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
551
+
552#endif // DOCTEST_CONFIG_USE_STD_HEADERS
+
553
+
554#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
555#include <type_traits>
+
556#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
557
+
558namespace doctest {
+
559
+
560using std::size_t;
+
561
+
562DOCTEST_INTERFACE extern bool is_running_in_test;
+
563
+
564#ifndef DOCTEST_CONFIG_STRING_SIZE_TYPE
+
565#define DOCTEST_CONFIG_STRING_SIZE_TYPE unsigned
+
566#endif
+
567
+
568// A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length
+
569// of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for:
+
570// - "is small" bit - the highest bit - if "0" then it is small - otherwise its "1" (128)
+
571// - if small - capacity left before going on the heap - using the lowest 5 bits
+
572// - if small - 2 bits are left unused - the second and third highest ones
+
573// - if small - acts as a null terminator if strlen() is 23 (24 including the null terminator)
+
574// and the "is small" bit remains "0" ("as well as the capacity left") so its OK
+
575// Idea taken from this lecture about the string implementation of facebook/folly - fbstring
+
576// https://www.youtube.com/watch?v=kPR8h4-qZdk
+
577// TODO:
+
578// - optimizations - like not deleting memory unnecessarily in operator= and etc.
+
579// - resize/reserve/clear
+
580// - replace
+
581// - back/front
+
582// - iterator stuff
+
583// - find & friends
+
584// - push_back/pop_back
+
585// - assign/insert/erase
+
586// - relational operators as free functions - taking const char* as one of the params
+
+
587class DOCTEST_INTERFACE String
+
588{
+
589public:
+
590 using size_type = DOCTEST_CONFIG_STRING_SIZE_TYPE;
+
591
+
592private:
+
593 static DOCTEST_CONSTEXPR size_type len = 24;
+
594 static DOCTEST_CONSTEXPR size_type last = len - 1;
+
595
+
596 struct view // len should be more than sizeof(view) - because of the final byte for flags
+
597 {
+
598 char* ptr;
+
599 size_type size;
+
600 size_type capacity;
+
601 };
+
602
+
603 union
+
604 {
+
605 char buf[len]; // NOLINT(*-avoid-c-arrays)
+
606 view data;
+
607 };
+
608
+
609 char* allocate(size_type sz);
+
610
+
611 bool isOnStack() const noexcept { return (buf[last] & 128) == 0; }
+
612 void setOnHeap() noexcept;
+
613 void setLast(size_type in = last) noexcept;
+
614 void setSize(size_type sz) noexcept;
+
615
+
616 void copy(const String& other);
+
617
+
618public:
+
619 static DOCTEST_CONSTEXPR size_type npos = static_cast<size_type>(-1);
+
620
+
621 String() noexcept;
+
622 ~String();
+
623
+
624 // cppcheck-suppress noExplicitConstructor
+
625 String(const char* in);
+
626 String(const char* in, size_type in_size);
+
627
+
628 String(std::istream& in, size_type in_size);
+
629
+
630 String(const String& other);
+
631 String& operator=(const String& other);
+
632
+
633 String& operator+=(const String& other);
+
634
+
635 String(String&& other) noexcept;
+
636 String& operator=(String&& other) noexcept;
+
637
+
638 char operator[](size_type i) const;
+
639 char& operator[](size_type i);
+
640
+
641 // the only functions I'm willing to leave in the interface - available for inlining
+
642 const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT
+
643 char* c_str() {
+
644 if (isOnStack()) {
+
645 return reinterpret_cast<char*>(buf);
+
646 }
+
647 return data.ptr;
+
648 }
+
649
+
650 size_type size() const;
+
651 size_type capacity() const;
+
652
+
653 String substr(size_type pos, size_type cnt = npos) &&;
+
654 String substr(size_type pos, size_type cnt = npos) const &;
+
655
+
656 size_type find(char ch, size_type pos = 0) const;
+
657 size_type rfind(char ch, size_type pos = npos) const;
+
658
+
659 int compare(const char* other, bool no_case = false) const;
+
660 int compare(const String& other, bool no_case = false) const;
+
661
+
662friend DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in);
+
663};
+
+
664
+
665DOCTEST_INTERFACE String operator+(const String& lhs, const String& rhs);
+
666
+
667DOCTEST_INTERFACE bool operator==(const String& lhs, const String& rhs);
+
668DOCTEST_INTERFACE bool operator!=(const String& lhs, const String& rhs);
+
669DOCTEST_INTERFACE bool operator<(const String& lhs, const String& rhs);
+
670DOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs);
+
671DOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs);
+
672DOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs);
+
673
+
+
674class DOCTEST_INTERFACE Contains {
+
675public:
+
676 explicit Contains(const String& string);
+
677
+
678 bool checkWith(const String& other) const;
+
679
+
680 String string;
+
681};
+
+
682
+
683DOCTEST_INTERFACE String toString(const Contains& in);
+
684
+
685DOCTEST_INTERFACE bool operator==(const String& lhs, const Contains& rhs);
+
686DOCTEST_INTERFACE bool operator==(const Contains& lhs, const String& rhs);
+
687DOCTEST_INTERFACE bool operator!=(const String& lhs, const Contains& rhs);
+
688DOCTEST_INTERFACE bool operator!=(const Contains& lhs, const String& rhs);
+
689
+
690namespace Color {
+
691 enum Enum
+
692 {
+
693 None = 0,
+
694 White,
+
695 Red,
+
696 Green,
+
697 Blue,
+
698 Cyan,
+
699 Yellow,
+
700 Grey,
+
701
+
702 Bright = 0x10,
+
703
+
704 BrightRed = Bright | Red,
+
705 BrightGreen = Bright | Green,
+
706 LightGrey = Bright | Grey,
+
707 BrightWhite = Bright | White
+
708 };
+
709
+
710 DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, Color::Enum code);
+
711} // namespace Color
+
712
+
713namespace assertType {
+
714 enum Enum
+
715 {
+
716 // macro traits
+
717
+
718 is_warn = 1,
+
719 is_check = 2 * is_warn,
+
720 is_require = 2 * is_check,
+
721
+
722 is_normal = 2 * is_require,
+
723 is_throws = 2 * is_normal,
+
724 is_throws_as = 2 * is_throws,
+
725 is_throws_with = 2 * is_throws_as,
+
726 is_nothrow = 2 * is_throws_with,
+
727
+
728 is_false = 2 * is_nothrow,
+
729 is_unary = 2 * is_false, // not checked anywhere - used just to distinguish the types
+
730
+
731 is_eq = 2 * is_unary,
+
732 is_ne = 2 * is_eq,
+
733
+
734 is_lt = 2 * is_ne,
+
735 is_gt = 2 * is_lt,
+
736
+
737 is_ge = 2 * is_gt,
+
738 is_le = 2 * is_ge,
+
739
+
740 // macro types
+
741
+
742 DT_WARN = is_normal | is_warn,
+
743 DT_CHECK = is_normal | is_check,
+
744 DT_REQUIRE = is_normal | is_require,
+
745
+
746 DT_WARN_FALSE = is_normal | is_false | is_warn,
+
747 DT_CHECK_FALSE = is_normal | is_false | is_check,
+
748 DT_REQUIRE_FALSE = is_normal | is_false | is_require,
+
749
+
750 DT_WARN_THROWS = is_throws | is_warn,
+
751 DT_CHECK_THROWS = is_throws | is_check,
+
752 DT_REQUIRE_THROWS = is_throws | is_require,
+
753
+
754 DT_WARN_THROWS_AS = is_throws_as | is_warn,
+
755 DT_CHECK_THROWS_AS = is_throws_as | is_check,
+
756 DT_REQUIRE_THROWS_AS = is_throws_as | is_require,
+
757
+
758 DT_WARN_THROWS_WITH = is_throws_with | is_warn,
+
759 DT_CHECK_THROWS_WITH = is_throws_with | is_check,
+
760 DT_REQUIRE_THROWS_WITH = is_throws_with | is_require,
+
761
+
762 DT_WARN_THROWS_WITH_AS = is_throws_with | is_throws_as | is_warn,
+
763 DT_CHECK_THROWS_WITH_AS = is_throws_with | is_throws_as | is_check,
+
764 DT_REQUIRE_THROWS_WITH_AS = is_throws_with | is_throws_as | is_require,
+
765
+
766 DT_WARN_NOTHROW = is_nothrow | is_warn,
+
767 DT_CHECK_NOTHROW = is_nothrow | is_check,
+
768 DT_REQUIRE_NOTHROW = is_nothrow | is_require,
+
769
+
770 DT_WARN_EQ = is_normal | is_eq | is_warn,
+
771 DT_CHECK_EQ = is_normal | is_eq | is_check,
+
772 DT_REQUIRE_EQ = is_normal | is_eq | is_require,
+
773
+
774 DT_WARN_NE = is_normal | is_ne | is_warn,
+
775 DT_CHECK_NE = is_normal | is_ne | is_check,
+
776 DT_REQUIRE_NE = is_normal | is_ne | is_require,
+
777
+
778 DT_WARN_GT = is_normal | is_gt | is_warn,
+
779 DT_CHECK_GT = is_normal | is_gt | is_check,
+
780 DT_REQUIRE_GT = is_normal | is_gt | is_require,
+
781
+
782 DT_WARN_LT = is_normal | is_lt | is_warn,
+
783 DT_CHECK_LT = is_normal | is_lt | is_check,
+
784 DT_REQUIRE_LT = is_normal | is_lt | is_require,
+
785
+
786 DT_WARN_GE = is_normal | is_ge | is_warn,
+
787 DT_CHECK_GE = is_normal | is_ge | is_check,
+
788 DT_REQUIRE_GE = is_normal | is_ge | is_require,
+
789
+
790 DT_WARN_LE = is_normal | is_le | is_warn,
+
791 DT_CHECK_LE = is_normal | is_le | is_check,
+
792 DT_REQUIRE_LE = is_normal | is_le | is_require,
+
793
+
794 DT_WARN_UNARY = is_normal | is_unary | is_warn,
+
795 DT_CHECK_UNARY = is_normal | is_unary | is_check,
+
796 DT_REQUIRE_UNARY = is_normal | is_unary | is_require,
+
797
+
798 DT_WARN_UNARY_FALSE = is_normal | is_false | is_unary | is_warn,
+
799 DT_CHECK_UNARY_FALSE = is_normal | is_false | is_unary | is_check,
+
800 DT_REQUIRE_UNARY_FALSE = is_normal | is_false | is_unary | is_require,
+
801 };
+
802} // namespace assertType
+
803
+
804DOCTEST_INTERFACE const char* assertString(assertType::Enum at);
+
805DOCTEST_INTERFACE const char* failureString(assertType::Enum at);
+
806DOCTEST_INTERFACE const char* skipPathFromFilename(const char* file);
+
807
+
+
808struct DOCTEST_INTERFACE TestCaseData
+
809{
+
810 String m_file; // the file in which the test was registered (using String - see #350)
+
811 unsigned m_line; // the line where the test was registered
+
812 const char* m_name; // name of the test case
+
813 const char* m_test_suite; // the test suite in which the test was added
+
814 const char* m_description;
+
815 bool m_skip;
+
816 bool m_no_breaks;
+
817 bool m_no_output;
+
818 bool m_may_fail;
+
819 bool m_should_fail;
+
820 int m_expected_failures;
+
821 double m_timeout;
+
822};
+
+
823
+
+
824struct DOCTEST_INTERFACE AssertData
+
825{
+
826 // common - for all asserts
+
827 const TestCaseData* m_test_case;
+
828 assertType::Enum m_at;
+
829 const char* m_file;
+
830 int m_line;
+
831 const char* m_expr;
+
832 bool m_failed;
+
833
+
834 // exception-related - for all asserts
+
835 bool m_threw;
+
836 String m_exception;
+
837
+
838 // for normal asserts
+
839 String m_decomp;
+
840
+
841 // for specific exception-related asserts
+
842 bool m_threw_as;
+
843 const char* m_exception_type;
+
844
+
+
845 class DOCTEST_INTERFACE StringContains {
+
846 private:
+
847 Contains content;
+
848 bool isContains;
+
849
+
850 public:
+
851 StringContains(const String& str) : content(str), isContains(false) { }
+
852 StringContains(Contains cntn) : content(static_cast<Contains&&>(cntn)), isContains(true) { }
+
853
+
854 bool check(const String& str) { return isContains ? (content == str) : (content.string == str); }
+
855
+
856 operator const String&() const { return content.string; }
+
857
+
858 const char* c_str() const { return content.string.c_str(); }
+
859 } m_exception_string;
+
+
860
+
861 AssertData(assertType::Enum at, const char* file, int line, const char* expr,
+
862 const char* exception_type, const StringContains& exception_string);
+
863};
+
+
864
+
+
865struct DOCTEST_INTERFACE MessageData
+
866{
+
867 String m_string;
+
868 const char* m_file;
+
869 int m_line;
+
870 assertType::Enum m_severity;
+
871};
+
+
872
+
+
873struct DOCTEST_INTERFACE SubcaseSignature
+
874{
+
875 String m_name;
+
876 const char* m_file;
+
877 int m_line;
+
878
+
879 bool operator==(const SubcaseSignature& other) const;
+
880 bool operator<(const SubcaseSignature& other) const;
+
881};
+
+
882
+
+
883struct DOCTEST_INTERFACE IContextScope
+
884{
+
885 DOCTEST_DECLARE_INTERFACE(IContextScope)
+
886 virtual void stringify(std::ostream*) const = 0;
+
887};
+
+
888
+
889namespace detail {
+
890 struct DOCTEST_INTERFACE TestCase;
+
891} // namespace detail
+
892
+
+ +
894{
+
895 std::ostream* cout = nullptr; // stdout stream
+
896 String binary_name; // the test binary name
+
897
+
898 const detail::TestCase* currentTest = nullptr;
+
899
+
900 // == parameters from the command line
+
901 String out; // output filename
+
902 String order_by; // how tests should be ordered
+
903 unsigned rand_seed; // the seed for rand ordering
+
904
+
905 unsigned first; // the first (matching) test to be executed
+
906 unsigned last; // the last (matching) test to be executed
+
907
+
908 int abort_after; // stop tests after this many failed assertions
+
909 int subcase_filter_levels; // apply the subcase filters for the first N levels
+
910
+
911 bool success; // include successful assertions in output
+
912 bool case_sensitive; // if filtering should be case sensitive
+
913 bool exit; // if the program should be exited after the tests are ran/whatever
+
914 bool duration; // print the time duration of each test case
+
915 bool minimal; // minimal console output (only test failures)
+
916 bool quiet; // no console output
+
917 bool no_throw; // to skip exceptions-related assertion macros
+
918 bool no_exitcode; // if the framework should return 0 as the exitcode
+
919 bool no_run; // to not run the tests at all (can be done with an "*" exclude)
+
920 bool no_intro; // to not print the intro of the framework
+
921 bool no_version; // to not print the version of the framework
+
922 bool no_colors; // if output to the console should be colorized
+
923 bool force_colors; // forces the use of colors even when a tty cannot be detected
+
924 bool no_breaks; // to not break into the debugger
+
925 bool no_skip; // don't skip test cases which are marked to be skipped
+
926 bool gnu_file_line; // if line numbers should be surrounded with :x: and not (x):
+
927 bool no_path_in_filenames; // if the path to files should be removed from the output
+
928 bool no_line_numbers; // if source code line numbers should be omitted from the output
+
929 bool no_debug_output; // no output in the debug console when a debugger is attached
+
930 bool no_skipped_summary; // don't print "skipped" in the summary !!! UNDOCUMENTED !!!
+
931 bool no_time_in_output; // omit any time/timestamps from output !!! UNDOCUMENTED !!!
+
932
+
933 bool help; // to print the help
+
934 bool version; // to print the version
+
935 bool count; // if only the count of matching tests is to be retrieved
+
936 bool list_test_cases; // to list all tests matching the filters
+
937 bool list_test_suites; // to list all suites matching the filters
+
938 bool list_reporters; // lists all registered reporters
+
939};
+
+
940
+
941namespace detail {
+
942 namespace types {
+
943#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
944 using namespace std;
+
945#else
+
946 template <bool COND, typename T = void>
+
947 struct enable_if { };
+
948
+
949 template <typename T>
+
950 struct enable_if<true, T> { using type = T; };
+
951
+
952 struct true_type { static DOCTEST_CONSTEXPR bool value = true; };
+
953 struct false_type { static DOCTEST_CONSTEXPR bool value = false; };
+
954
+
955 template <typename T> struct remove_reference { using type = T; };
+
956 template <typename T> struct remove_reference<T&> { using type = T; };
+
957 template <typename T> struct remove_reference<T&&> { using type = T; };
+
958
+
959 template <typename T> struct is_rvalue_reference : false_type { };
+
960 template <typename T> struct is_rvalue_reference<T&&> : true_type { };
+
961
+
962 template<typename T> struct remove_const { using type = T; };
+
963 template <typename T> struct remove_const<const T> { using type = T; };
+
964
+
965 // Compiler intrinsics
+
966 template <typename T> struct is_enum { static DOCTEST_CONSTEXPR bool value = __is_enum(T); };
+
967 template <typename T> struct underlying_type { using type = __underlying_type(T); };
+
968
+
969 template <typename T> struct is_pointer : false_type { };
+
970 template <typename T> struct is_pointer<T*> : true_type { };
+
971
+
972 template <typename T> struct is_array : false_type { };
+
973 // NOLINTNEXTLINE(*-avoid-c-arrays)
+
974 template <typename T, size_t SIZE> struct is_array<T[SIZE]> : true_type { };
+
975#endif
+
976 }
+
977
+
978 // <utility>
+
979 template <typename T>
+
980 T&& declval();
+
981
+
982 template <class T>
+
983 DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type& t) DOCTEST_NOEXCEPT {
+
984 return static_cast<T&&>(t);
+
985 }
+
986
+
987 template <class T>
+
988 DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type&& t) DOCTEST_NOEXCEPT {
+
989 return static_cast<T&&>(t);
+
990 }
+
991
+
992 template <typename T>
+ +
994
+
995// MSVS 2015 :(
+
996#if !DOCTEST_CLANG && defined(_MSC_VER) && _MSC_VER <= 1900
+
997 template <typename T, typename = void>
+
998 struct has_global_insertion_operator : types::false_type { };
+
999
+
1000 template <typename T>
+
1001 struct has_global_insertion_operator<T, decltype(::operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { };
+
1002
+
1003 template <typename T, typename = void>
+
1004 struct has_insertion_operator { static DOCTEST_CONSTEXPR bool value = has_global_insertion_operator<T>::value; };
+
1005
+
1006 template <typename T, bool global>
+
1007 struct insert_hack;
+
1008
+
1009 template <typename T>
+
1010 struct insert_hack<T, true> {
+
1011 static void insert(std::ostream& os, const T& t) { ::operator<<(os, t); }
+
1012 };
+
1013
+
1014 template <typename T>
+
1015 struct insert_hack<T, false> {
+
1016 static void insert(std::ostream& os, const T& t) { operator<<(os, t); }
+
1017 };
+
1018
+
1019 template <typename T>
+
1020 using insert_hack_t = insert_hack<T, has_global_insertion_operator<T>::value>;
+
1021#else
+
1022 template <typename T, typename = void>
+ +
1024#endif
+
1025
+
1026 template <typename T>
+
1027 struct has_insertion_operator<T, decltype(operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { };
+
1028
+
1029 template <typename T>
+ +
1033
+
1034 DOCTEST_INTERFACE std::ostream* tlssPush();
+
1035 DOCTEST_INTERFACE String tlssPop();
+
1036
+
1037 template <bool C>
+
+ +
1039 template <typename T>
+
1040 static String convert(const DOCTEST_REF_WRAP(T)) {
+
1041#ifdef DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES
+
1042 static_assert(deferred_false<T>::value, "No stringification detected for type T. See string conversion manual");
+
1043#endif
+
1044 return "{?}";
+
1045 }
+
1046 };
+
+
1047
+
1048 template <typename T>
+
1049 struct filldata;
+
1050
+
1051 template <typename T>
+
1052 void filloss(std::ostream* stream, const T& in) {
+
1053 filldata<T>::fill(stream, in);
+
1054 }
+
1055
+
1056 template <typename T, size_t N>
+
1057 void filloss(std::ostream* stream, const T (&in)[N]) { // NOLINT(*-avoid-c-arrays)
+
1058 // T[N], T(&)[N], T(&&)[N] have same behaviour.
+
1059 // Hence remove reference.
+
1060 filloss<typename types::remove_reference<decltype(in)>::type>(stream, in);
+
1061 }
+
1062
+
1063 template <typename T>
+
1064 String toStream(const T& in) {
+
1065 std::ostream* stream = tlssPush();
+
1066 filloss(stream, in);
+
1067 return tlssPop();
+
1068 }
+
1069
+
1070 template <>
+
+
1071 struct StringMakerBase<true> {
+
1072 template <typename T>
+
1073 static String convert(const DOCTEST_REF_WRAP(T) in) {
+
1074 return toStream(in);
+
1075 }
+
1076 };
+
+
1077} // namespace detail
+
1078
+
1079template <typename T>
+
+ +
1081 detail::has_insertion_operator<T>::value || detail::types::is_pointer<T>::value || detail::types::is_array<T>::value>
+
1082{};
+
+
1083
+
1084#ifndef DOCTEST_STRINGIFY
+
1085#ifdef DOCTEST_CONFIG_DOUBLE_STRINGIFY
+
1086#define DOCTEST_STRINGIFY(...) toString(toString(__VA_ARGS__))
+
1087#else
+
1088#define DOCTEST_STRINGIFY(...) toString(__VA_ARGS__)
+
1089#endif
+
1090#endif
+
1091
+
1092template <typename T>
+
1093String toString() {
+
1094#if DOCTEST_CLANG == 0 && DOCTEST_GCC == 0 && DOCTEST_ICC == 0
+
1095 String ret = __FUNCSIG__; // class doctest::String __cdecl doctest::toString<TYPE>(void)
+
1096 String::size_type beginPos = ret.find('<');
+
1097 return ret.substr(beginPos + 1, ret.size() - beginPos - static_cast<String::size_type>(sizeof(">(void)")));
+
1098#else
+
1099 String ret = __PRETTY_FUNCTION__; // doctest::String toString() [with T = TYPE]
+
1100 String::size_type begin = ret.find('=') + 2;
+
1101 return ret.substr(begin, ret.size() - begin - 1);
+
1102#endif
+
1103}
+
1104
+
1105template <typename T, typename detail::types::enable_if<!detail::should_stringify_as_underlying_type<T>::value, bool>::type = true>
+
1106String toString(const DOCTEST_REF_WRAP(T) value) {
+
1107 return StringMaker<T>::convert(value);
+
1108}
+
1109
+
1110#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1111DOCTEST_INTERFACE String toString(const char* in);
+
1112#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1113
+
1114#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
1115// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
1116DOCTEST_INTERFACE String toString(const std::string& in);
+
1117#endif // VS 2019
+
1118
+
1119DOCTEST_INTERFACE String toString(String in);
+
1120
+
1121DOCTEST_INTERFACE String toString(std::nullptr_t);
+
1122
+
1123DOCTEST_INTERFACE String toString(bool in);
+
1124
+
1125DOCTEST_INTERFACE String toString(float in);
+
1126DOCTEST_INTERFACE String toString(double in);
+
1127DOCTEST_INTERFACE String toString(double long in);
+
1128
+
1129DOCTEST_INTERFACE String toString(char in);
+
1130DOCTEST_INTERFACE String toString(char signed in);
+
1131DOCTEST_INTERFACE String toString(char unsigned in);
+
1132DOCTEST_INTERFACE String toString(short in);
+
1133DOCTEST_INTERFACE String toString(short unsigned in);
+
1134DOCTEST_INTERFACE String toString(signed in);
+
1135DOCTEST_INTERFACE String toString(unsigned in);
+
1136DOCTEST_INTERFACE String toString(long in);
+
1137DOCTEST_INTERFACE String toString(long unsigned in);
+
1138DOCTEST_INTERFACE String toString(long long in);
+
1139DOCTEST_INTERFACE String toString(long long unsigned in);
+
1140
+
1141template <typename T, typename detail::types::enable_if<detail::should_stringify_as_underlying_type<T>::value, bool>::type = true>
+
1142String toString(const DOCTEST_REF_WRAP(T) value) {
+
1143 using UT = typename detail::types::underlying_type<T>::type;
+
1144 return (DOCTEST_STRINGIFY(static_cast<UT>(value)));
+
1145}
+
1146
+
1147namespace detail {
+
1148 template <typename T>
+
1149 struct filldata
+
1150 {
+
1151 static void fill(std::ostream* stream, const T& in) {
+
1152#if defined(_MSC_VER) && _MSC_VER <= 1900
+
1153 insert_hack_t<T>::insert(*stream, in);
+
1154#else
+
1155 operator<<(*stream, in);
+
1156#endif
+
1157 }
+
1158 };
+
1159
+
1160DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866)
+
1161// NOLINTBEGIN(*-avoid-c-arrays)
+
1162 template <typename T, size_t N>
+
+
1163 struct filldata<T[N]> {
+
1164 static void fill(std::ostream* stream, const T(&in)[N]) {
+
1165 *stream << "[";
+
1166 for (size_t i = 0; i < N; i++) {
+
1167 if (i != 0) { *stream << ", "; }
+
1168 *stream << (DOCTEST_STRINGIFY(in[i]));
+
1169 }
+
1170 *stream << "]";
+
1171 }
+
1172 };
+
+
1173// NOLINTEND(*-avoid-c-arrays)
+
1174DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1175
+
1176 // Specialized since we don't want the terminating null byte!
+
1177// NOLINTBEGIN(*-avoid-c-arrays)
+
1178 template <size_t N>
+
+
1179 struct filldata<const char[N]> {
+
1180 static void fill(std::ostream* stream, const char (&in)[N]) {
+
1181 *stream << String(in, in[N - 1] ? N : N - 1);
+
1182 } // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
1183 };
+
+
1184// NOLINTEND(*-avoid-c-arrays)
+
1185
+
1186 template <>
+
+
1187 struct filldata<const void*> {
+
1188 static void fill(std::ostream* stream, const void* in);
+
1189 };
+
+
1190
+
1191 template <typename T>
+
+
1192 struct filldata<T*> {
+
1193DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4180)
+
1194 static void fill(std::ostream* stream, const T* in) {
+
1195DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1196DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wmicrosoft-cast")
+ +
1198#if DOCTEST_GCC == 0 || DOCTEST_GCC >= DOCTEST_COMPILER(4, 9, 0)
+
1199 reinterpret_cast<const void*>(in)
+
1200#else
+
1201 *reinterpret_cast<const void* const*>(&in)
+
1202#endif
+
1203 );
+
1204DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1205 }
+
1206 };
+
+
1207}
+
1208
+
+
1209struct DOCTEST_INTERFACE Approx
+
1210{
+
1211 Approx(double value);
+
1212
+
1213 Approx operator()(double value) const;
+
1214
+
1215#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1216 template <typename T>
+
1217 explicit Approx(const T& value,
+
1218 typename detail::types::enable_if<std::is_constructible<double, T>::value>::type* =
+
1219 static_cast<T*>(nullptr)) {
+
1220 *this = static_cast<double>(value);
+
1221 }
+
1222#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1223
+
1224 Approx& epsilon(double newEpsilon);
+
1225
+
1226#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1227 template <typename T>
+
1228 typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon(
+
1229 const T& newEpsilon) {
+
1230 m_epsilon = static_cast<double>(newEpsilon);
+
1231 return *this;
+
1232 }
+
1233#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1234
+
1235 Approx& scale(double newScale);
+
1236
+
1237#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1238 template <typename T>
+
1239 typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale(
+
1240 const T& newScale) {
+
1241 m_scale = static_cast<double>(newScale);
+
1242 return *this;
+
1243 }
+
1244#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1245
+
1246 // clang-format off
+
1247 DOCTEST_INTERFACE friend bool operator==(double lhs, const Approx & rhs);
+
1248 DOCTEST_INTERFACE friend bool operator==(const Approx & lhs, double rhs);
+
1249 DOCTEST_INTERFACE friend bool operator!=(double lhs, const Approx & rhs);
+
1250 DOCTEST_INTERFACE friend bool operator!=(const Approx & lhs, double rhs);
+
1251 DOCTEST_INTERFACE friend bool operator<=(double lhs, const Approx & rhs);
+
1252 DOCTEST_INTERFACE friend bool operator<=(const Approx & lhs, double rhs);
+
1253 DOCTEST_INTERFACE friend bool operator>=(double lhs, const Approx & rhs);
+
1254 DOCTEST_INTERFACE friend bool operator>=(const Approx & lhs, double rhs);
+
1255 DOCTEST_INTERFACE friend bool operator< (double lhs, const Approx & rhs);
+
1256 DOCTEST_INTERFACE friend bool operator< (const Approx & lhs, double rhs);
+
1257 DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs);
+
1258 DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs);
+
1259
+
1260#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1261#define DOCTEST_APPROX_PREFIX \
+
1262 template <typename T> friend typename std::enable_if<std::is_constructible<double, T>::value, bool>::type
+
1263
+
1264 DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(static_cast<double>(lhs), rhs); }
+
1265 DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); }
+
1266 DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
+
1267 DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); }
+
1268 DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; }
+
1269 DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; }
+
1270 DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; }
+
1271 DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) || lhs == rhs; }
+
1272 DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value && lhs != rhs; }
+
1273 DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) && lhs != rhs; }
+
1274 DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value && lhs != rhs; }
+
1275 DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) && lhs != rhs; }
+
1276#undef DOCTEST_APPROX_PREFIX
+
1277#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1278
+
1279 // clang-format on
+
1280
+
1281 double m_epsilon;
+
1282 double m_scale;
+
1283 double m_value;
+
1284};
+
+
1285
+
1286DOCTEST_INTERFACE String toString(const Approx& in);
+
1287
+
1288DOCTEST_INTERFACE const ContextOptions* getContextOptions();
+
1289
+
1290template <typename F>
+
+
1291struct DOCTEST_INTERFACE_DECL IsNaN
+
1292{
+
1293 F value; bool flipped;
+
1294 IsNaN(F f, bool flip = false) : value(f), flipped(flip) { }
+
1295 IsNaN<F> operator!() const { return { value, !flipped }; }
+
1296 operator bool() const;
+
1297};
+
+
1298#ifndef __MINGW32__
+
1299extern template struct DOCTEST_INTERFACE_DECL IsNaN<float>;
+
1300extern template struct DOCTEST_INTERFACE_DECL IsNaN<double>;
+
1301extern template struct DOCTEST_INTERFACE_DECL IsNaN<long double>;
+
1302#endif
+
1303DOCTEST_INTERFACE String toString(IsNaN<float> in);
+
1304DOCTEST_INTERFACE String toString(IsNaN<double> in);
+
1305DOCTEST_INTERFACE String toString(IsNaN<double long> in);
+
1306
+
1307#ifndef DOCTEST_CONFIG_DISABLE
+
1308
+
1309namespace detail {
+
1310 // clang-format off
+
1311#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1312 template<class T> struct decay_array { using type = T; };
+
1313 template<class T, unsigned N> struct decay_array<T[N]> { using type = T*; };
+
1314 template<class T> struct decay_array<T[]> { using type = T*; };
+
1315
+
1316 template<class T> struct not_char_pointer { static DOCTEST_CONSTEXPR int value = 1; };
+
1317 template<> struct not_char_pointer<char*> { static DOCTEST_CONSTEXPR int value = 0; };
+
1318 template<> struct not_char_pointer<const char*> { static DOCTEST_CONSTEXPR int value = 0; };
+
1319
+
1320 template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {};
+
1321#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1322 // clang-format on
+
1323
+
+
1324 struct DOCTEST_INTERFACE TestFailureException
+
1325 {
+
1326 };
+
+
1327
+
1328 DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at);
+
1329
+
1330#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1331 DOCTEST_NORETURN
+
1332#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1333 DOCTEST_INTERFACE void throwException();
+
1334
+
+
1335 struct DOCTEST_INTERFACE Subcase
+
1336 {
+
1337 SubcaseSignature m_signature;
+
1338 bool m_entered = false;
+
1339
+
1340 Subcase(const String& name, const char* file, int line);
+
1341 Subcase(const Subcase&) = delete;
+
1342 Subcase(Subcase&&) = delete;
+
1343 Subcase& operator=(const Subcase&) = delete;
+
1344 Subcase& operator=(Subcase&&) = delete;
+
1345 ~Subcase();
+
1346
+
1347 operator bool() const;
+
1348
+
1349 private:
+
1350 bool checkFilters();
+
1351 };
+
+
1352
+
1353 template <typename L, typename R>
+
1354 String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op,
+
1355 const DOCTEST_REF_WRAP(R) rhs) {
+
1356 return (DOCTEST_STRINGIFY(lhs)) + op + (DOCTEST_STRINGIFY(rhs));
+
1357 }
+
1358
+
1359#if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
+
1360DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison")
+
1361#endif
+
1362
+
1363// This will check if there is any way it could find a operator like member or friend and uses it.
+
1364// If not it doesn't find the operator or if the operator at global scope is defined after
+
1365// this template, the template won't be instantiated due to SFINAE. Once the template is not
+
1366// instantiated it can look for global operator using normal conversions.
+
1367#ifdef __NVCC__
+
1368#define SFINAE_OP(ret,op) ret
+
1369#else
+
1370#define SFINAE_OP(ret,op) decltype((void)(doctest::detail::declval<L>() op doctest::detail::declval<R>()),ret{})
+
1371#endif
+
1372
+
1373#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \
+
1374 template <typename R> \
+
1375 DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(R&& rhs) { \
+
1376 bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<R>(rhs)); \
+
1377 if(m_at & assertType::is_false) \
+
1378 res = !res; \
+
1379 if(!res || doctest::getContextOptions()->success) \
+
1380 return Result(res, stringifyBinaryExpr(lhs, op_str, rhs)); \
+
1381 return Result(res); \
+
1382 }
+
1383
+
1384 // more checks could be added - like in Catch:
+
1385 // https://github.com/catchorg/Catch2/pull/1480/files
+
1386 // https://github.com/catchorg/Catch2/pull/1481/files
+
1387#define DOCTEST_FORBIT_EXPRESSION(rt, op) \
+
1388 template <typename R> \
+
1389 rt& operator op(const R&) { \
+
1390 static_assert(deferred_false<R>::value, \
+
1391 "Expression Too Complex Please Rewrite As Binary Comparison!"); \
+
1392 return *this; \
+
1393 }
+
1394
+
+
1395 struct DOCTEST_INTERFACE Result // NOLINT(*-member-init)
+
1396 {
+
1397 bool m_passed;
+
1398 String m_decomp;
+
1399
+
1400 Result() = default; // TODO: Why do we need this? (To remove NOLINT)
+
1401 Result(bool passed, const String& decomposition = String());
+
1402
+
1403 // forbidding some expressions based on this table: https://en.cppreference.com/w/cpp/language/operator_precedence
+
1404 DOCTEST_FORBIT_EXPRESSION(Result, &)
+
1405 DOCTEST_FORBIT_EXPRESSION(Result, ^)
+
1406 DOCTEST_FORBIT_EXPRESSION(Result, |)
+
1407 DOCTEST_FORBIT_EXPRESSION(Result, &&)
+
1408 DOCTEST_FORBIT_EXPRESSION(Result, ||)
+
1409 DOCTEST_FORBIT_EXPRESSION(Result, ==)
+
1410 DOCTEST_FORBIT_EXPRESSION(Result, !=)
+
1411 DOCTEST_FORBIT_EXPRESSION(Result, <)
+
1412 DOCTEST_FORBIT_EXPRESSION(Result, >)
+
1413 DOCTEST_FORBIT_EXPRESSION(Result, <=)
+
1414 DOCTEST_FORBIT_EXPRESSION(Result, >=)
+
1415 DOCTEST_FORBIT_EXPRESSION(Result, =)
+
1416 DOCTEST_FORBIT_EXPRESSION(Result, +=)
+
1417 DOCTEST_FORBIT_EXPRESSION(Result, -=)
+
1418 DOCTEST_FORBIT_EXPRESSION(Result, *=)
+
1419 DOCTEST_FORBIT_EXPRESSION(Result, /=)
+
1420 DOCTEST_FORBIT_EXPRESSION(Result, %=)
+
1421 DOCTEST_FORBIT_EXPRESSION(Result, <<=)
+
1422 DOCTEST_FORBIT_EXPRESSION(Result, >>=)
+
1423 DOCTEST_FORBIT_EXPRESSION(Result, &=)
+
1424 DOCTEST_FORBIT_EXPRESSION(Result, ^=)
+
1425 DOCTEST_FORBIT_EXPRESSION(Result, |=)
+
1426 };
+
+
1427
+
1428#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1429
+
1430 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
1431 DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
+
1432 DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-compare")
+
1433 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wdouble-promotion")
+
1434 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wconversion")
+
1435 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wfloat-equal")
+
1436
+
1437 DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
1438 DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
+
1439 DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-compare")
+
1440 //DOCTEST_GCC_SUPPRESS_WARNING("-Wdouble-promotion")
+
1441 //DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
+
1442 //DOCTEST_GCC_SUPPRESS_WARNING("-Wfloat-equal")
+
1443
+
1444 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
1445 // https://stackoverflow.com/questions/39479163 what's the difference between 4018 and 4389
+
1446 DOCTEST_MSVC_SUPPRESS_WARNING(4388) // signed/unsigned mismatch
+
1447 DOCTEST_MSVC_SUPPRESS_WARNING(4389) // 'operator' : signed/unsigned mismatch
+
1448 DOCTEST_MSVC_SUPPRESS_WARNING(4018) // 'expression' : signed/unsigned mismatch
+
1449 //DOCTEST_MSVC_SUPPRESS_WARNING(4805) // 'operation' : unsafe mix of type 'type' and type 'type' in operation
+
1450
+
1451#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1452
+
1453 // clang-format off
+
1454#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1455#define DOCTEST_COMPARISON_RETURN_TYPE bool
+
1456#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1457#define DOCTEST_COMPARISON_RETURN_TYPE typename types::enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type
+
1458 inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); }
+
1459 inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); }
+
1460 inline bool lt(const char* lhs, const char* rhs) { return String(lhs) < String(rhs); }
+
1461 inline bool gt(const char* lhs, const char* rhs) { return String(lhs) > String(rhs); }
+
1462 inline bool le(const char* lhs, const char* rhs) { return String(lhs) <= String(rhs); }
+
1463 inline bool ge(const char* lhs, const char* rhs) { return String(lhs) >= String(rhs); }
+
1464#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1465 // clang-format on
+
1466
+
1467#define DOCTEST_RELATIONAL_OP(name, op) \
+
1468 template <typename L, typename R> \
+
1469 DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs, \
+
1470 const DOCTEST_REF_WRAP(R) rhs) { \
+
1471 return lhs op rhs; \
+
1472 }
+
1473
+
1474 DOCTEST_RELATIONAL_OP(eq, ==)
+
1475 DOCTEST_RELATIONAL_OP(ne, !=)
+
1476 DOCTEST_RELATIONAL_OP(lt, <)
+
1477 DOCTEST_RELATIONAL_OP(gt, >)
+
1478 DOCTEST_RELATIONAL_OP(le, <=)
+
1479 DOCTEST_RELATIONAL_OP(ge, >=)
+
1480
+
1481#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1482#define DOCTEST_CMP_EQ(l, r) l == r
+
1483#define DOCTEST_CMP_NE(l, r) l != r
+
1484#define DOCTEST_CMP_GT(l, r) l > r
+
1485#define DOCTEST_CMP_LT(l, r) l < r
+
1486#define DOCTEST_CMP_GE(l, r) l >= r
+
1487#define DOCTEST_CMP_LE(l, r) l <= r
+
1488#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1489#define DOCTEST_CMP_EQ(l, r) eq(l, r)
+
1490#define DOCTEST_CMP_NE(l, r) ne(l, r)
+
1491#define DOCTEST_CMP_GT(l, r) gt(l, r)
+
1492#define DOCTEST_CMP_LT(l, r) lt(l, r)
+
1493#define DOCTEST_CMP_GE(l, r) ge(l, r)
+
1494#define DOCTEST_CMP_LE(l, r) le(l, r)
+
1495#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1496
+
1497 template <typename L>
+
1498 // cppcheck-suppress copyCtorAndEqOperator
+
+ +
1500 {
+
1501 L lhs;
+
1502 assertType::Enum m_at;
+
1503
+
1504 explicit Expression_lhs(L&& in, assertType::Enum at)
+
1505 : lhs(static_cast<L&&>(in))
+
1506 , m_at(at) {}
+
1507
+
+
1508 DOCTEST_NOINLINE operator Result() {
+
1509// this is needed only for MSVC 2015
+
1510DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4800) // 'int': forcing value to bool
+
1511 bool res = static_cast<bool>(lhs);
+
1512DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1513 if(m_at & assertType::is_false) {
+
1514 res = !res;
+
1515 }
+
1516
+
1517 if(!res || getContextOptions()->success) {
+
1518 return { res, (DOCTEST_STRINGIFY(lhs)) };
+
1519 }
+
1520 return { res };
+
1521 }
+
+
1522
+
1523 /* This is required for user-defined conversions from Expression_lhs to L */
+
1524 operator L() const { return lhs; }
+
1525
+
1526 // clang-format off
+
1527 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(==, " == ", DOCTEST_CMP_EQ)
+
1528 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(!=, " != ", DOCTEST_CMP_NE)
+
1529 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>, " > ", DOCTEST_CMP_GT)
+
1530 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<, " < ", DOCTEST_CMP_LT)
+
1531 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>=, " >= ", DOCTEST_CMP_GE)
+
1532 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<=, " <= ", DOCTEST_CMP_LE)
+
1533 // clang-format on
+
1534
+
1535 // forbidding some expressions based on this table: https://en.cppreference.com/w/cpp/language/operator_precedence
+
1536 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &)
+
1537 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^)
+
1538 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |)
+
1539 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &&)
+
1540 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ||)
+
1541 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, =)
+
1542 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, +=)
+
1543 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, -=)
+
1544 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, *=)
+
1545 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, /=)
+
1546 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, %=)
+
1547 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<=)
+
1548 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>=)
+
1549 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &=)
+
1550 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^=)
+
1551 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |=)
+
1552 // these 2 are unfortunate because they should be allowed - they have higher precedence over the comparisons, but the
+
1553 // ExpressionDecomposer class uses the left shift operator to capture the left operand of the binary expression...
+
1554 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<)
+
1555 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>)
+
1556 };
+
+
1557
+
1558#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1559
+
1560 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1561 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1562 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
1563
+
1564#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1565
+
1566#if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
+
1567DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1568#endif
+
1569
+
+
1570 struct DOCTEST_INTERFACE ExpressionDecomposer
+
1571 {
+
1572 assertType::Enum m_at;
+
1573
+
1574 ExpressionDecomposer(assertType::Enum at);
+
1575
+
1576 // The right operator for capturing expressions is "<=" instead of "<<" (based on the operator precedence table)
+
1577 // but then there will be warnings from GCC about "-Wparentheses" and since "_Pragma()" is problematic this will stay for now...
+
1578 // https://github.com/catchorg/Catch2/issues/870
+
1579 // https://github.com/catchorg/Catch2/issues/565
+
1580 template <typename L>
+
1581 Expression_lhs<L> operator<<(L&& operand) {
+
1582 return Expression_lhs<L>(static_cast<L&&>(operand), m_at);
+
1583 }
+
1584
+
1585 template <typename L,typename types::enable_if<!doctest::detail::types::is_rvalue_reference<L>::value,void >::type* = nullptr>
+
1586 Expression_lhs<const L&> operator<<(const L &operand) {
+
1587 return Expression_lhs<const L&>(operand, m_at);
+
1588 }
+
1589 };
+
+
1590
+
+
1591 struct DOCTEST_INTERFACE TestSuite
+
1592 {
+
1593 const char* m_test_suite = nullptr;
+
1594 const char* m_description = nullptr;
+
1595 bool m_skip = false;
+
1596 bool m_no_breaks = false;
+
1597 bool m_no_output = false;
+
1598 bool m_may_fail = false;
+
1599 bool m_should_fail = false;
+
1600 int m_expected_failures = 0;
+
1601 double m_timeout = 0;
+
1602
+
1603 TestSuite& operator*(const char* in);
+
1604
+
1605 template <typename T>
+
1606 TestSuite& operator*(const T& in) {
+
1607 in.fill(*this);
+
1608 return *this;
+
1609 }
+
1610 };
+
+
1611
+
1612 using funcType = void (*)();
+
1613
+
+
1614 struct DOCTEST_INTERFACE TestCase : public TestCaseData
+
1615 {
+
1616 funcType m_test; // a function pointer to the test case
+
1617
+
1618 String m_type; // for templated test cases - gets appended to the real name
+
1619 int m_template_id; // an ID used to distinguish between the different versions of a templated test case
+
1620 String m_full_name; // contains the name (only for templated test cases!) + the template type
+
1621
+
1622 TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
+
1623 const String& type = String(), int template_id = -1);
+
1624
+
1625 TestCase(const TestCase& other);
+
1626 TestCase(TestCase&&) = delete;
+
1627
+
1628 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
+
1629 TestCase& operator=(const TestCase& other);
+
1630 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1631
+
1632 TestCase& operator=(TestCase&&) = delete;
+
1633
+
1634 TestCase& operator*(const char* in);
+
1635
+
1636 template <typename T>
+
1637 TestCase& operator*(const T& in) {
+
1638 in.fill(*this);
+
1639 return *this;
+
1640 }
+
1641
+
1642 bool operator<(const TestCase& other) const;
+
1643
+
1644 ~TestCase() = default;
+
1645 };
+
+
1646
+
1647 // forward declarations of functions used by the macros
+
1648 DOCTEST_INTERFACE int regTest(const TestCase& tc);
+
1649 DOCTEST_INTERFACE int setTestSuite(const TestSuite& ts);
+
1650 DOCTEST_INTERFACE bool isDebuggerActive();
+
1651
+
1652 template<typename T>
+
1653 int instantiationHelper(const T&) { return 0; }
+
1654
+
1655 namespace binaryAssertComparison {
+
1656 enum Enum
+
1657 {
+
1658 eq = 0,
+
1659 ne,
+
1660 gt,
+
1661 lt,
+
1662 ge,
+
1663 le
+
1664 };
+
1665 } // namespace binaryAssertComparison
+
1666
+
1667 // clang-format off
+
1668 template <int, class L, class R> struct RelationalComparator { bool operator()(const DOCTEST_REF_WRAP(L), const DOCTEST_REF_WRAP(R) ) const { return false; } };
+
1669
+
1670#define DOCTEST_BINARY_RELATIONAL_OP(n, op) \
+
1671 template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };
+
1672 // clang-format on
+
1673
+
1674 DOCTEST_BINARY_RELATIONAL_OP(0, doctest::detail::eq)
+
1675 DOCTEST_BINARY_RELATIONAL_OP(1, doctest::detail::ne)
+
1676 DOCTEST_BINARY_RELATIONAL_OP(2, doctest::detail::gt)
+
1677 DOCTEST_BINARY_RELATIONAL_OP(3, doctest::detail::lt)
+
1678 DOCTEST_BINARY_RELATIONAL_OP(4, doctest::detail::ge)
+
1679 DOCTEST_BINARY_RELATIONAL_OP(5, doctest::detail::le)
+
1680
+
+
1681 struct DOCTEST_INTERFACE ResultBuilder : public AssertData
+
1682 {
+
1683 ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1684 const char* exception_type = "", const String& exception_string = "");
+
1685
+
1686 ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1687 const char* exception_type, const Contains& exception_string);
+
1688
+
1689 void setResult(const Result& res);
+
1690
+
1691 template <int comparison, typename L, typename R>
+
1692 DOCTEST_NOINLINE bool binary_assert(const DOCTEST_REF_WRAP(L) lhs,
+
1693 const DOCTEST_REF_WRAP(R) rhs) {
+
1694 m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
+
1695 if (m_failed || getContextOptions()->success) {
+
1696 m_decomp = stringifyBinaryExpr(lhs, ", ", rhs);
+
1697 }
+
1698 return !m_failed;
+
1699 }
+
1700
+
1701 template <typename L>
+
+
1702 DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val) {
+
1703 m_failed = !val;
+
1704
+
1705 if (m_at & assertType::is_false) {
+
1706 m_failed = !m_failed;
+
1707 }
+
1708
+
1709 if (m_failed || getContextOptions()->success) {
+
1710 m_decomp = (DOCTEST_STRINGIFY(val));
+
1711 }
+
1712
+
1713 return !m_failed;
+
1714 }
+
+
1715
+
1716 void translateException();
+
1717
+
1718 bool log();
+
1719 void react() const;
+
1720 };
+
+
1721
+
1722 namespace assertAction {
+
1723 enum Enum
+
1724 {
+
1725 nothing = 0,
+
1726 dbgbreak = 1,
+
1727 shouldthrow = 2
+
1728 };
+
1729 } // namespace assertAction
+
1730
+
1731 DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);
+
1732
+
1733 DOCTEST_INTERFACE bool decomp_assert(assertType::Enum at, const char* file, int line,
+
1734 const char* expr, const Result& result);
+
1735
+
1736#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \
+
1737 do { \
+
1738 if(!is_running_in_test) { \
+
1739 if(failed) { \
+
1740 ResultBuilder rb(at, file, line, expr); \
+
1741 rb.m_failed = failed; \
+
1742 rb.m_decomp = decomp; \
+
1743 failed_out_of_a_testing_context(rb); \
+
1744 if(isDebuggerActive() && !getContextOptions()->no_breaks) \
+
1745 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
1746 if(checkIfShouldThrow(at)) \
+
1747 throwException(); \
+
1748 } \
+
1749 return !failed; \
+
1750 } \
+
1751 } while(false)
+
1752
+
1753#define DOCTEST_ASSERT_IN_TESTS(decomp) \
+
1754 ResultBuilder rb(at, file, line, expr); \
+
1755 rb.m_failed = failed; \
+
1756 if(rb.m_failed || getContextOptions()->success) \
+
1757 rb.m_decomp = decomp; \
+
1758 if(rb.log()) \
+
1759 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
1760 if(rb.m_failed && checkIfShouldThrow(at)) \
+
1761 throwException()
+
1762
+
1763 template <int comparison, typename L, typename R>
+
1764 DOCTEST_NOINLINE bool binary_assert(assertType::Enum at, const char* file, int line,
+
1765 const char* expr, const DOCTEST_REF_WRAP(L) lhs,
+
1766 const DOCTEST_REF_WRAP(R) rhs) {
+
1767 bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
+
1768
+
1769 // ###################################################################################
+
1770 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
1771 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
1772 // ###################################################################################
+
1773 DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
+
1774 DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
+
1775 return !failed;
+
1776 }
+
1777
+
1778 template <typename L>
+
1779 DOCTEST_NOINLINE bool unary_assert(assertType::Enum at, const char* file, int line,
+
1780 const char* expr, const DOCTEST_REF_WRAP(L) val) {
+
1781 bool failed = !val;
+
1782
+
1783 if(at & assertType::is_false)
+
1784 failed = !failed;
+
1785
+
1786 // ###################################################################################
+
1787 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
1788 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
1789 // ###################################################################################
+
1790 DOCTEST_ASSERT_OUT_OF_TESTS((DOCTEST_STRINGIFY(val)));
+
1791 DOCTEST_ASSERT_IN_TESTS((DOCTEST_STRINGIFY(val)));
+
1792 return !failed;
+
1793 }
+
1794
+
+
1795 struct DOCTEST_INTERFACE IExceptionTranslator
+
1796 {
+
1797 DOCTEST_DECLARE_INTERFACE(IExceptionTranslator)
+
1798 virtual bool translate(String&) const = 0;
+
1799 };
+
+
1800
+
1801 template <typename T>
+
+ +
1803 {
+
1804 public:
+
1805 explicit ExceptionTranslator(String (*translateFunction)(T))
+
1806 : m_translateFunction(translateFunction) {}
+
1807
+
1808 bool translate(String& res) const override {
+
1809#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1810 try {
+
1811 throw; // lgtm [cpp/rethrow-no-exception]
+
1812 // cppcheck-suppress catchExceptionByValue
+
1813 } catch(const T& ex) {
+
1814 res = m_translateFunction(ex);
+
1815 return true;
+
1816 } catch(...) {}
+
1817#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1818 static_cast<void>(res); // to silence -Wunused-parameter
+
1819 return false;
+
1820 }
+
1821
+
1822 private:
+
1823 String (*m_translateFunction)(T);
+
1824 };
+
+
1825
+
1826 DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et);
+
1827
+
1828 // ContextScope base class used to allow implementing methods of ContextScope
+
1829 // that don't depend on the template parameter in doctest.cpp.
+
+
1830 struct DOCTEST_INTERFACE ContextScopeBase : public IContextScope {
+
1831 ContextScopeBase(const ContextScopeBase&) = delete;
+
1832
+
1833 ContextScopeBase& operator=(const ContextScopeBase&) = delete;
+
1834 ContextScopeBase& operator=(ContextScopeBase&&) = delete;
+
1835
+
1836 ~ContextScopeBase() override = default;
+
1837
+
1838 protected:
+ +
1840 ContextScopeBase(ContextScopeBase&& other) noexcept;
+
1841
+
1842 void destroy();
+
1843 bool need_to_destroy{true};
+
1844 };
+
+
1845
+
+
1846 template <typename L> class ContextScope : public ContextScopeBase
+
1847 {
+
1848 L lambda_;
+
1849
+
1850 public:
+
1851 explicit ContextScope(const L &lambda) : lambda_(lambda) {}
+
1852 explicit ContextScope(L&& lambda) : lambda_(static_cast<L&&>(lambda)) { }
+
1853
+
1854 ContextScope(const ContextScope&) = delete;
+
1855 ContextScope(ContextScope&&) noexcept = default;
+
1856
+
1857 ContextScope& operator=(const ContextScope&) = delete;
+
1858 ContextScope& operator=(ContextScope&&) = delete;
+
1859
+
1860 void stringify(std::ostream* s) const override { lambda_(s); }
+
1861
+
1862 ~ContextScope() override {
+
1863 if (need_to_destroy) {
+
1864 destroy();
+
1865 }
+
1866 }
+
1867 };
+
+
1868
+
+
1869 struct DOCTEST_INTERFACE MessageBuilder : public MessageData
+
1870 {
+
1871 std::ostream* m_stream;
+
1872 bool logged = false;
+
1873
+
1874 MessageBuilder(const char* file, int line, assertType::Enum severity);
+
1875
+
1876 MessageBuilder(const MessageBuilder&) = delete;
+
1877 MessageBuilder(MessageBuilder&&) = delete;
+
1878
+
1879 MessageBuilder& operator=(const MessageBuilder&) = delete;
+
1880 MessageBuilder& operator=(MessageBuilder&&) = delete;
+
1881
+ +
1883
+
1884 // the preferred way of chaining parameters for stringification
+
1885DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866)
+
1886 template <typename T>
+
1887 MessageBuilder& operator,(const T& in) {
+
1888 *m_stream << (DOCTEST_STRINGIFY(in));
+
1889 return *this;
+
1890 }
+
1891DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1892
+
1893 // kept here just for backwards-compatibility - the comma operator should be preferred now
+
1894 template <typename T>
+
1895 MessageBuilder& operator<<(const T& in) { return this->operator,(in); }
+
1896
+
1897 // the `,` operator has the lowest operator precedence - if `<<` is used by the user then
+
1898 // the `,` operator will be called last which is not what we want and thus the `*` operator
+
1899 // is used first (has higher operator precedence compared to `<<`) so that we guarantee that
+
1900 // an operator of the MessageBuilder class is called first before the rest of the parameters
+
1901 template <typename T>
+
1902 MessageBuilder& operator*(const T& in) { return this->operator,(in); }
+
1903
+
1904 bool log();
+
1905 void react();
+
1906 };
+
+
1907
+
1908 template <typename L>
+
1909 ContextScope<L> MakeContextScope(const L &lambda) {
+
1910 return ContextScope<L>(lambda);
+
1911 }
+
1912} // namespace detail
+
1913
+
1914#define DOCTEST_DEFINE_DECORATOR(name, type, def) \
+
1915 struct name \
+
1916 { \
+
1917 type data; \
+
1918 name(type in = def) \
+
1919 : data(in) {} \
+
1920 void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; } \
+
1921 void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; } \
+
1922 }
+
1923
+
1924DOCTEST_DEFINE_DECORATOR(test_suite, const char*, "");
+
1925DOCTEST_DEFINE_DECORATOR(description, const char*, "");
+
1926DOCTEST_DEFINE_DECORATOR(skip, bool, true);
+
1927DOCTEST_DEFINE_DECORATOR(no_breaks, bool, true);
+
1928DOCTEST_DEFINE_DECORATOR(no_output, bool, true);
+
1929DOCTEST_DEFINE_DECORATOR(timeout, double, 0);
+
1930DOCTEST_DEFINE_DECORATOR(may_fail, bool, true);
+
1931DOCTEST_DEFINE_DECORATOR(should_fail, bool, true);
+
1932DOCTEST_DEFINE_DECORATOR(expected_failures, int, 0);
+
1933
+
1934template <typename T>
+
1935int registerExceptionTranslator(String (*translateFunction)(T)) {
+
1936 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")
+
1937 static detail::ExceptionTranslator<T> exceptionTranslator(translateFunction);
+
1938 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1939 detail::registerExceptionTranslatorImpl(&exceptionTranslator);
+
1940 return 0;
+
1941}
+
1942
+
1943} // namespace doctest
+
1944
+
1945// in a separate namespace outside of doctest because the DOCTEST_TEST_SUITE macro
+
1946// introduces an anonymous namespace in which getCurrentTestSuite gets overridden
+
1947namespace doctest_detail_test_suite_ns {
+
1948DOCTEST_INTERFACE doctest::detail::TestSuite& getCurrentTestSuite();
+
1949} // namespace doctest_detail_test_suite_ns
+
1950
+
1951namespace doctest {
+
1952#else // DOCTEST_CONFIG_DISABLE
+
1953template <typename T>
+
1954int registerExceptionTranslator(String (*)(T)) {
+
1955 return 0;
+
1956}
+
1957#endif // DOCTEST_CONFIG_DISABLE
+
1958
+
1959namespace detail {
+
1960 using assert_handler = void (*)(const AssertData&);
+
1961 struct ContextState;
+
1962} // namespace detail
+
1963
+
+
1964class DOCTEST_INTERFACE Context
+
1965{
+ +
1967
+
1968 void parseArgs(int argc, const char* const* argv, bool withDefaults = false);
+
1969
+
1970public:
+
1971 explicit Context(int argc = 0, const char* const* argv = nullptr);
+
1972
+
1973 Context(const Context&) = delete;
+
1974 Context(Context&&) = delete;
+
1975
+
1976 Context& operator=(const Context&) = delete;
+
1977 Context& operator=(Context&&) = delete;
+
1978
+
1979 ~Context(); // NOLINT(performance-trivially-destructible)
+
1980
+
1981 void applyCommandLine(int argc, const char* const* argv);
+
1982
+
1983 void addFilter(const char* filter, const char* value);
+
1984 void clearFilters();
+
1985 void setOption(const char* option, bool value);
+
1986 void setOption(const char* option, int value);
+
1987 void setOption(const char* option, const char* value);
+
1988
+
1989 bool shouldExit();
+
1990
+
1991 void setAsDefaultForAssertsOutOfTestCases();
+
1992
+
1993 void setAssertHandler(detail::assert_handler ah);
+
1994
+
1995 void setCout(std::ostream* out);
+
1996
+
1997 int run();
+
1998};
+
+
1999
+
2000namespace TestCaseFailureReason {
+
2001 enum Enum
+
2002 {
+
2003 None = 0,
+
2004 AssertFailure = 1, // an assertion has failed in the test case
+
2005 Exception = 2, // test case threw an exception
+
2006 Crash = 4, // a crash...
+
2007 TooManyFailedAsserts = 8, // the abort-after option
+
2008 Timeout = 16, // see the timeout decorator
+
2009 ShouldHaveFailedButDidnt = 32, // see the should_fail decorator
+
2010 ShouldHaveFailedAndDid = 64, // see the should_fail decorator
+
2011 DidntFailExactlyNumTimes = 128, // see the expected_failures decorator
+
2012 FailedExactlyNumTimes = 256, // see the expected_failures decorator
+
2013 CouldHaveFailedAndDid = 512 // see the may_fail decorator
+
2014 };
+
2015} // namespace TestCaseFailureReason
+
2016
+
+
2017struct DOCTEST_INTERFACE CurrentTestCaseStats
+
2018{
+
2019 int numAssertsCurrentTest;
+
2020 int numAssertsFailedCurrentTest;
+
2021 double seconds;
+
2022 int failure_flags; // use TestCaseFailureReason::Enum
+
2023 bool testCaseSuccess;
+
2024};
+
+
2025
+
+
2026struct DOCTEST_INTERFACE TestCaseException
+
2027{
+
2028 String error_string;
+
2029 bool is_crash;
+
2030};
+
+
2031
+
+
2032struct DOCTEST_INTERFACE TestRunStats
+
2033{
+
2034 unsigned numTestCases;
+
2035 unsigned numTestCasesPassingFilters;
+
2036 unsigned numTestSuitesPassingFilters;
+
2037 unsigned numTestCasesFailed;
+
2038 int numAsserts;
+
2039 int numAssertsFailed;
+
2040};
+
+
2041
+
+ +
2043{
+
2044 const TestRunStats* run_stats = nullptr;
+
2045 const TestCaseData** data = nullptr;
+
2046 unsigned num_data = 0;
+
2047};
+
+
2048
+
+
2049struct DOCTEST_INTERFACE IReporter
+
2050{
+
2051 // The constructor has to accept "const ContextOptions&" as a single argument
+
2052 // which has most of the options for the run + a pointer to the stdout stream
+
2053 // Reporter(const ContextOptions& in)
+
2054
+
2055 // called when a query should be reported (listing test cases, printing the version, etc.)
+
2056 virtual void report_query(const QueryData&) = 0;
+
2057
+
2058 // called when the whole test run starts
+
2059 virtual void test_run_start() = 0;
+
2060 // called when the whole test run ends (caching a pointer to the input doesn't make sense here)
+
2061 virtual void test_run_end(const TestRunStats&) = 0;
+
2062
+
2063 // called when a test case is started (safe to cache a pointer to the input)
+
2064 virtual void test_case_start(const TestCaseData&) = 0;
+
2065 // called when a test case is reentered because of unfinished subcases (safe to cache a pointer to the input)
+
2066 virtual void test_case_reenter(const TestCaseData&) = 0;
+
2067 // called when a test case has ended
+
2068 virtual void test_case_end(const CurrentTestCaseStats&) = 0;
+
2069
+
2070 // called when an exception is thrown from the test case (or it crashes)
+
2071 virtual void test_case_exception(const TestCaseException&) = 0;
+
2072
+
2073 // called whenever a subcase is entered (don't cache pointers to the input)
+
2074 virtual void subcase_start(const SubcaseSignature&) = 0;
+
2075 // called whenever a subcase is exited (don't cache pointers to the input)
+
2076 virtual void subcase_end() = 0;
+
2077
+
2078 // called for each assert (don't cache pointers to the input)
+
2079 virtual void log_assert(const AssertData&) = 0;
+
2080 // called for each message (don't cache pointers to the input)
+
2081 virtual void log_message(const MessageData&) = 0;
+
2082
+
2083 // called when a test case is skipped either because it doesn't pass the filters, has a skip decorator
+
2084 // or isn't in the execution range (between first and last) (safe to cache a pointer to the input)
+
2085 virtual void test_case_skipped(const TestCaseData&) = 0;
+
2086
+
2087 DOCTEST_DECLARE_INTERFACE(IReporter)
+
2088
+
2089 // can obtain all currently active contexts and stringify them if one wishes to do so
+
2090 static int get_num_active_contexts();
+
2091 static const IContextScope* const* get_active_contexts();
+
2092
+
2093 // can iterate through contexts which have been stringified automatically in their destructors when an exception has been thrown
+
2094 static int get_num_stringified_contexts();
+
2095 static const String* get_stringified_contexts();
+
2096};
+
+
2097
+
2098namespace detail {
+
2099 using reporterCreatorFunc = IReporter* (*)(const ContextOptions&);
+
2100
+
2101 DOCTEST_INTERFACE void registerReporterImpl(const char* name, int prio, reporterCreatorFunc c, bool isReporter);
+
2102
+
2103 template <typename Reporter>
+
2104 IReporter* reporterCreator(const ContextOptions& o) {
+
2105 return new Reporter(o);
+
2106 }
+
2107} // namespace detail
+
2108
+
2109template <typename Reporter>
+
2110int registerReporter(const char* name, int priority, bool isReporter) {
+
2111 detail::registerReporterImpl(name, priority, detail::reporterCreator<Reporter>, isReporter);
+
2112 return 0;
+
2113}
+
2114} // namespace doctest
+
2115
+
2116#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
+
2117#define DOCTEST_FUNC_EMPTY [] { return false; }()
+
2118#else
+
2119#define DOCTEST_FUNC_EMPTY (void)0
+
2120#endif
+
2121
+
2122// if registering is not disabled
+
2123#ifndef DOCTEST_CONFIG_DISABLE
+
2124
+
2125#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
+
2126#define DOCTEST_FUNC_SCOPE_BEGIN [&]
+
2127#define DOCTEST_FUNC_SCOPE_END ()
+
2128#define DOCTEST_FUNC_SCOPE_RET(v) return v
+
2129#else
+
2130#define DOCTEST_FUNC_SCOPE_BEGIN do
+
2131#define DOCTEST_FUNC_SCOPE_END while(false)
+
2132#define DOCTEST_FUNC_SCOPE_RET(v) (void)0
+
2133#endif
+
2134
+
2135// common code in asserts - for convenience
+
2136#define DOCTEST_ASSERT_LOG_REACT_RETURN(b) \
+
2137 if(b.log()) DOCTEST_BREAK_INTO_DEBUGGER(); \
+
2138 b.react(); \
+
2139 DOCTEST_FUNC_SCOPE_RET(!b.m_failed)
+
2140
+
2141#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2142#define DOCTEST_WRAP_IN_TRY(x) x;
+
2143#else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2144#define DOCTEST_WRAP_IN_TRY(x) \
+
2145 try { \
+
2146 x; \
+
2147 } catch(...) { DOCTEST_RB.translateException(); }
+
2148#endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2149
+
2150#ifdef DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2151#define DOCTEST_CAST_TO_VOID(...) \
+
2152 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wuseless-cast") \
+
2153 static_cast<void>(__VA_ARGS__); \
+
2154 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
2155#else // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2156#define DOCTEST_CAST_TO_VOID(...) __VA_ARGS__;
+
2157#endif // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2158
+
2159// registers the test by initializing a dummy var with a function
+
2160#define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators) \
+
2161 global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT */ \
+
2162 doctest::detail::regTest( \
+
2163 doctest::detail::TestCase( \
+
2164 f, __FILE__, __LINE__, \
+
2165 doctest_detail_test_suite_ns::getCurrentTestSuite()) * \
+
2166 decorators))
+
2167
+
2168#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators) \
+
2169 namespace { /* NOLINT */ \
+
2170 struct der : public base \
+
2171 { \
+
2172 void f(); \
+
2173 }; \
+
2174 static DOCTEST_INLINE_NOINLINE void func() { \
+
2175 der v; \
+
2176 v.f(); \
+
2177 } \
+
2178 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \
+
2179 } \
+
2180 DOCTEST_INLINE_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers)
+
2181
+
2182#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \
+
2183 static void f(); \
+
2184 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, f, decorators) \
+
2185 static void f()
+
2186
+
2187#define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators) \
+
2188 static doctest::detail::funcType proxy() { return f; } \
+
2189 DOCTEST_REGISTER_FUNCTION(inline, proxy(), decorators) \
+
2190 static void f()
+
2191
+
2192// for registering tests
+
2193#define DOCTEST_TEST_CASE(decorators) \
+
2194 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
+
2195
+
2196// for registering tests in classes - requires C++17 for inline variables!
+
2197#if DOCTEST_CPLUSPLUS >= 201703L
+
2198#define DOCTEST_TEST_CASE_CLASS(decorators) \
+
2199 DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), \
+
2200 DOCTEST_ANONYMOUS(DOCTEST_ANON_PROXY_), \
+
2201 decorators)
+
2202#else // DOCTEST_TEST_CASE_CLASS
+
2203#define DOCTEST_TEST_CASE_CLASS(...) \
+
2204 TEST_CASES_CAN_BE_REGISTERED_IN_CLASSES_ONLY_IN_CPP17_MODE_OR_WITH_VS_2017_OR_NEWER
+
2205#endif // DOCTEST_TEST_CASE_CLASS
+
2206
+
2207// for registering tests with a fixture
+
2208#define DOCTEST_TEST_CASE_FIXTURE(c, decorators) \
+
2209 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), c, \
+
2210 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
+
2211
+
2212// for converting types to strings without the <typeinfo> header and demangling
+
2213#define DOCTEST_TYPE_TO_STRING_AS(str, ...) \
+
2214 namespace doctest { \
+
2215 template <> \
+
2216 inline String toString<__VA_ARGS__>() { \
+
2217 return str; \
+
2218 } \
+
2219 } \
+
2220 static_assert(true, "")
+
2221
+
2222#define DOCTEST_TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING_AS(#__VA_ARGS__, __VA_ARGS__)
+
2223
+
2224#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func) \
+
2225 template <typename T> \
+
2226 static void func(); \
+
2227 namespace { /* NOLINT */ \
+
2228 template <typename Tuple> \
+
2229 struct iter; \
+
2230 template <typename Type, typename... Rest> \
+
2231 struct iter<std::tuple<Type, Rest...>> \
+
2232 { \
+
2233 iter(const char* file, unsigned line, int index) { \
+
2234 doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line, \
+
2235 doctest_detail_test_suite_ns::getCurrentTestSuite(), \
+
2236 doctest::toString<Type>(), \
+
2237 int(line) * 1000 + index) \
+
2238 * dec); \
+
2239 iter<std::tuple<Rest...>>(file, line, index + 1); \
+
2240 } \
+
2241 }; \
+
2242 template <> \
+
2243 struct iter<std::tuple<>> \
+
2244 { \
+
2245 iter(const char*, unsigned, int) {} \
+
2246 }; \
+
2247 } \
+
2248 template <typename T> \
+
2249 static void func()
+
2250
+
2251#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id) \
+
2252 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(id, ITERATOR), \
+
2253 DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_))
+
2254
+
2255#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...) \
+
2256 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY), /* NOLINT(cert-err58-cpp, fuchsia-statically-constructed-objects) */ \
+
2257 doctest::detail::instantiationHelper( \
+
2258 DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0)))
+
2259
+
2260#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) \
+
2261 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), std::tuple<__VA_ARGS__>) \
+
2262 static_assert(true, "")
+
2263
+
2264#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) \
+
2265 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__) \
+
2266 static_assert(true, "")
+
2267
+
2268#define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...) \
+
2269 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(anon, ITERATOR), anon); \
+
2270 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, std::tuple<__VA_ARGS__>) \
+
2271 template <typename T> \
+
2272 static void anon()
+
2273
+
2274#define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...) \
+
2275 DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__)
+
2276
+
2277// for subcases
+
2278#define DOCTEST_SUBCASE(name) \
+
2279 if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \
+
2280 doctest::detail::Subcase(name, __FILE__, __LINE__))
+
2281
+
2282// for grouping tests in test suites by using code blocks
+
2283#define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name) \
+
2284 namespace ns_name { namespace doctest_detail_test_suite_ns { \
+
2285 static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() noexcept { \
+
2286 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640) \
+
2287 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors") \
+
2288 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmissing-field-initializers") \
+
2289 static doctest::detail::TestSuite data{}; \
+
2290 static bool inited = false; \
+
2291 DOCTEST_MSVC_SUPPRESS_WARNING_POP \
+
2292 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
+
2293 DOCTEST_GCC_SUPPRESS_WARNING_POP \
+
2294 if(!inited) { \
+
2295 data* decorators; \
+
2296 inited = true; \
+
2297 } \
+
2298 return data; \
+
2299 } \
+
2300 } \
+
2301 } \
+
2302 namespace ns_name
+
2303
+
2304#define DOCTEST_TEST_SUITE(decorators) \
+
2305 DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(DOCTEST_ANON_SUITE_))
+
2306
+
2307// for starting a testsuite block
+
2308#define DOCTEST_TEST_SUITE_BEGIN(decorators) \
+
2309 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \
+
2310 doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators)) \
+
2311 static_assert(true, "")
+
2312
+
2313// for ending a testsuite block
+
2314#define DOCTEST_TEST_SUITE_END \
+
2315 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \
+
2316 doctest::detail::setTestSuite(doctest::detail::TestSuite() * "")) \
+
2317 using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
+
2318
+
2319// for registering exception translators
+
2320#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature) \
+
2321 inline doctest::String translatorName(signature); \
+
2322 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), /* NOLINT(cert-err58-cpp) */ \
+
2323 doctest::registerExceptionTranslator(translatorName)) \
+
2324 doctest::String translatorName(signature)
+
2325
+
2326#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
+
2327 DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), \
+
2328 signature)
+
2329
+
2330// for registering reporters
+
2331#define DOCTEST_REGISTER_REPORTER(name, priority, reporter) \
+
2332 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \
+
2333 doctest::registerReporter<reporter>(name, priority, true)) \
+
2334 static_assert(true, "")
+
2335
+
2336// for registering listeners
+
2337#define DOCTEST_REGISTER_LISTENER(name, priority, reporter) \
+
2338 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \
+
2339 doctest::registerReporter<reporter>(name, priority, false)) \
+
2340 static_assert(true, "")
+
2341
+
2342// clang-format off
+
2343// for logging - disabling formatting because it's important to have these on 2 separate lines - see PR #557
+
2344#define DOCTEST_INFO(...) \
+
2345 DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_), \
+
2346 DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_OTHER_), \
+
2347 __VA_ARGS__)
+
2348// clang-format on
+
2349
+
2350#define DOCTEST_INFO_IMPL(mb_name, s_name, ...) \
+
2351 auto DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_) = doctest::detail::MakeContextScope( \
+
2352 [&](std::ostream* s_name) { \
+
2353 doctest::detail::MessageBuilder mb_name(__FILE__, __LINE__, doctest::assertType::is_warn); \
+
2354 mb_name.m_stream = s_name; \
+
2355 mb_name * __VA_ARGS__; \
+
2356 })
+
2357
+
2358#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x)
+
2359
+
2360#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \
+
2361 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2362 doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \
+
2363 mb * __VA_ARGS__; \
+
2364 if(mb.log()) \
+
2365 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
2366 mb.react(); \
+
2367 } DOCTEST_FUNC_SCOPE_END
+
2368
+
2369// clang-format off
+
2370#define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2371#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2372#define DOCTEST_ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2373// clang-format on
+
2374
+
2375#define DOCTEST_MESSAGE(...) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2376#define DOCTEST_FAIL_CHECK(...) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2377#define DOCTEST_FAIL(...) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2378
+
2379#define DOCTEST_TO_LVALUE(...) __VA_ARGS__ // Not removed to keep backwards compatibility.
+
2380
+
2381#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2382
+
2383#define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...) \
+
2384 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
+
2385 /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \
+
2386 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2387 __LINE__, #__VA_ARGS__); \
+
2388 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \
+
2389 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
+
2390 << __VA_ARGS__)) /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \
+
2391 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB) \
+
2392 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
2393
+
2394#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
+
2395 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2396 DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \
+
2397 } DOCTEST_FUNC_SCOPE_END // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
2398
+
2399#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \
+
2400 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2401 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2402 __LINE__, #__VA_ARGS__); \
+
2403 DOCTEST_WRAP_IN_TRY( \
+
2404 DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \
+
2405 __VA_ARGS__)) \
+
2406 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2407 } DOCTEST_FUNC_SCOPE_END
+
2408
+
2409#define DOCTEST_UNARY_ASSERT(assert_type, ...) \
+
2410 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2411 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2412 __LINE__, #__VA_ARGS__); \
+
2413 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \
+
2414 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2415 } DOCTEST_FUNC_SCOPE_END
+
2416
+
2417#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2418
+
2419// necessary for <ASSERT>_MESSAGE
+
2420#define DOCTEST_ASSERT_IMPLEMENT_2 DOCTEST_ASSERT_IMPLEMENT_1
+
2421
+
2422#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
+
2423 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
+
2424 doctest::detail::decomp_assert( \
+
2425 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, \
+
2426 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
+
2427 << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
2428
+
2429#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \
+
2430 doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \
+
2431 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)
+
2432
+
2433#define DOCTEST_UNARY_ASSERT(assert_type, ...) \
+
2434 doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \
+
2435 #__VA_ARGS__, __VA_ARGS__)
+
2436
+
2437#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2438
+
2439#define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)
+
2440#define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)
+
2441#define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)
+
2442#define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)
+
2443#define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)
+
2444#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
+
2445
+
2446// clang-format off
+
2447#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } DOCTEST_FUNC_SCOPE_END
+
2448#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } DOCTEST_FUNC_SCOPE_END
+
2449#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } DOCTEST_FUNC_SCOPE_END
+
2450#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2451#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2452#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2453// clang-format on
+
2454
+
2455#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)
+
2456#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)
+
2457#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)
+
2458#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)
+
2459#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)
+
2460#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)
+
2461#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)
+
2462#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)
+
2463#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)
+
2464#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)
+
2465#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)
+
2466#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)
+
2467#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)
+
2468#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)
+
2469#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)
+
2470#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)
+
2471#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)
+
2472#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)
+
2473
+
2474#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)
+
2475#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)
+
2476#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)
+
2477#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)
+
2478#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)
+
2479#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)
+
2480
+
2481#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2482
+
2483#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \
+
2484 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2485 if(!doctest::getContextOptions()->no_throw) { \
+
2486 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2487 __LINE__, #expr, #__VA_ARGS__, message); \
+
2488 try { \
+
2489 DOCTEST_CAST_TO_VOID(expr) \
+
2490 } catch(const typename doctest::detail::types::remove_const< \
+
2491 typename doctest::detail::types::remove_reference<__VA_ARGS__>::type>::type&) {\
+
2492 DOCTEST_RB.translateException(); \
+
2493 DOCTEST_RB.m_threw_as = true; \
+
2494 } catch(...) { DOCTEST_RB.translateException(); } \
+
2495 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2496 } else { /* NOLINT(*-else-after-return) */ \
+
2497 DOCTEST_FUNC_SCOPE_RET(false); \
+
2498 } \
+
2499 } DOCTEST_FUNC_SCOPE_END
+
2500
+
2501#define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \
+
2502 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2503 if(!doctest::getContextOptions()->no_throw) { \
+
2504 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2505 __LINE__, expr_str, "", __VA_ARGS__); \
+
2506 try { \
+
2507 DOCTEST_CAST_TO_VOID(expr) \
+
2508 } catch(...) { DOCTEST_RB.translateException(); } \
+
2509 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2510 } else { /* NOLINT(*-else-after-return) */ \
+
2511 DOCTEST_FUNC_SCOPE_RET(false); \
+
2512 } \
+
2513 } DOCTEST_FUNC_SCOPE_END
+
2514
+
2515#define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \
+
2516 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2517 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2518 __LINE__, #__VA_ARGS__); \
+
2519 try { \
+
2520 DOCTEST_CAST_TO_VOID(__VA_ARGS__) \
+
2521 } catch(...) { DOCTEST_RB.translateException(); } \
+
2522 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2523 } DOCTEST_FUNC_SCOPE_END
+
2524
+
2525// clang-format off
+
2526#define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "")
+
2527#define DOCTEST_CHECK_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_CHECK_THROWS, "")
+
2528#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_REQUIRE_THROWS, "")
+
2529
+
2530#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, "", __VA_ARGS__)
+
2531#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, "", __VA_ARGS__)
+
2532#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, "", __VA_ARGS__)
+
2533
+
2534#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_WARN_THROWS_WITH, __VA_ARGS__)
+
2535#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)
+
2536#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)
+
2537
+
2538#define DOCTEST_WARN_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_WITH_AS, message, __VA_ARGS__)
+
2539#define DOCTEST_CHECK_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_WITH_AS, message, __VA_ARGS__)
+
2540#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_WITH_AS, message, __VA_ARGS__)
+
2541
+
2542#define DOCTEST_WARN_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_WARN_NOTHROW, __VA_ARGS__)
+
2543#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__)
+
2544#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__)
+
2545
+
2546#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2547#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2548#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2549#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2550#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2551#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2552#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2553#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2554#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2555#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2556#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2557#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2558#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2559#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2560#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2561// clang-format on
+
2562
+
2563#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2564
+
2565// =================================================================================================
+
2566// == WHAT FOLLOWS IS VERSIONS OF THE MACROS THAT DO NOT DO ANY REGISTERING! ==
+
2567// == THIS CAN BE ENABLED BY DEFINING DOCTEST_CONFIG_DISABLE GLOBALLY! ==
+
2568// =================================================================================================
+
2569#else // DOCTEST_CONFIG_DISABLE
+
2570
+
2571#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name) \
+
2572 namespace /* NOLINT */ { \
+
2573 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2574 struct der : public base \
+
2575 { void f(); }; \
+
2576 } \
+
2577 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2578 inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()
+
2579
+
2580#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name) \
+
2581 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2582 static inline void f()
+
2583
+
2584// for registering tests
+
2585#define DOCTEST_TEST_CASE(name) \
+
2586 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2587
+
2588// for registering tests in classes
+
2589#define DOCTEST_TEST_CASE_CLASS(name) \
+
2590 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2591
+
2592// for registering tests with a fixture
+
2593#define DOCTEST_TEST_CASE_FIXTURE(x, name) \
+
2594 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), x, \
+
2595 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2596
+
2597// for converting types to strings without the <typeinfo> header and demangling
+
2598#define DOCTEST_TYPE_TO_STRING_AS(str, ...) static_assert(true, "")
+
2599#define DOCTEST_TYPE_TO_STRING(...) static_assert(true, "")
+
2600
+
2601// for typed tests
+
2602#define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...) \
+
2603 template <typename type> \
+
2604 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
+
2605
+
2606#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id) \
+
2607 template <typename type> \
+
2608 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
+
2609
+
2610#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) static_assert(true, "")
+
2611#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) static_assert(true, "")
+
2612
+
2613// for subcases
+
2614#define DOCTEST_SUBCASE(name)
+
2615
+
2616// for a testsuite block
+
2617#define DOCTEST_TEST_SUITE(name) namespace // NOLINT
+
2618
+
2619// for starting a testsuite block
+
2620#define DOCTEST_TEST_SUITE_BEGIN(name) static_assert(true, "")
+
2621
+
2622// for ending a testsuite block
+
2623#define DOCTEST_TEST_SUITE_END using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
+
2624
+
2625#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
+
2626 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2627 static inline doctest::String DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_)(signature)
+
2628
+
2629#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
+
2630#define DOCTEST_REGISTER_LISTENER(name, priority, reporter)
+
2631
+
2632#define DOCTEST_INFO(...) (static_cast<void>(0))
+
2633#define DOCTEST_CAPTURE(x) (static_cast<void>(0))
+
2634#define DOCTEST_ADD_MESSAGE_AT(file, line, ...) (static_cast<void>(0))
+
2635#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) (static_cast<void>(0))
+
2636#define DOCTEST_ADD_FAIL_AT(file, line, ...) (static_cast<void>(0))
+
2637#define DOCTEST_MESSAGE(...) (static_cast<void>(0))
+
2638#define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0))
+
2639#define DOCTEST_FAIL(...) (static_cast<void>(0))
+
2640
+
2641#if defined(DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED) \
+
2642 && defined(DOCTEST_CONFIG_ASSERTS_RETURN_VALUES)
+
2643
+
2644#define DOCTEST_WARN(...) [&] { return __VA_ARGS__; }()
+
2645#define DOCTEST_CHECK(...) [&] { return __VA_ARGS__; }()
+
2646#define DOCTEST_REQUIRE(...) [&] { return __VA_ARGS__; }()
+
2647#define DOCTEST_WARN_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2648#define DOCTEST_CHECK_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2649#define DOCTEST_REQUIRE_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2650
+
2651#define DOCTEST_WARN_MESSAGE(cond, ...) [&] { return cond; }()
+
2652#define DOCTEST_CHECK_MESSAGE(cond, ...) [&] { return cond; }()
+
2653#define DOCTEST_REQUIRE_MESSAGE(cond, ...) [&] { return cond; }()
+
2654#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2655#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2656#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2657
+
2658namespace doctest {
+
2659namespace detail {
+
2660#define DOCTEST_RELATIONAL_OP(name, op) \
+
2661 template <typename L, typename R> \
+
2662 bool name(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) { return lhs op rhs; }
+
2663
+
2664 DOCTEST_RELATIONAL_OP(eq, ==)
+
2665 DOCTEST_RELATIONAL_OP(ne, !=)
+
2666 DOCTEST_RELATIONAL_OP(lt, <)
+
2667 DOCTEST_RELATIONAL_OP(gt, >)
+
2668 DOCTEST_RELATIONAL_OP(le, <=)
+
2669 DOCTEST_RELATIONAL_OP(ge, >=)
+
2670} // namespace detail
+
2671} // namespace doctest
+
2672
+
2673#define DOCTEST_WARN_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2674#define DOCTEST_CHECK_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2675#define DOCTEST_REQUIRE_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2676#define DOCTEST_WARN_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2677#define DOCTEST_CHECK_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2678#define DOCTEST_REQUIRE_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2679#define DOCTEST_WARN_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2680#define DOCTEST_CHECK_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2681#define DOCTEST_REQUIRE_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2682#define DOCTEST_WARN_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2683#define DOCTEST_CHECK_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2684#define DOCTEST_REQUIRE_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2685#define DOCTEST_WARN_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2686#define DOCTEST_CHECK_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2687#define DOCTEST_REQUIRE_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2688#define DOCTEST_WARN_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2689#define DOCTEST_CHECK_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2690#define DOCTEST_REQUIRE_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2691#define DOCTEST_WARN_UNARY(...) [&] { return __VA_ARGS__; }()
+
2692#define DOCTEST_CHECK_UNARY(...) [&] { return __VA_ARGS__; }()
+
2693#define DOCTEST_REQUIRE_UNARY(...) [&] { return __VA_ARGS__; }()
+
2694#define DOCTEST_WARN_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2695#define DOCTEST_CHECK_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2696#define DOCTEST_REQUIRE_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2697
+
2698#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2699
+
2700#define DOCTEST_WARN_THROWS_WITH(expr, with, ...) [] { static_assert(false, "Exception translation is not available when doctest is disabled."); return false; }()
+
2701#define DOCTEST_CHECK_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2702#define DOCTEST_REQUIRE_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2703#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2704#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2705#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2706
+
2707#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2708#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2709#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2710#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2711#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2712#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2713
+
2714#define DOCTEST_WARN_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2715#define DOCTEST_CHECK_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2716#define DOCTEST_REQUIRE_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2717#define DOCTEST_WARN_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2718#define DOCTEST_CHECK_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2719#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2720#define DOCTEST_WARN_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2721#define DOCTEST_CHECK_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2722#define DOCTEST_REQUIRE_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2723
+
2724#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2725#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2726#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2727#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2728#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2729#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2730#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2731#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2732#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2733
+
2734#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2735
+
2736#else // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
+
2737
+
2738#define DOCTEST_WARN(...) DOCTEST_FUNC_EMPTY
+
2739#define DOCTEST_CHECK(...) DOCTEST_FUNC_EMPTY
+
2740#define DOCTEST_REQUIRE(...) DOCTEST_FUNC_EMPTY
+
2741#define DOCTEST_WARN_FALSE(...) DOCTEST_FUNC_EMPTY
+
2742#define DOCTEST_CHECK_FALSE(...) DOCTEST_FUNC_EMPTY
+
2743#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_FUNC_EMPTY
+
2744
+
2745#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2746#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2747#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2748#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2749#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2750#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2751
+
2752#define DOCTEST_WARN_EQ(...) DOCTEST_FUNC_EMPTY
+
2753#define DOCTEST_CHECK_EQ(...) DOCTEST_FUNC_EMPTY
+
2754#define DOCTEST_REQUIRE_EQ(...) DOCTEST_FUNC_EMPTY
+
2755#define DOCTEST_WARN_NE(...) DOCTEST_FUNC_EMPTY
+
2756#define DOCTEST_CHECK_NE(...) DOCTEST_FUNC_EMPTY
+
2757#define DOCTEST_REQUIRE_NE(...) DOCTEST_FUNC_EMPTY
+
2758#define DOCTEST_WARN_GT(...) DOCTEST_FUNC_EMPTY
+
2759#define DOCTEST_CHECK_GT(...) DOCTEST_FUNC_EMPTY
+
2760#define DOCTEST_REQUIRE_GT(...) DOCTEST_FUNC_EMPTY
+
2761#define DOCTEST_WARN_LT(...) DOCTEST_FUNC_EMPTY
+
2762#define DOCTEST_CHECK_LT(...) DOCTEST_FUNC_EMPTY
+
2763#define DOCTEST_REQUIRE_LT(...) DOCTEST_FUNC_EMPTY
+
2764#define DOCTEST_WARN_GE(...) DOCTEST_FUNC_EMPTY
+
2765#define DOCTEST_CHECK_GE(...) DOCTEST_FUNC_EMPTY
+
2766#define DOCTEST_REQUIRE_GE(...) DOCTEST_FUNC_EMPTY
+
2767#define DOCTEST_WARN_LE(...) DOCTEST_FUNC_EMPTY
+
2768#define DOCTEST_CHECK_LE(...) DOCTEST_FUNC_EMPTY
+
2769#define DOCTEST_REQUIRE_LE(...) DOCTEST_FUNC_EMPTY
+
2770
+
2771#define DOCTEST_WARN_UNARY(...) DOCTEST_FUNC_EMPTY
+
2772#define DOCTEST_CHECK_UNARY(...) DOCTEST_FUNC_EMPTY
+
2773#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_FUNC_EMPTY
+
2774#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2775#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2776#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2777
+
2778#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2779
+
2780#define DOCTEST_WARN_THROWS(...) DOCTEST_FUNC_EMPTY
+
2781#define DOCTEST_CHECK_THROWS(...) DOCTEST_FUNC_EMPTY
+
2782#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_FUNC_EMPTY
+
2783#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2784#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2785#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2786#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2787#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2788#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2789#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2790#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2791#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2792#define DOCTEST_WARN_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2793#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2794#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2795
+
2796#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2797#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2798#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2799#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2800#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2801#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2802#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2803#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2804#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2805#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2806#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2807#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2808#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2809#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2810#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2811
+
2812#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2813
+
2814#endif // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
+
2815
+
2816#endif // DOCTEST_CONFIG_DISABLE
+
2817
+
2818#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2819
+
2820#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2821#define DOCTEST_EXCEPTION_EMPTY_FUNC DOCTEST_FUNC_EMPTY
+
2822#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2823#define DOCTEST_EXCEPTION_EMPTY_FUNC [] { static_assert(false, "Exceptions are disabled! " \
+
2824 "Use DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS if you want to compile with exceptions disabled."); return false; }()
+
2825
+
2826#undef DOCTEST_REQUIRE
+
2827#undef DOCTEST_REQUIRE_FALSE
+
2828#undef DOCTEST_REQUIRE_MESSAGE
+
2829#undef DOCTEST_REQUIRE_FALSE_MESSAGE
+
2830#undef DOCTEST_REQUIRE_EQ
+
2831#undef DOCTEST_REQUIRE_NE
+
2832#undef DOCTEST_REQUIRE_GT
+
2833#undef DOCTEST_REQUIRE_LT
+
2834#undef DOCTEST_REQUIRE_GE
+
2835#undef DOCTEST_REQUIRE_LE
+
2836#undef DOCTEST_REQUIRE_UNARY
+
2837#undef DOCTEST_REQUIRE_UNARY_FALSE
+
2838
+
2839#define DOCTEST_REQUIRE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2840#define DOCTEST_REQUIRE_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2841#define DOCTEST_REQUIRE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2842#define DOCTEST_REQUIRE_FALSE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2843#define DOCTEST_REQUIRE_EQ DOCTEST_EXCEPTION_EMPTY_FUNC
+
2844#define DOCTEST_REQUIRE_NE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2845#define DOCTEST_REQUIRE_GT DOCTEST_EXCEPTION_EMPTY_FUNC
+
2846#define DOCTEST_REQUIRE_LT DOCTEST_EXCEPTION_EMPTY_FUNC
+
2847#define DOCTEST_REQUIRE_GE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2848#define DOCTEST_REQUIRE_LE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2849#define DOCTEST_REQUIRE_UNARY DOCTEST_EXCEPTION_EMPTY_FUNC
+
2850#define DOCTEST_REQUIRE_UNARY_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2851
+
2852#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2853
+
2854#define DOCTEST_WARN_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2855#define DOCTEST_CHECK_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2856#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2857#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2858#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2859#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2860#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2861#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2862#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2863#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2864#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2865#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2866#define DOCTEST_WARN_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2867#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2868#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2869
+
2870#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2871#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2872#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2873#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2874#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2875#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2876#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2877#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2878#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2879#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2880#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2881#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2882#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2883#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2884#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2885
+
2886#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2887
+
2888// clang-format off
+
2889// KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS
+
2890#define DOCTEST_FAST_WARN_EQ DOCTEST_WARN_EQ
+
2891#define DOCTEST_FAST_CHECK_EQ DOCTEST_CHECK_EQ
+
2892#define DOCTEST_FAST_REQUIRE_EQ DOCTEST_REQUIRE_EQ
+
2893#define DOCTEST_FAST_WARN_NE DOCTEST_WARN_NE
+
2894#define DOCTEST_FAST_CHECK_NE DOCTEST_CHECK_NE
+
2895#define DOCTEST_FAST_REQUIRE_NE DOCTEST_REQUIRE_NE
+
2896#define DOCTEST_FAST_WARN_GT DOCTEST_WARN_GT
+
2897#define DOCTEST_FAST_CHECK_GT DOCTEST_CHECK_GT
+
2898#define DOCTEST_FAST_REQUIRE_GT DOCTEST_REQUIRE_GT
+
2899#define DOCTEST_FAST_WARN_LT DOCTEST_WARN_LT
+
2900#define DOCTEST_FAST_CHECK_LT DOCTEST_CHECK_LT
+
2901#define DOCTEST_FAST_REQUIRE_LT DOCTEST_REQUIRE_LT
+
2902#define DOCTEST_FAST_WARN_GE DOCTEST_WARN_GE
+
2903#define DOCTEST_FAST_CHECK_GE DOCTEST_CHECK_GE
+
2904#define DOCTEST_FAST_REQUIRE_GE DOCTEST_REQUIRE_GE
+
2905#define DOCTEST_FAST_WARN_LE DOCTEST_WARN_LE
+
2906#define DOCTEST_FAST_CHECK_LE DOCTEST_CHECK_LE
+
2907#define DOCTEST_FAST_REQUIRE_LE DOCTEST_REQUIRE_LE
+
2908
+
2909#define DOCTEST_FAST_WARN_UNARY DOCTEST_WARN_UNARY
+
2910#define DOCTEST_FAST_CHECK_UNARY DOCTEST_CHECK_UNARY
+
2911#define DOCTEST_FAST_REQUIRE_UNARY DOCTEST_REQUIRE_UNARY
+
2912#define DOCTEST_FAST_WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE
+
2913#define DOCTEST_FAST_CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE
+
2914#define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
+
2915
+
2916#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id,__VA_ARGS__)
+
2917// clang-format on
+
2918
+
2919// BDD style macros
+
2920// clang-format off
+
2921#define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE(" Scenario: " name)
+
2922#define DOCTEST_SCENARIO_CLASS(name) DOCTEST_TEST_CASE_CLASS(" Scenario: " name)
+
2923#define DOCTEST_SCENARIO_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(" Scenario: " name, T, __VA_ARGS__)
+
2924#define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(" Scenario: " name, T, id)
+
2925
+
2926#define DOCTEST_GIVEN(name) DOCTEST_SUBCASE(" Given: " name)
+
2927#define DOCTEST_WHEN(name) DOCTEST_SUBCASE(" When: " name)
+
2928#define DOCTEST_AND_WHEN(name) DOCTEST_SUBCASE("And when: " name)
+
2929#define DOCTEST_THEN(name) DOCTEST_SUBCASE(" Then: " name)
+
2930#define DOCTEST_AND_THEN(name) DOCTEST_SUBCASE(" And: " name)
+
2931// clang-format on
+
2932
+
2933// == SHORT VERSIONS OF THE MACROS
+
2934#ifndef DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
2935
+
2936#define TEST_CASE(name) DOCTEST_TEST_CASE(name)
+
2937#define TEST_CASE_CLASS(name) DOCTEST_TEST_CASE_CLASS(name)
+
2938#define TEST_CASE_FIXTURE(x, name) DOCTEST_TEST_CASE_FIXTURE(x, name)
+
2939#define TYPE_TO_STRING_AS(str, ...) DOCTEST_TYPE_TO_STRING_AS(str, __VA_ARGS__)
+
2940#define TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING(__VA_ARGS__)
+
2941#define TEST_CASE_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(name, T, __VA_ARGS__)
+
2942#define TEST_CASE_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, T, id)
+
2943#define TEST_CASE_TEMPLATE_INVOKE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, __VA_ARGS__)
+
2944#define TEST_CASE_TEMPLATE_APPLY(id, ...) DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, __VA_ARGS__)
+
2945#define SUBCASE(name) DOCTEST_SUBCASE(name)
+
2946#define TEST_SUITE(decorators) DOCTEST_TEST_SUITE(decorators)
+
2947#define TEST_SUITE_BEGIN(name) DOCTEST_TEST_SUITE_BEGIN(name)
+
2948#define TEST_SUITE_END DOCTEST_TEST_SUITE_END
+
2949#define REGISTER_EXCEPTION_TRANSLATOR(signature) DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)
+
2950#define REGISTER_REPORTER(name, priority, reporter) DOCTEST_REGISTER_REPORTER(name, priority, reporter)
+
2951#define REGISTER_LISTENER(name, priority, reporter) DOCTEST_REGISTER_LISTENER(name, priority, reporter)
+
2952#define INFO(...) DOCTEST_INFO(__VA_ARGS__)
+
2953#define CAPTURE(x) DOCTEST_CAPTURE(x)
+
2954#define ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_MESSAGE_AT(file, line, __VA_ARGS__)
+
2955#define ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_FAIL_CHECK_AT(file, line, __VA_ARGS__)
+
2956#define ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_FAIL_AT(file, line, __VA_ARGS__)
+
2957#define MESSAGE(...) DOCTEST_MESSAGE(__VA_ARGS__)
+
2958#define FAIL_CHECK(...) DOCTEST_FAIL_CHECK(__VA_ARGS__)
+
2959#define FAIL(...) DOCTEST_FAIL(__VA_ARGS__)
+
2960#define TO_LVALUE(...) DOCTEST_TO_LVALUE(__VA_ARGS__)
+
2961
+
2962#define WARN(...) DOCTEST_WARN(__VA_ARGS__)
+
2963#define WARN_FALSE(...) DOCTEST_WARN_FALSE(__VA_ARGS__)
+
2964#define WARN_THROWS(...) DOCTEST_WARN_THROWS(__VA_ARGS__)
+
2965#define WARN_THROWS_AS(expr, ...) DOCTEST_WARN_THROWS_AS(expr, __VA_ARGS__)
+
2966#define WARN_THROWS_WITH(expr, ...) DOCTEST_WARN_THROWS_WITH(expr, __VA_ARGS__)
+
2967#define WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_WARN_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2968#define WARN_NOTHROW(...) DOCTEST_WARN_NOTHROW(__VA_ARGS__)
+
2969#define CHECK(...) DOCTEST_CHECK(__VA_ARGS__)
+
2970#define CHECK_FALSE(...) DOCTEST_CHECK_FALSE(__VA_ARGS__)
+
2971#define CHECK_THROWS(...) DOCTEST_CHECK_THROWS(__VA_ARGS__)
+
2972#define CHECK_THROWS_AS(expr, ...) DOCTEST_CHECK_THROWS_AS(expr, __VA_ARGS__)
+
2973#define CHECK_THROWS_WITH(expr, ...) DOCTEST_CHECK_THROWS_WITH(expr, __VA_ARGS__)
+
2974#define CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2975#define CHECK_NOTHROW(...) DOCTEST_CHECK_NOTHROW(__VA_ARGS__)
+
2976#define REQUIRE(...) DOCTEST_REQUIRE(__VA_ARGS__)
+
2977#define REQUIRE_FALSE(...) DOCTEST_REQUIRE_FALSE(__VA_ARGS__)
+
2978#define REQUIRE_THROWS(...) DOCTEST_REQUIRE_THROWS(__VA_ARGS__)
+
2979#define REQUIRE_THROWS_AS(expr, ...) DOCTEST_REQUIRE_THROWS_AS(expr, __VA_ARGS__)
+
2980#define REQUIRE_THROWS_WITH(expr, ...) DOCTEST_REQUIRE_THROWS_WITH(expr, __VA_ARGS__)
+
2981#define REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2982#define REQUIRE_NOTHROW(...) DOCTEST_REQUIRE_NOTHROW(__VA_ARGS__)
+
2983
+
2984#define WARN_MESSAGE(cond, ...) DOCTEST_WARN_MESSAGE(cond, __VA_ARGS__)
+
2985#define WARN_FALSE_MESSAGE(cond, ...) DOCTEST_WARN_FALSE_MESSAGE(cond, __VA_ARGS__)
+
2986#define WARN_THROWS_MESSAGE(expr, ...) DOCTEST_WARN_THROWS_MESSAGE(expr, __VA_ARGS__)
+
2987#define WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
2988#define WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
2989#define WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
2990#define WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_WARN_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
2991#define CHECK_MESSAGE(cond, ...) DOCTEST_CHECK_MESSAGE(cond, __VA_ARGS__)
+
2992#define CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_CHECK_FALSE_MESSAGE(cond, __VA_ARGS__)
+
2993#define CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_CHECK_THROWS_MESSAGE(expr, __VA_ARGS__)
+
2994#define CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
2995#define CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
2996#define CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
2997#define CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_CHECK_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
2998#define REQUIRE_MESSAGE(cond, ...) DOCTEST_REQUIRE_MESSAGE(cond, __VA_ARGS__)
+
2999#define REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_REQUIRE_FALSE_MESSAGE(cond, __VA_ARGS__)
+
3000#define REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_REQUIRE_THROWS_MESSAGE(expr, __VA_ARGS__)
+
3001#define REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
3002#define REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
3003#define REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
3004#define REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
3005
+
3006#define SCENARIO(name) DOCTEST_SCENARIO(name)
+
3007#define SCENARIO_CLASS(name) DOCTEST_SCENARIO_CLASS(name)
+
3008#define SCENARIO_TEMPLATE(name, T, ...) DOCTEST_SCENARIO_TEMPLATE(name, T, __VA_ARGS__)
+
3009#define SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id)
+
3010#define GIVEN(name) DOCTEST_GIVEN(name)
+
3011#define WHEN(name) DOCTEST_WHEN(name)
+
3012#define AND_WHEN(name) DOCTEST_AND_WHEN(name)
+
3013#define THEN(name) DOCTEST_THEN(name)
+
3014#define AND_THEN(name) DOCTEST_AND_THEN(name)
+
3015
+
3016#define WARN_EQ(...) DOCTEST_WARN_EQ(__VA_ARGS__)
+
3017#define CHECK_EQ(...) DOCTEST_CHECK_EQ(__VA_ARGS__)
+
3018#define REQUIRE_EQ(...) DOCTEST_REQUIRE_EQ(__VA_ARGS__)
+
3019#define WARN_NE(...) DOCTEST_WARN_NE(__VA_ARGS__)
+
3020#define CHECK_NE(...) DOCTEST_CHECK_NE(__VA_ARGS__)
+
3021#define REQUIRE_NE(...) DOCTEST_REQUIRE_NE(__VA_ARGS__)
+
3022#define WARN_GT(...) DOCTEST_WARN_GT(__VA_ARGS__)
+
3023#define CHECK_GT(...) DOCTEST_CHECK_GT(__VA_ARGS__)
+
3024#define REQUIRE_GT(...) DOCTEST_REQUIRE_GT(__VA_ARGS__)
+
3025#define WARN_LT(...) DOCTEST_WARN_LT(__VA_ARGS__)
+
3026#define CHECK_LT(...) DOCTEST_CHECK_LT(__VA_ARGS__)
+
3027#define REQUIRE_LT(...) DOCTEST_REQUIRE_LT(__VA_ARGS__)
+
3028#define WARN_GE(...) DOCTEST_WARN_GE(__VA_ARGS__)
+
3029#define CHECK_GE(...) DOCTEST_CHECK_GE(__VA_ARGS__)
+
3030#define REQUIRE_GE(...) DOCTEST_REQUIRE_GE(__VA_ARGS__)
+
3031#define WARN_LE(...) DOCTEST_WARN_LE(__VA_ARGS__)
+
3032#define CHECK_LE(...) DOCTEST_CHECK_LE(__VA_ARGS__)
+
3033#define REQUIRE_LE(...) DOCTEST_REQUIRE_LE(__VA_ARGS__)
+
3034#define WARN_UNARY(...) DOCTEST_WARN_UNARY(__VA_ARGS__)
+
3035#define CHECK_UNARY(...) DOCTEST_CHECK_UNARY(__VA_ARGS__)
+
3036#define REQUIRE_UNARY(...) DOCTEST_REQUIRE_UNARY(__VA_ARGS__)
+
3037#define WARN_UNARY_FALSE(...) DOCTEST_WARN_UNARY_FALSE(__VA_ARGS__)
+
3038#define CHECK_UNARY_FALSE(...) DOCTEST_CHECK_UNARY_FALSE(__VA_ARGS__)
+
3039#define REQUIRE_UNARY_FALSE(...) DOCTEST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
+
3040
+
3041// KEPT FOR BACKWARDS COMPATIBILITY
+
3042#define FAST_WARN_EQ(...) DOCTEST_FAST_WARN_EQ(__VA_ARGS__)
+
3043#define FAST_CHECK_EQ(...) DOCTEST_FAST_CHECK_EQ(__VA_ARGS__)
+
3044#define FAST_REQUIRE_EQ(...) DOCTEST_FAST_REQUIRE_EQ(__VA_ARGS__)
+
3045#define FAST_WARN_NE(...) DOCTEST_FAST_WARN_NE(__VA_ARGS__)
+
3046#define FAST_CHECK_NE(...) DOCTEST_FAST_CHECK_NE(__VA_ARGS__)
+
3047#define FAST_REQUIRE_NE(...) DOCTEST_FAST_REQUIRE_NE(__VA_ARGS__)
+
3048#define FAST_WARN_GT(...) DOCTEST_FAST_WARN_GT(__VA_ARGS__)
+
3049#define FAST_CHECK_GT(...) DOCTEST_FAST_CHECK_GT(__VA_ARGS__)
+
3050#define FAST_REQUIRE_GT(...) DOCTEST_FAST_REQUIRE_GT(__VA_ARGS__)
+
3051#define FAST_WARN_LT(...) DOCTEST_FAST_WARN_LT(__VA_ARGS__)
+
3052#define FAST_CHECK_LT(...) DOCTEST_FAST_CHECK_LT(__VA_ARGS__)
+
3053#define FAST_REQUIRE_LT(...) DOCTEST_FAST_REQUIRE_LT(__VA_ARGS__)
+
3054#define FAST_WARN_GE(...) DOCTEST_FAST_WARN_GE(__VA_ARGS__)
+
3055#define FAST_CHECK_GE(...) DOCTEST_FAST_CHECK_GE(__VA_ARGS__)
+
3056#define FAST_REQUIRE_GE(...) DOCTEST_FAST_REQUIRE_GE(__VA_ARGS__)
+
3057#define FAST_WARN_LE(...) DOCTEST_FAST_WARN_LE(__VA_ARGS__)
+
3058#define FAST_CHECK_LE(...) DOCTEST_FAST_CHECK_LE(__VA_ARGS__)
+
3059#define FAST_REQUIRE_LE(...) DOCTEST_FAST_REQUIRE_LE(__VA_ARGS__)
+
3060
+
3061#define FAST_WARN_UNARY(...) DOCTEST_FAST_WARN_UNARY(__VA_ARGS__)
+
3062#define FAST_CHECK_UNARY(...) DOCTEST_FAST_CHECK_UNARY(__VA_ARGS__)
+
3063#define FAST_REQUIRE_UNARY(...) DOCTEST_FAST_REQUIRE_UNARY(__VA_ARGS__)
+
3064#define FAST_WARN_UNARY_FALSE(...) DOCTEST_FAST_WARN_UNARY_FALSE(__VA_ARGS__)
+
3065#define FAST_CHECK_UNARY_FALSE(...) DOCTEST_FAST_CHECK_UNARY_FALSE(__VA_ARGS__)
+
3066#define FAST_REQUIRE_UNARY_FALSE(...) DOCTEST_FAST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
+
3067
+
3068#define TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, __VA_ARGS__)
+
3069
+
3070#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
3071
+
3072#ifndef DOCTEST_CONFIG_DISABLE
+
3073
+
3074// this is here to clear the 'current test suite' for the current translation unit - at the top
+
3075DOCTEST_TEST_SUITE_END();
+
3076
+
3077#endif // DOCTEST_CONFIG_DISABLE
+
3078
+
3079DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
3080DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
3081DOCTEST_GCC_SUPPRESS_WARNING_POP
+
3082
+
3083DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
+
3084
+
3085#endif // DOCTEST_LIBRARY_INCLUDED
+
3086
+
3087#ifndef DOCTEST_SINGLE_HEADER
+
3088#define DOCTEST_SINGLE_HEADER
+
3089#endif // DOCTEST_SINGLE_HEADER
+
3090
+
3091#if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)
+
3092
+
3093#ifndef DOCTEST_SINGLE_HEADER
+
3094#include "doctest_fwd.h"
+
3095#endif // DOCTEST_SINGLE_HEADER
+
3096
+
3097DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-macros")
+
3098
+
3099#ifndef DOCTEST_LIBRARY_IMPLEMENTATION
+
3100#define DOCTEST_LIBRARY_IMPLEMENTATION
+
3101
+
3102DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
3103
+
3104DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
+
3105
+
3106DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
3107DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors")
+
3108DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
+
3109DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
+
3110DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32")
+
3111DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations")
+
3112DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch")
+
3113DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum")
+
3114DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default")
+
3115DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn")
+
3116DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion")
+
3117DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces")
+
3118DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers")
+
3119DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-member-function")
+
3120DOCTEST_CLANG_SUPPRESS_WARNING("-Wnonportable-system-include-path")
+
3121
+
3122DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
3123DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
+
3124DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
+
3125DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers")
+
3126DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces")
+
3127DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch")
+
3128DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum")
+
3129DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default")
+
3130DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations")
+
3131DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast")
+
3132DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-function")
+
3133DOCTEST_GCC_SUPPRESS_WARNING("-Wmultiple-inheritance")
+
3134DOCTEST_GCC_SUPPRESS_WARNING("-Wsuggest-attribute")
+
3135
+
3136DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
3137DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data
+
3138DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled
+
3139DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified
+
3140DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal
+
3141DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch
+
3142DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C
+
3143DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)
+
3144DOCTEST_MSVC_SUPPRESS_WARNING(5245) // unreferenced function with internal linkage has been removed
+
3145
+
3146DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+
3147
+
3148// required includes - will go only in one translation unit!
+
3149#include <ctime>
+
3150#include <cmath>
+
3151#include <climits>
+
3152// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/doctest/doctest/pull/37
+
3153#ifdef __BORLANDC__
+
3154#include <math.h>
+
3155#endif // __BORLANDC__
+
3156#include <new>
+
3157#include <cstdio>
+
3158#include <cstdlib>
+
3159#include <cstring>
+
3160#include <limits>
+
3161#include <utility>
+
3162#include <fstream>
+
3163#include <sstream>
+
3164#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3165#include <iostream>
+
3166#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3167#include <algorithm>
+
3168#include <iomanip>
+
3169#include <vector>
+
3170#ifndef DOCTEST_CONFIG_NO_MULTITHREADING
+
3171#include <atomic>
+
3172#include <mutex>
+
3173#define DOCTEST_DECLARE_MUTEX(name) std::mutex name;
+
3174#define DOCTEST_DECLARE_STATIC_MUTEX(name) static DOCTEST_DECLARE_MUTEX(name)
+
3175#define DOCTEST_LOCK_MUTEX(name) std::lock_guard<std::mutex> DOCTEST_ANONYMOUS(DOCTEST_ANON_LOCK_)(name);
+
3176#else // DOCTEST_CONFIG_NO_MULTITHREADING
+
3177#define DOCTEST_DECLARE_MUTEX(name)
+
3178#define DOCTEST_DECLARE_STATIC_MUTEX(name)
+
3179#define DOCTEST_LOCK_MUTEX(name)
+
3180#endif // DOCTEST_CONFIG_NO_MULTITHREADING
+
3181#include <set>
+
3182#include <map>
+
3183#include <unordered_set>
+
3184#include <exception>
+
3185#include <stdexcept>
+
3186#include <csignal>
+
3187#include <cfloat>
+
3188#include <cctype>
+
3189#include <cstdint>
+
3190#include <string>
+
3191
+
3192#ifdef DOCTEST_PLATFORM_MAC
+
3193#include <sys/types.h>
+
3194#include <unistd.h>
+
3195#include <sys/sysctl.h>
+
3196#endif // DOCTEST_PLATFORM_MAC
+
3197
+
3198#ifdef DOCTEST_PLATFORM_WINDOWS
+
3199
+
3200// defines for a leaner windows.h
+
3201#ifndef WIN32_LEAN_AND_MEAN
+
3202#define WIN32_LEAN_AND_MEAN
+
3203#define DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
3204#endif // WIN32_LEAN_AND_MEAN
+
3205#ifndef NOMINMAX
+
3206#define NOMINMAX
+
3207#define DOCTEST_UNDEF_NOMINMAX
+
3208#endif // NOMINMAX
+
3209
+
3210// not sure what AfxWin.h is for - here I do what Catch does
+
3211#ifdef __AFXDLL
+
3212#include <AfxWin.h>
+
3213#else
+
3214#include <windows.h>
+
3215#endif
+
3216#include <io.h>
+
3217
+
3218#else // DOCTEST_PLATFORM_WINDOWS
+
3219
+
3220#include <sys/time.h>
+
3221#include <unistd.h>
+
3222
+
3223#endif // DOCTEST_PLATFORM_WINDOWS
+
3224
+
3225// this is a fix for https://github.com/doctest/doctest/issues/348
+
3226// https://mail.gnome.org/archives/xml/2012-January/msg00000.html
+
3227#if !defined(HAVE_UNISTD_H) && !defined(STDOUT_FILENO)
+
3228#define STDOUT_FILENO fileno(stdout)
+
3229#endif // HAVE_UNISTD_H
+
3230
+
3231DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
3232
+
3233// counts the number of elements in a C array
+
3234#define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
+
3235
+
3236#ifdef DOCTEST_CONFIG_DISABLE
+
3237#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled
+
3238#else // DOCTEST_CONFIG_DISABLE
+
3239#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled
+
3240#endif // DOCTEST_CONFIG_DISABLE
+
3241
+
3242#ifndef DOCTEST_CONFIG_OPTIONS_PREFIX
+
3243#define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-"
+
3244#endif
+
3245
+
3246#ifndef DOCTEST_THREAD_LOCAL
+
3247#if defined(DOCTEST_CONFIG_NO_MULTITHREADING) || DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
3248#define DOCTEST_THREAD_LOCAL
+
3249#else // DOCTEST_MSVC
+
3250#define DOCTEST_THREAD_LOCAL thread_local
+
3251#endif // DOCTEST_MSVC
+
3252#endif // DOCTEST_THREAD_LOCAL
+
3253
+
3254#ifndef DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES
+
3255#define DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES 32
+
3256#endif
+
3257
+
3258#ifndef DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE
+
3259#define DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE 64
+
3260#endif
+
3261
+
3262#ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
3263#define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX
+
3264#else
+
3265#define DOCTEST_OPTIONS_PREFIX_DISPLAY ""
+
3266#endif
+
3267
+
3268#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+
3269#define DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
3270#endif
+
3271
+
3272#ifndef DOCTEST_CDECL
+
3273#define DOCTEST_CDECL __cdecl
+
3274#endif
+
3275
+
3276namespace doctest {
+
3277
+
3278bool is_running_in_test = false;
+
3279
+
3280namespace {
+
3281 using namespace detail;
+
3282
+
3283 template <typename Ex>
+
3284 DOCTEST_NORETURN void throw_exception(Ex const& e) {
+
3285#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
3286 throw e;
+
3287#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
3288#ifdef DOCTEST_CONFIG_HANDLE_EXCEPTION
+
3289 DOCTEST_CONFIG_HANDLE_EXCEPTION(e);
+
3290#else // DOCTEST_CONFIG_HANDLE_EXCEPTION
+
3291#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3292 std::cerr << "doctest will terminate because it needed to throw an exception.\n"
+
3293 << "The message was: " << e.what() << '\n';
+
3294#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3295#endif // DOCTEST_CONFIG_HANDLE_EXCEPTION
+
3296 std::terminate();
+
3297#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
3298 }
+
3299
+
3300#ifndef DOCTEST_INTERNAL_ERROR
+
3301#define DOCTEST_INTERNAL_ERROR(msg) \
+
3302 throw_exception(std::logic_error( \
+
3303 __FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg))
+
3304#endif // DOCTEST_INTERNAL_ERROR
+
3305
+
3306 // case insensitive strcmp
+
3307 int stricmp(const char* a, const char* b) {
+
3308 for(;; a++, b++) {
+
3309 const int d = tolower(*a) - tolower(*b);
+
3310 if(d != 0 || !*a)
+
3311 return d;
+
3312 }
+
3313 }
+
3314
+
3315 struct Endianness
+
3316 {
+
3317 enum Arch
+
3318 {
+
3319 Big,
+
3320 Little
+
3321 };
+
3322
+
3323 static Arch which() {
+
3324 int x = 1;
+
3325 // casting any data pointer to char* is allowed
+
3326 auto ptr = reinterpret_cast<char*>(&x);
+
3327 if(*ptr)
+
3328 return Little;
+
3329 return Big;
+
3330 }
+
3331 };
+
3332} // namespace
+
3333
+
3334namespace detail {
+
3335 DOCTEST_THREAD_LOCAL class
+
3336 {
+
3337 std::vector<std::streampos> stack;
+
3338 std::stringstream ss;
+
3339
+
3340 public:
+
3341 std::ostream* push() {
+
3342 stack.push_back(ss.tellp());
+
3343 return &ss;
+
3344 }
+
3345
+
3346 String pop() {
+
3347 if (stack.empty())
+
3348 DOCTEST_INTERNAL_ERROR("TLSS was empty when trying to pop!");
+
3349
+
3350 std::streampos pos = stack.back();
+
3351 stack.pop_back();
+
3352 unsigned sz = static_cast<unsigned>(ss.tellp() - pos);
+
3353 ss.rdbuf()->pubseekpos(pos, std::ios::in | std::ios::out);
+
3354 return String(ss, sz);
+
3355 }
+
3356 } g_oss;
+
3357
+
3358 std::ostream* tlssPush() {
+
3359 return g_oss.push();
+
3360 }
+
3361
+
3362 String tlssPop() {
+
3363 return g_oss.pop();
+
3364 }
+
3365
+
3366#ifndef DOCTEST_CONFIG_DISABLE
+
3367
+
3368namespace timer_large_integer
+
3369{
+
3370
+
3371#if defined(DOCTEST_PLATFORM_WINDOWS)
+
3372 using type = ULONGLONG;
+
3373#else // DOCTEST_PLATFORM_WINDOWS
+
3374 using type = std::uint64_t;
+
3375#endif // DOCTEST_PLATFORM_WINDOWS
+
3376}
+
3377
+
3378using ticks_t = timer_large_integer::type;
+
3379
+
3380#ifdef DOCTEST_CONFIG_GETCURRENTTICKS
+
3381 ticks_t getCurrentTicks() { return DOCTEST_CONFIG_GETCURRENTTICKS(); }
+
3382#elif defined(DOCTEST_PLATFORM_WINDOWS)
+
3383 ticks_t getCurrentTicks() {
+
3384 static LARGE_INTEGER hz = { {0} }, hzo = { {0} };
+
3385 if(!hz.QuadPart) {
+
3386 QueryPerformanceFrequency(&hz);
+
3387 QueryPerformanceCounter(&hzo);
+
3388 }
+
3389 LARGE_INTEGER t;
+
3390 QueryPerformanceCounter(&t);
+
3391 return ((t.QuadPart - hzo.QuadPart) * LONGLONG(1000000)) / hz.QuadPart;
+
3392 }
+
3393#else // DOCTEST_PLATFORM_WINDOWS
+
3394 ticks_t getCurrentTicks() {
+
3395 timeval t;
+
3396 gettimeofday(&t, nullptr);
+
3397 return static_cast<ticks_t>(t.tv_sec) * 1000000 + static_cast<ticks_t>(t.tv_usec);
+
3398 }
+
3399#endif // DOCTEST_PLATFORM_WINDOWS
+
3400
+
3401 struct Timer
+
3402 {
+
3403 void start() { m_ticks = getCurrentTicks(); }
+
3404 unsigned int getElapsedMicroseconds() const {
+
3405 return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
+
3406 }
+
3407 //unsigned int getElapsedMilliseconds() const {
+
3408 // return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
+
3409 //}
+
3410 double getElapsedSeconds() const { return static_cast<double>(getCurrentTicks() - m_ticks) / 1000000.0; }
+
3411
+
3412 private:
+
3413 ticks_t m_ticks = 0;
+
3414 };
+
3415
+
3416#ifdef DOCTEST_CONFIG_NO_MULTITHREADING
+
3417 template <typename T>
+
3418 using Atomic = T;
+
3419#else // DOCTEST_CONFIG_NO_MULTITHREADING
+
3420 template <typename T>
+
3421 using Atomic = std::atomic<T>;
+
3422#endif // DOCTEST_CONFIG_NO_MULTITHREADING
+
3423
+
3424#if defined(DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS) || defined(DOCTEST_CONFIG_NO_MULTITHREADING)
+
3425 template <typename T>
+
3426 using MultiLaneAtomic = Atomic<T>;
+
3427#else // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
3428 // Provides a multilane implementation of an atomic variable that supports add, sub, load,
+
3429 // store. Instead of using a single atomic variable, this splits up into multiple ones,
+
3430 // each sitting on a separate cache line. The goal is to provide a speedup when most
+
3431 // operations are modifying. It achieves this with two properties:
+
3432 //
+
3433 // * Multiple atomics are used, so chance of congestion from the same atomic is reduced.
+
3434 // * Each atomic sits on a separate cache line, so false sharing is reduced.
+
3435 //
+
3436 // The disadvantage is that there is a small overhead due to the use of TLS, and load/store
+
3437 // is slower because all atomics have to be accessed.
+
3438 template <typename T>
+
3439 class MultiLaneAtomic
+
3440 {
+
3441 struct CacheLineAlignedAtomic
+
3442 {
+
3443 Atomic<T> atomic{};
+
3444 char padding[DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE - sizeof(Atomic<T>)];
+
3445 };
+
3446 CacheLineAlignedAtomic m_atomics[DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES];
+
3447
+
3448 static_assert(sizeof(CacheLineAlignedAtomic) == DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE,
+
3449 "guarantee one atomic takes exactly one cache line");
+
3450
+
3451 public:
+
3452 T operator++() DOCTEST_NOEXCEPT { return fetch_add(1) + 1; }
+
3453
+
3454 T operator++(int) DOCTEST_NOEXCEPT { return fetch_add(1); }
+
3455
+
3456 T fetch_add(T arg, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
3457 return myAtomic().fetch_add(arg, order);
+
3458 }
+
3459
+
3460 T fetch_sub(T arg, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
3461 return myAtomic().fetch_sub(arg, order);
+
3462 }
+
3463
+
3464 operator T() const DOCTEST_NOEXCEPT { return load(); }
+
3465
+
3466 T load(std::memory_order order = std::memory_order_seq_cst) const DOCTEST_NOEXCEPT {
+
3467 auto result = T();
+
3468 for(auto const& c : m_atomics) {
+
3469 result += c.atomic.load(order);
+
3470 }
+
3471 return result;
+
3472 }
+
3473
+
3474 T operator=(T desired) DOCTEST_NOEXCEPT { // lgtm [cpp/assignment-does-not-return-this]
+
3475 store(desired);
+
3476 return desired;
+
3477 }
+
3478
+
3479 void store(T desired, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
3480 // first value becomes desired", all others become 0.
+
3481 for(auto& c : m_atomics) {
+
3482 c.atomic.store(desired, order);
+
3483 desired = {};
+
3484 }
+
3485 }
+
3486
+
3487 private:
+
3488 // Each thread has a different atomic that it operates on. If more than NumLanes threads
+
3489 // use this, some will use the same atomic. So performance will degrade a bit, but still
+
3490 // everything will work.
+
3491 //
+
3492 // The logic here is a bit tricky. The call should be as fast as possible, so that there
+
3493 // is minimal to no overhead in determining the correct atomic for the current thread.
+
3494 //
+
3495 // 1. A global static counter laneCounter counts continuously up.
+
3496 // 2. Each successive thread will use modulo operation of that counter so it gets an atomic
+
3497 // assigned in a round-robin fashion.
+
3498 // 3. This tlsLaneIdx is stored in the thread local data, so it is directly available with
+
3499 // little overhead.
+
3500 Atomic<T>& myAtomic() DOCTEST_NOEXCEPT {
+
3501 static Atomic<size_t> laneCounter;
+
3502 DOCTEST_THREAD_LOCAL size_t tlsLaneIdx =
+
3503 laneCounter++ % DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES;
+
3504
+
3505 return m_atomics[tlsLaneIdx].atomic;
+
3506 }
+
3507 };
+
3508#endif // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
3509
+
3510 // this holds both parameters from the command line and runtime data for tests
+
3511 struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats
+
3512 {
+
3513 MultiLaneAtomic<int> numAssertsCurrentTest_atomic;
+
3514 MultiLaneAtomic<int> numAssertsFailedCurrentTest_atomic;
+
3515
+
3516 std::vector<std::vector<String>> filters = decltype(filters)(9); // 9 different filters
+
3517
+
3518 std::vector<IReporter*> reporters_currently_used;
+
3519
+
3520 assert_handler ah = nullptr;
+
3521
+
3522 Timer timer;
+
3523
+
3524 std::vector<String> stringifiedContexts; // logging from INFO() due to an exception
+
3525
+
3526 // stuff for subcases
+
3527 bool reachedLeaf;
+
3528 std::vector<SubcaseSignature> subcaseStack;
+
3529 std::vector<SubcaseSignature> nextSubcaseStack;
+
3530 std::unordered_set<unsigned long long> fullyTraversedSubcases;
+
3531 size_t currentSubcaseDepth;
+
3532 Atomic<bool> shouldLogCurrentException;
+
3533
+
3534 void resetRunData() {
+
3535 numTestCases = 0;
+
3536 numTestCasesPassingFilters = 0;
+
3537 numTestSuitesPassingFilters = 0;
+
3538 numTestCasesFailed = 0;
+
3539 numAsserts = 0;
+
3540 numAssertsFailed = 0;
+
3541 numAssertsCurrentTest = 0;
+
3542 numAssertsFailedCurrentTest = 0;
+
3543 }
+
3544
+
3545 void finalizeTestCaseData() {
+
3546 seconds = timer.getElapsedSeconds();
+
3547
+
3548 // update the non-atomic counters
+
3549 numAsserts += numAssertsCurrentTest_atomic;
+
3550 numAssertsFailed += numAssertsFailedCurrentTest_atomic;
+
3551 numAssertsCurrentTest = numAssertsCurrentTest_atomic;
+
3552 numAssertsFailedCurrentTest = numAssertsFailedCurrentTest_atomic;
+
3553
+
3554 if(numAssertsFailedCurrentTest)
+
3555 failure_flags |= TestCaseFailureReason::AssertFailure;
+
3556
+
3557 if(Approx(currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
+
3558 Approx(seconds).epsilon(DBL_EPSILON) > currentTest->m_timeout)
+
3559 failure_flags |= TestCaseFailureReason::Timeout;
+
3560
+
3561 if(currentTest->m_should_fail) {
+
3562 if(failure_flags) {
+
3563 failure_flags |= TestCaseFailureReason::ShouldHaveFailedAndDid;
+
3564 } else {
+
3565 failure_flags |= TestCaseFailureReason::ShouldHaveFailedButDidnt;
+
3566 }
+
3567 } else if(failure_flags && currentTest->m_may_fail) {
+
3568 failure_flags |= TestCaseFailureReason::CouldHaveFailedAndDid;
+
3569 } else if(currentTest->m_expected_failures > 0) {
+
3570 if(numAssertsFailedCurrentTest == currentTest->m_expected_failures) {
+
3571 failure_flags |= TestCaseFailureReason::FailedExactlyNumTimes;
+
3572 } else {
+
3573 failure_flags |= TestCaseFailureReason::DidntFailExactlyNumTimes;
+
3574 }
+
3575 }
+
3576
+
3577 bool ok_to_fail = (TestCaseFailureReason::ShouldHaveFailedAndDid & failure_flags) ||
+
3578 (TestCaseFailureReason::CouldHaveFailedAndDid & failure_flags) ||
+
3579 (TestCaseFailureReason::FailedExactlyNumTimes & failure_flags);
+
3580
+
3581 // if any subcase has failed - the whole test case has failed
+
3582 testCaseSuccess = !(failure_flags && !ok_to_fail);
+
3583 if(!testCaseSuccess)
+
3584 numTestCasesFailed++;
+
3585 }
+
3586 };
+
3587
+
3588 ContextState* g_cs = nullptr;
+
3589
+
3590 // used to avoid locks for the debug output
+
3591 // TODO: figure out if this is indeed necessary/correct - seems like either there still
+
3592 // could be a race or that there wouldn't be a race even if using the context directly
+
3593 DOCTEST_THREAD_LOCAL bool g_no_colors;
+
3594
+
3595#endif // DOCTEST_CONFIG_DISABLE
+
3596} // namespace detail
+
3597
+
3598char* String::allocate(size_type sz) {
+
3599 if (sz <= last) {
+
3600 buf[sz] = '\0';
+
3601 setLast(last - sz);
+
3602 return buf;
+
3603 } else {
+
3604 setOnHeap();
+
3605 data.size = sz;
+
3606 data.capacity = data.size + 1;
+
3607 data.ptr = new char[data.capacity];
+
3608 data.ptr[sz] = '\0';
+
3609 return data.ptr;
+
3610 }
+
3611}
+
3612
+
3613void String::setOnHeap() noexcept { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }
+
3614void String::setLast(size_type in) noexcept { buf[last] = char(in); }
+
3615void String::setSize(size_type sz) noexcept {
+
3616 if (isOnStack()) { buf[sz] = '\0'; setLast(last - sz); }
+
3617 else { data.ptr[sz] = '\0'; data.size = sz; }
+
3618}
+
3619
+
3620void String::copy(const String& other) {
+
3621 if(other.isOnStack()) {
+
3622 memcpy(buf, other.buf, len);
+
3623 } else {
+
3624 memcpy(allocate(other.data.size), other.data.ptr, other.data.size);
+
3625 }
+
3626}
+
3627
+
3628String::String() noexcept {
+
3629 buf[0] = '\0';
+
3630 setLast();
+
3631}
+
3632
+
3633String::~String() {
+
3634 if(!isOnStack())
+
3635 delete[] data.ptr;
+
3636} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
3637
+
3638String::String(const char* in)
+
3639 : String(in, strlen(in)) {}
+
3640
+
3641String::String(const char* in, size_type in_size) {
+
3642 memcpy(allocate(in_size), in, in_size);
+
3643}
+
3644
+
3645String::String(std::istream& in, size_type in_size) {
+
3646 in.read(allocate(in_size), in_size);
+
3647}
+
3648
+
3649String::String(const String& other) { copy(other); }
+
3650
+
3651String& String::operator=(const String& other) {
+
3652 if(this != &other) {
+
3653 if(!isOnStack())
+
3654 delete[] data.ptr;
+
3655
+
3656 copy(other);
+
3657 }
+
3658
+
3659 return *this;
+
3660}
+
3661
+
3662String& String::operator+=(const String& other) {
+
3663 const size_type my_old_size = size();
+
3664 const size_type other_size = other.size();
+
3665 const size_type total_size = my_old_size + other_size;
+
3666 if(isOnStack()) {
+
3667 if(total_size < len) {
+
3668 // append to the current stack space
+
3669 memcpy(buf + my_old_size, other.c_str(), other_size + 1);
+
3670 // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
+
3671 setLast(last - total_size);
+
3672 } else {
+
3673 // alloc new chunk
+
3674 char* temp = new char[total_size + 1];
+
3675 // copy current data to new location before writing in the union
+
3676 memcpy(temp, buf, my_old_size); // skip the +1 ('\0') for speed
+
3677 // update data in union
+
3678 setOnHeap();
+
3679 data.size = total_size;
+
3680 data.capacity = data.size + 1;
+
3681 data.ptr = temp;
+
3682 // transfer the rest of the data
+
3683 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
3684 }
+
3685 } else {
+
3686 if(data.capacity > total_size) {
+
3687 // append to the current heap block
+
3688 data.size = total_size;
+
3689 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
3690 } else {
+
3691 // resize
+
3692 data.capacity *= 2;
+
3693 if(data.capacity <= total_size)
+
3694 data.capacity = total_size + 1;
+
3695 // alloc new chunk
+
3696 char* temp = new char[data.capacity];
+
3697 // copy current data to new location before releasing it
+
3698 memcpy(temp, data.ptr, my_old_size); // skip the +1 ('\0') for speed
+
3699 // release old chunk
+
3700 delete[] data.ptr;
+
3701 // update the rest of the union members
+
3702 data.size = total_size;
+
3703 data.ptr = temp;
+
3704 // transfer the rest of the data
+
3705 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
3706 }
+
3707 }
+
3708
+
3709 return *this;
+
3710}
+
3711
+
3712String::String(String&& other) noexcept {
+
3713 memcpy(buf, other.buf, len);
+
3714 other.buf[0] = '\0';
+
3715 other.setLast();
+
3716}
+
3717
+
3718String& String::operator=(String&& other) noexcept {
+
3719 if(this != &other) {
+
3720 if(!isOnStack())
+
3721 delete[] data.ptr;
+
3722 memcpy(buf, other.buf, len);
+
3723 other.buf[0] = '\0';
+
3724 other.setLast();
+
3725 }
+
3726 return *this;
+
3727}
+
3728
+
3729char String::operator[](size_type i) const {
+
3730 return const_cast<String*>(this)->operator[](i);
+
3731}
+
3732
+
3733char& String::operator[](size_type i) {
+
3734 if(isOnStack())
+
3735 return reinterpret_cast<char*>(buf)[i];
+
3736 return data.ptr[i];
+
3737}
+
3738
+
3739DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmaybe-uninitialized")
+
3740String::size_type String::size() const {
+
3741 if(isOnStack())
+
3742 return last - (size_type(buf[last]) & 31); // using "last" would work only if "len" is 32
+
3743 return data.size;
+
3744}
+
3745DOCTEST_GCC_SUPPRESS_WARNING_POP
+
3746
+
3747String::size_type String::capacity() const {
+
3748 if(isOnStack())
+
3749 return len;
+
3750 return data.capacity;
+
3751}
+
3752
+
3753String String::substr(size_type pos, size_type cnt) && {
+
3754 cnt = std::min(cnt, size() - 1 - pos);
+
3755 char* cptr = c_str();
+
3756 memmove(cptr, cptr + pos, cnt);
+
3757 setSize(cnt);
+
3758 return std::move(*this);
+
3759}
+
3760
+
3761String String::substr(size_type pos, size_type cnt) const & {
+
3762 cnt = std::min(cnt, size() - 1 - pos);
+
3763 return String{ c_str() + pos, cnt };
+
3764}
+
3765
+
3766String::size_type String::find(char ch, size_type pos) const {
+
3767 const char* begin = c_str();
+
3768 const char* end = begin + size();
+
3769 const char* it = begin + pos;
+
3770 for (; it < end && *it != ch; it++);
+
3771 if (it < end) { return static_cast<size_type>(it - begin); }
+
3772 else { return npos; }
+
3773}
+
3774
+
3775String::size_type String::rfind(char ch, size_type pos) const {
+
3776 const char* begin = c_str();
+
3777 const char* it = begin + std::min(pos, size() - 1);
+
3778 for (; it >= begin && *it != ch; it--);
+
3779 if (it >= begin) { return static_cast<size_type>(it - begin); }
+
3780 else { return npos; }
+
3781}
+
3782
+
3783int String::compare(const char* other, bool no_case) const {
+
3784 if(no_case)
+
3785 return doctest::stricmp(c_str(), other);
+
3786 return std::strcmp(c_str(), other);
+
3787}
+
3788
+
3789int String::compare(const String& other, bool no_case) const {
+
3790 return compare(other.c_str(), no_case);
+
3791}
+
3792
+
3793String operator+(const String& lhs, const String& rhs) { return String(lhs) += rhs; }
+
3794
+
3795bool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; }
+
3796bool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; }
+
3797bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }
+
3798bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }
+
3799bool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; }
+
3800bool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; }
+
3801
+
3802std::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); }
+
3803
+
3804Contains::Contains(const String& str) : string(str) { }
+
3805
+
3806bool Contains::checkWith(const String& other) const {
+
3807 return strstr(other.c_str(), string.c_str()) != nullptr;
+
3808}
+
3809
+
3810String toString(const Contains& in) {
+
3811 return "Contains( " + in.string + " )";
+
3812}
+
3813
+
3814bool operator==(const String& lhs, const Contains& rhs) { return rhs.checkWith(lhs); }
+
3815bool operator==(const Contains& lhs, const String& rhs) { return lhs.checkWith(rhs); }
+
3816bool operator!=(const String& lhs, const Contains& rhs) { return !rhs.checkWith(lhs); }
+
3817bool operator!=(const Contains& lhs, const String& rhs) { return !lhs.checkWith(rhs); }
+
3818
+
3819namespace {
+
3820 void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;)
+
3821} // namespace
+
3822
+
3823namespace Color {
+
3824 std::ostream& operator<<(std::ostream& s, Color::Enum code) {
+
3825 color_to_stream(s, code);
+
3826 return s;
+
3827 }
+
3828} // namespace Color
+
3829
+
3830// clang-format off
+
3831const char* assertString(assertType::Enum at) {
+
3832 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4061) // enum 'x' in switch of enum 'y' is not explicitly handled
+
3833 #define DOCTEST_GENERATE_ASSERT_TYPE_CASE(assert_type) case assertType::DT_ ## assert_type: return #assert_type
+
3834 #define DOCTEST_GENERATE_ASSERT_TYPE_CASES(assert_type) \
+
3835 DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN_ ## assert_type); \
+
3836 DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK_ ## assert_type); \
+
3837 DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE_ ## assert_type)
+
3838 switch(at) {
+
3839 DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN);
+
3840 DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK);
+
3841 DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE);
+
3842
+
3843 DOCTEST_GENERATE_ASSERT_TYPE_CASES(FALSE);
+
3844
+
3845 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS);
+
3846
+
3847 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_AS);
+
3848
+
3849 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH);
+
3850
+
3851 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH_AS);
+
3852
+
3853 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NOTHROW);
+
3854
+
3855 DOCTEST_GENERATE_ASSERT_TYPE_CASES(EQ);
+
3856 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NE);
+
3857 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GT);
+
3858 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LT);
+
3859 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GE);
+
3860 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LE);
+
3861
+
3862 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY);
+
3863 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY_FALSE);
+
3864
+
3865 default: DOCTEST_INTERNAL_ERROR("Tried stringifying invalid assert type!");
+
3866 }
+
3867 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
3868}
+
3869// clang-format on
+
3870
+
3871const char* failureString(assertType::Enum at) {
+
3872 if(at & assertType::is_warn)
+
3873 return "WARNING";
+
3874 if(at & assertType::is_check)
+
3875 return "ERROR";
+
3876 if(at & assertType::is_require)
+
3877 return "FATAL ERROR";
+
3878 return "";
+
3879}
+
3880
+
3881DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
+
3882DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
+
3883// depending on the current options this will remove the path of filenames
+
3884const char* skipPathFromFilename(const char* file) {
+
3885#ifndef DOCTEST_CONFIG_DISABLE
+
3886 if(getContextOptions()->no_path_in_filenames) {
+
3887 auto back = std::strrchr(file, '\\');
+
3888 auto forward = std::strrchr(file, '/');
+
3889 if(back || forward) {
+
3890 if(back > forward)
+
3891 forward = back;
+
3892 return forward + 1;
+
3893 }
+
3894 }
+
3895#endif // DOCTEST_CONFIG_DISABLE
+
3896 return file;
+
3897}
+
3898DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
3899DOCTEST_GCC_SUPPRESS_WARNING_POP
+
3900
+
3901bool SubcaseSignature::operator==(const SubcaseSignature& other) const {
+
3902 return m_line == other.m_line
+
3903 && std::strcmp(m_file, other.m_file) == 0
+
3904 && m_name == other.m_name;
+
3905}
+
3906
+
3907bool SubcaseSignature::operator<(const SubcaseSignature& other) const {
+
3908 if(m_line != other.m_line)
+
3909 return m_line < other.m_line;
+
3910 if(std::strcmp(m_file, other.m_file) != 0)
+
3911 return std::strcmp(m_file, other.m_file) < 0;
+
3912 return m_name.compare(other.m_name) < 0;
+
3913}
+
3914
+
3915DOCTEST_DEFINE_INTERFACE(IContextScope)
+
3916
+
3917namespace detail {
+
3918 void filldata<const void*>::fill(std::ostream* stream, const void* in) {
+
3919 if (in) { *stream << in; }
+
3920 else { *stream << "nullptr"; }
+
3921 }
+
3922
+
3923 template <typename T>
+
3924 String toStreamLit(T t) {
+
3925 std::ostream* os = tlssPush();
+
3926 os->operator<<(t);
+
3927 return tlssPop();
+
3928 }
+
3929}
+
3930
+
3931#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
3932String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; }
+
3933#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
3934
+
3935#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
3936// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
3937String toString(const std::string& in) { return in.c_str(); }
+
3938#endif // VS 2019
+
3939
+
3940String toString(String in) { return in; }
+
3941
+
3942String toString(std::nullptr_t) { return "nullptr"; }
+
3943
+
3944String toString(bool in) { return in ? "true" : "false"; }
+
3945
+
3946String toString(float in) { return toStreamLit(in); }
+
3947String toString(double in) { return toStreamLit(in); }
+
3948String toString(double long in) { return toStreamLit(in); }
+
3949
+
3950String toString(char in) { return toStreamLit(static_cast<signed>(in)); }
+
3951String toString(char signed in) { return toStreamLit(static_cast<signed>(in)); }
+
3952String toString(char unsigned in) { return toStreamLit(static_cast<unsigned>(in)); }
+
3953String toString(short in) { return toStreamLit(in); }
+
3954String toString(short unsigned in) { return toStreamLit(in); }
+
3955String toString(signed in) { return toStreamLit(in); }
+
3956String toString(unsigned in) { return toStreamLit(in); }
+
3957String toString(long in) { return toStreamLit(in); }
+
3958String toString(long unsigned in) { return toStreamLit(in); }
+
3959String toString(long long in) { return toStreamLit(in); }
+
3960String toString(long long unsigned in) { return toStreamLit(in); }
+
3961
+
3962Approx::Approx(double value)
+
3963 : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
+
3964 , m_scale(1.0)
+
3965 , m_value(value) {}
+
3966
+
3967Approx Approx::operator()(double value) const {
+
3968 Approx approx(value);
+
3969 approx.epsilon(m_epsilon);
+
3970 approx.scale(m_scale);
+
3971 return approx;
+
3972}
+
3973
+
3974Approx& Approx::epsilon(double newEpsilon) {
+
3975 m_epsilon = newEpsilon;
+
3976 return *this;
+
3977}
+
3978Approx& Approx::scale(double newScale) {
+
3979 m_scale = newScale;
+
3980 return *this;
+
3981}
+
3982
+
3983bool operator==(double lhs, const Approx& rhs) {
+
3984 // Thanks to Richard Harris for his help refining this formula
+
3985 return std::fabs(lhs - rhs.m_value) <
+
3986 rhs.m_epsilon * (rhs.m_scale + std::max<double>(std::fabs(lhs), std::fabs(rhs.m_value)));
+
3987}
+
3988bool operator==(const Approx& lhs, double rhs) { return operator==(rhs, lhs); }
+
3989bool operator!=(double lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
+
3990bool operator!=(const Approx& lhs, double rhs) { return !operator==(rhs, lhs); }
+
3991bool operator<=(double lhs, const Approx& rhs) { return lhs < rhs.m_value || lhs == rhs; }
+
3992bool operator<=(const Approx& lhs, double rhs) { return lhs.m_value < rhs || lhs == rhs; }
+
3993bool operator>=(double lhs, const Approx& rhs) { return lhs > rhs.m_value || lhs == rhs; }
+
3994bool operator>=(const Approx& lhs, double rhs) { return lhs.m_value > rhs || lhs == rhs; }
+
3995bool operator<(double lhs, const Approx& rhs) { return lhs < rhs.m_value && lhs != rhs; }
+
3996bool operator<(const Approx& lhs, double rhs) { return lhs.m_value < rhs && lhs != rhs; }
+
3997bool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs != rhs; }
+
3998bool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; }
+
3999
+
4000String toString(const Approx& in) {
+
4001 return "Approx( " + doctest::toString(in.m_value) + " )";
+
4002}
+
4003const ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); }
+
4004
+
4005DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4738)
+
4006template <typename F>
+
4007IsNaN<F>::operator bool() const {
+
4008 return std::isnan(value) ^ flipped;
+
4009}
+
4010DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
4011template struct DOCTEST_INTERFACE_DEF IsNaN<float>;
+
4012template struct DOCTEST_INTERFACE_DEF IsNaN<double>;
+
4013template struct DOCTEST_INTERFACE_DEF IsNaN<long double>;
+
4014template <typename F>
+
4015String toString(IsNaN<F> in) { return String(in.flipped ? "! " : "") + "IsNaN( " + doctest::toString(in.value) + " )"; }
+
4016String toString(IsNaN<float> in) { return toString<float>(in); }
+
4017String toString(IsNaN<double> in) { return toString<double>(in); }
+
4018String toString(IsNaN<double long> in) { return toString<double long>(in); }
+
4019
+
4020} // namespace doctest
+
4021
+
4022#ifdef DOCTEST_CONFIG_DISABLE
+
4023namespace doctest {
+
4024Context::Context(int, const char* const*) {}
+
4025Context::~Context() = default;
+
4026void Context::applyCommandLine(int, const char* const*) {}
+
4027void Context::addFilter(const char*, const char*) {}
+
4028void Context::clearFilters() {}
+
4029void Context::setOption(const char*, bool) {}
+
4030void Context::setOption(const char*, int) {}
+
4031void Context::setOption(const char*, const char*) {}
+
4032bool Context::shouldExit() { return false; }
+
4033void Context::setAsDefaultForAssertsOutOfTestCases() {}
+
4034void Context::setAssertHandler(detail::assert_handler) {}
+
4035void Context::setCout(std::ostream*) {}
+
4036int Context::run() { return 0; }
+
4037
+
4038int IReporter::get_num_active_contexts() { return 0; }
+
4039const IContextScope* const* IReporter::get_active_contexts() { return nullptr; }
+
4040int IReporter::get_num_stringified_contexts() { return 0; }
+
4041const String* IReporter::get_stringified_contexts() { return nullptr; }
+
4042
+
4043int registerReporter(const char*, int, IReporter*) { return 0; }
+
4044
+
4045} // namespace doctest
+
4046#else // DOCTEST_CONFIG_DISABLE
+
4047
+
4048#if !defined(DOCTEST_CONFIG_COLORS_NONE)
+
4049#if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)
+
4050#ifdef DOCTEST_PLATFORM_WINDOWS
+
4051#define DOCTEST_CONFIG_COLORS_WINDOWS
+
4052#else // linux
+
4053#define DOCTEST_CONFIG_COLORS_ANSI
+
4054#endif // platform
+
4055#endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI
+
4056#endif // DOCTEST_CONFIG_COLORS_NONE
+
4057
+
4058namespace doctest_detail_test_suite_ns {
+
4059// holds the current test suite
+
4060doctest::detail::TestSuite& getCurrentTestSuite() {
+
4061 static doctest::detail::TestSuite data{};
+
4062 return data;
+
4063}
+
4064} // namespace doctest_detail_test_suite_ns
+
4065
+
4066namespace doctest {
+
4067namespace {
+
4068 // the int (priority) is part of the key for automatic sorting - sadly one can register a
+
4069 // reporter with a duplicate name and a different priority but hopefully that won't happen often :|
+
4070 using reporterMap = std::map<std::pair<int, String>, reporterCreatorFunc>;
+
4071
+
4072 reporterMap& getReporters() {
+
4073 static reporterMap data;
+
4074 return data;
+
4075 }
+
4076 reporterMap& getListeners() {
+
4077 static reporterMap data;
+
4078 return data;
+
4079 }
+
4080} // namespace
+
4081namespace detail {
+
4082#define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...) \
+
4083 for(auto& curr_rep : g_cs->reporters_currently_used) \
+
4084 curr_rep->function(__VA_ARGS__)
+
4085
+
4086 bool checkIfShouldThrow(assertType::Enum at) {
+
4087 if(at & assertType::is_require)
+
4088 return true;
+
4089
+
4090 if((at & assertType::is_check)
+
4091 && getContextOptions()->abort_after > 0 &&
+
4092 (g_cs->numAssertsFailed + g_cs->numAssertsFailedCurrentTest_atomic) >=
+
4093 getContextOptions()->abort_after)
+
4094 return true;
+
4095
+
4096 return false;
+
4097 }
+
4098
+
4099#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
4100 DOCTEST_NORETURN void throwException() {
+
4101 g_cs->shouldLogCurrentException = false;
+
4102 throw TestFailureException(); // NOLINT(hicpp-exception-baseclass)
+
4103 }
+
4104#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
4105 void throwException() {}
+
4106#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
4107} // namespace detail
+
4108
+
4109namespace {
+
4110 using namespace detail;
+
4111 // matching of a string against a wildcard mask (case sensitivity configurable) taken from
+
4112 // https://www.codeproject.com/Articles/1088/Wildcard-string-compare-globbing
+
4113 int wildcmp(const char* str, const char* wild, bool caseSensitive) {
+
4114 const char* cp = str;
+
4115 const char* mp = wild;
+
4116
+
4117 while((*str) && (*wild != '*')) {
+
4118 if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
+
4119 (*wild != '?')) {
+
4120 return 0;
+
4121 }
+
4122 wild++;
+
4123 str++;
+
4124 }
+
4125
+
4126 while(*str) {
+
4127 if(*wild == '*') {
+
4128 if(!*++wild) {
+
4129 return 1;
+
4130 }
+
4131 mp = wild;
+
4132 cp = str + 1;
+
4133 } else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
+
4134 (*wild == '?')) {
+
4135 wild++;
+
4136 str++;
+
4137 } else {
+
4138 wild = mp;
+
4139 str = cp++;
+
4140 }
+
4141 }
+
4142
+
4143 while(*wild == '*') {
+
4144 wild++;
+
4145 }
+
4146 return !*wild;
+
4147 }
+
4148
+
4149 // checks if the name matches any of the filters (and can be configured what to do when empty)
+
4150 bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty,
+
4151 bool caseSensitive) {
+
4152 if (filters.empty() && matchEmpty)
+
4153 return true;
+
4154 for (auto& curr : filters)
+
4155 if (wildcmp(name, curr.c_str(), caseSensitive))
+
4156 return true;
+
4157 return false;
+
4158 }
+
4159
+
4160 DOCTEST_NO_SANITIZE_INTEGER
+
4161 unsigned long long hash(unsigned long long a, unsigned long long b) {
+
4162 return (a << 5) + b;
+
4163 }
+
4164
+
4165 // C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html
+
4166 DOCTEST_NO_SANITIZE_INTEGER
+
4167 unsigned long long hash(const char* str) {
+
4168 unsigned long long hash = 5381;
+
4169 char c;
+
4170 while ((c = *str++))
+
4171 hash = ((hash << 5) + hash) + c; // hash * 33 + c
+
4172 return hash;
+
4173 }
+
4174
+
4175 unsigned long long hash(const SubcaseSignature& sig) {
+
4176 return hash(hash(hash(sig.m_file), hash(sig.m_name.c_str())), sig.m_line);
+
4177 }
+
4178
+
4179 unsigned long long hash(const std::vector<SubcaseSignature>& sigs, size_t count) {
+
4180 unsigned long long running = 0;
+
4181 auto end = sigs.begin() + count;
+
4182 for (auto it = sigs.begin(); it != end; it++) {
+
4183 running = hash(running, hash(*it));
+
4184 }
+
4185 return running;
+
4186 }
+
4187
+
4188 unsigned long long hash(const std::vector<SubcaseSignature>& sigs) {
+
4189 unsigned long long running = 0;
+
4190 for (const SubcaseSignature& sig : sigs) {
+
4191 running = hash(running, hash(sig));
+
4192 }
+
4193 return running;
+
4194 }
+
4195} // namespace
+
4196namespace detail {
+
4197 bool Subcase::checkFilters() {
+
4198 if (g_cs->subcaseStack.size() < size_t(g_cs->subcase_filter_levels)) {
+
4199 if (!matchesAny(m_signature.m_name.c_str(), g_cs->filters[6], true, g_cs->case_sensitive))
+
4200 return true;
+
4201 if (matchesAny(m_signature.m_name.c_str(), g_cs->filters[7], false, g_cs->case_sensitive))
+
4202 return true;
+
4203 }
+
4204 return false;
+
4205 }
+
4206
+
4207 Subcase::Subcase(const String& name, const char* file, int line)
+
4208 : m_signature({name, file, line}) {
+
4209 if (!g_cs->reachedLeaf) {
+
4210 if (g_cs->nextSubcaseStack.size() <= g_cs->subcaseStack.size()
+
4211 || g_cs->nextSubcaseStack[g_cs->subcaseStack.size()] == m_signature) {
+
4212 // Going down.
+
4213 if (checkFilters()) { return; }
+
4214
+
4215 g_cs->subcaseStack.push_back(m_signature);
+
4216 g_cs->currentSubcaseDepth++;
+
4217 m_entered = true;
+
4218 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
+
4219 }
+
4220 } else {
+
4221 if (g_cs->subcaseStack[g_cs->currentSubcaseDepth] == m_signature) {
+
4222 // This subcase is reentered via control flow.
+
4223 g_cs->currentSubcaseDepth++;
+
4224 m_entered = true;
+
4225 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
+
4226 } else if (g_cs->nextSubcaseStack.size() <= g_cs->currentSubcaseDepth
+
4227 && g_cs->fullyTraversedSubcases.find(hash(hash(g_cs->subcaseStack, g_cs->currentSubcaseDepth), hash(m_signature)))
+
4228 == g_cs->fullyTraversedSubcases.end()) {
+
4229 if (checkFilters()) { return; }
+
4230 // This subcase is part of the one to be executed next.
+
4231 g_cs->nextSubcaseStack.clear();
+
4232 g_cs->nextSubcaseStack.insert(g_cs->nextSubcaseStack.end(),
+
4233 g_cs->subcaseStack.begin(), g_cs->subcaseStack.begin() + g_cs->currentSubcaseDepth);
+
4234 g_cs->nextSubcaseStack.push_back(m_signature);
+
4235 }
+
4236 }
+
4237 }
+
4238
+
4239 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
+
4240 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
4241 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
4242
+
4243 Subcase::~Subcase() {
+
4244 if (m_entered) {
+
4245 g_cs->currentSubcaseDepth--;
+
4246
+
4247 if (!g_cs->reachedLeaf) {
+
4248 // Leaf.
+
4249 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
+
4250 g_cs->nextSubcaseStack.clear();
+
4251 g_cs->reachedLeaf = true;
+
4252 } else if (g_cs->nextSubcaseStack.empty()) {
+
4253 // All children are finished.
+
4254 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
+
4255 }
+
4256
+
4257#if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
+
4258 if(std::uncaught_exceptions() > 0
+
4259#else
+
4260 if(std::uncaught_exception()
+
4261#endif
+
4262 && g_cs->shouldLogCurrentException) {
+
4263 DOCTEST_ITERATE_THROUGH_REPORTERS(
+
4264 test_case_exception, {"exception thrown in subcase - will translate later "
+
4265 "when the whole test case has been exited (cannot "
+
4266 "translate while there is an active exception)",
+
4267 false});
+
4268 g_cs->shouldLogCurrentException = false;
+
4269 }
+
4270
+
4271 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);
+
4272 }
+
4273 }
+
4274
+
4275 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
4276 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
4277 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
4278
+
4279 Subcase::operator bool() const { return m_entered; }
+
4280
+
4281 Result::Result(bool passed, const String& decomposition)
+
4282 : m_passed(passed)
+
4283 , m_decomp(decomposition) {}
+
4284
+
4285 ExpressionDecomposer::ExpressionDecomposer(assertType::Enum at)
+
4286 : m_at(at) {}
+
4287
+
4288 TestSuite& TestSuite::operator*(const char* in) {
+
4289 m_test_suite = in;
+
4290 return *this;
+
4291 }
+
4292
+
4293 TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
+
4294 const String& type, int template_id) {
+
4295 m_file = file;
+
4296 m_line = line;
+
4297 m_name = nullptr; // will be later overridden in operator*
+
4298 m_test_suite = test_suite.m_test_suite;
+
4299 m_description = test_suite.m_description;
+
4300 m_skip = test_suite.m_skip;
+
4301 m_no_breaks = test_suite.m_no_breaks;
+
4302 m_no_output = test_suite.m_no_output;
+
4303 m_may_fail = test_suite.m_may_fail;
+
4304 m_should_fail = test_suite.m_should_fail;
+
4305 m_expected_failures = test_suite.m_expected_failures;
+
4306 m_timeout = test_suite.m_timeout;
+
4307
+
4308 m_test = test;
+
4309 m_type = type;
+
4310 m_template_id = template_id;
+
4311 }
+
4312
+
4313 TestCase::TestCase(const TestCase& other)
+
4314 : TestCaseData() {
+
4315 *this = other;
+
4316 }
+
4317
+
4318 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
+
4319 TestCase& TestCase::operator=(const TestCase& other) {
+
4320 TestCaseData::operator=(other);
+
4321 m_test = other.m_test;
+
4322 m_type = other.m_type;
+
4323 m_template_id = other.m_template_id;
+
4324 m_full_name = other.m_full_name;
+
4325
+
4326 if(m_template_id != -1)
+
4327 m_name = m_full_name.c_str();
+
4328 return *this;
+
4329 }
+
4330 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
4331
+
4332 TestCase& TestCase::operator*(const char* in) {
+
4333 m_name = in;
+
4334 // make a new name with an appended type for templated test case
+
4335 if(m_template_id != -1) {
+
4336 m_full_name = String(m_name) + "<" + m_type + ">";
+
4337 // redirect the name to point to the newly constructed full name
+
4338 m_name = m_full_name.c_str();
+
4339 }
+
4340 return *this;
+
4341 }
+
4342
+
4343 bool TestCase::operator<(const TestCase& other) const {
+
4344 // this will be used only to differentiate between test cases - not relevant for sorting
+
4345 if(m_line != other.m_line)
+
4346 return m_line < other.m_line;
+
4347 const int name_cmp = strcmp(m_name, other.m_name);
+
4348 if(name_cmp != 0)
+
4349 return name_cmp < 0;
+
4350 const int file_cmp = m_file.compare(other.m_file);
+
4351 if(file_cmp != 0)
+
4352 return file_cmp < 0;
+
4353 return m_template_id < other.m_template_id;
+
4354 }
+
4355
+
4356 // all the registered tests
+
4357 std::set<TestCase>& getRegisteredTests() {
+
4358 static std::set<TestCase> data;
+
4359 return data;
+
4360 }
+
4361} // namespace detail
+
4362namespace {
+
4363 using namespace detail;
+
4364 // for sorting tests by file/line
+
4365 bool fileOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
4366 // this is needed because MSVC gives different case for drive letters
+
4367 // for __FILE__ when evaluated in a header and a source file
+
4368 const int res = lhs->m_file.compare(rhs->m_file, bool(DOCTEST_MSVC));
+
4369 if(res != 0)
+
4370 return res < 0;
+
4371 if(lhs->m_line != rhs->m_line)
+
4372 return lhs->m_line < rhs->m_line;
+
4373 return lhs->m_template_id < rhs->m_template_id;
+
4374 }
+
4375
+
4376 // for sorting tests by suite/file/line
+
4377 bool suiteOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
4378 const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
+
4379 if(res != 0)
+
4380 return res < 0;
+
4381 return fileOrderComparator(lhs, rhs);
+
4382 }
+
4383
+
4384 // for sorting tests by name/suite/file/line
+
4385 bool nameOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
4386 const int res = std::strcmp(lhs->m_name, rhs->m_name);
+
4387 if(res != 0)
+
4388 return res < 0;
+
4389 return suiteOrderComparator(lhs, rhs);
+
4390 }
+
4391
+
4392 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
4393 void color_to_stream(std::ostream& s, Color::Enum code) {
+
4394 static_cast<void>(s); // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS
+
4395 static_cast<void>(code); // for DOCTEST_CONFIG_COLORS_NONE
+
4396#ifdef DOCTEST_CONFIG_COLORS_ANSI
+
4397 if(g_no_colors ||
+
4398 (isatty(STDOUT_FILENO) == false && getContextOptions()->force_colors == false))
+
4399 return;
+
4400
+
4401 auto col = "";
+
4402 // clang-format off
+
4403 switch(code) {
+
4404 case Color::Red: col = "[0;31m"; break;
+
4405 case Color::Green: col = "[0;32m"; break;
+
4406 case Color::Blue: col = "[0;34m"; break;
+
4407 case Color::Cyan: col = "[0;36m"; break;
+
4408 case Color::Yellow: col = "[0;33m"; break;
+
4409 case Color::Grey: col = "[1;30m"; break;
+
4410 case Color::LightGrey: col = "[0;37m"; break;
+
4411 case Color::BrightRed: col = "[1;31m"; break;
+
4412 case Color::BrightGreen: col = "[1;32m"; break;
+
4413 case Color::BrightWhite: col = "[1;37m"; break;
+
4414 case Color::Bright: // invalid
+
4415 case Color::None:
+
4416 case Color::White:
+
4417 default: col = "[0m";
+
4418 }
+
4419 // clang-format on
+
4420 s << "\033" << col;
+
4421#endif // DOCTEST_CONFIG_COLORS_ANSI
+
4422
+
4423#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
+
4424 if(g_no_colors ||
+
4425 (_isatty(_fileno(stdout)) == false && getContextOptions()->force_colors == false))
+
4426 return;
+
4427
+
4428 static struct ConsoleHelper {
+
4429 HANDLE stdoutHandle;
+
4430 WORD origFgAttrs;
+
4431 WORD origBgAttrs;
+
4432
+
4433 ConsoleHelper() {
+
4434 stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
+
4435 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+
4436 GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
+
4437 origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
+
4438 BACKGROUND_BLUE | BACKGROUND_INTENSITY);
+
4439 origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
+
4440 FOREGROUND_BLUE | FOREGROUND_INTENSITY);
+
4441 }
+
4442 } ch;
+
4443
+
4444#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(ch.stdoutHandle, x | ch.origBgAttrs)
+
4445
+
4446 // clang-format off
+
4447 switch (code) {
+
4448 case Color::White: DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
+
4449 case Color::Red: DOCTEST_SET_ATTR(FOREGROUND_RED); break;
+
4450 case Color::Green: DOCTEST_SET_ATTR(FOREGROUND_GREEN); break;
+
4451 case Color::Blue: DOCTEST_SET_ATTR(FOREGROUND_BLUE); break;
+
4452 case Color::Cyan: DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN); break;
+
4453 case Color::Yellow: DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN); break;
+
4454 case Color::Grey: DOCTEST_SET_ATTR(0); break;
+
4455 case Color::LightGrey: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY); break;
+
4456 case Color::BrightRed: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED); break;
+
4457 case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN); break;
+
4458 case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
+
4459 case Color::None:
+
4460 case Color::Bright: // invalid
+
4461 default: DOCTEST_SET_ATTR(ch.origFgAttrs);
+
4462 }
+
4463 // clang-format on
+
4464#endif // DOCTEST_CONFIG_COLORS_WINDOWS
+
4465 }
+
4466 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
4467
+
4468 std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
+
4469 static std::vector<const IExceptionTranslator*> data;
+
4470 return data;
+
4471 }
+
4472
+
4473 String translateActiveException() {
+
4474#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
4475 String res;
+
4476 auto& translators = getExceptionTranslators();
+
4477 for(auto& curr : translators)
+
4478 if(curr->translate(res))
+
4479 return res;
+
4480 // clang-format off
+
4481 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wcatch-value")
+
4482 try {
+
4483 throw;
+
4484 } catch(std::exception& ex) {
+
4485 return ex.what();
+
4486 } catch(std::string& msg) {
+
4487 return msg.c_str();
+
4488 } catch(const char* msg) {
+
4489 return msg;
+
4490 } catch(...) {
+
4491 return "unknown exception";
+
4492 }
+
4493 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
4494// clang-format on
+
4495#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
4496 return "";
+
4497#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
4498 }
+
4499} // namespace
+
4500
+
4501namespace detail {
+
4502 // used by the macros for registering tests
+
4503 int regTest(const TestCase& tc) {
+
4504 getRegisteredTests().insert(tc);
+
4505 return 0;
+
4506 }
+
4507
+
4508 // sets the current test suite
+
4509 int setTestSuite(const TestSuite& ts) {
+
4510 doctest_detail_test_suite_ns::getCurrentTestSuite() = ts;
+
4511 return 0;
+
4512 }
+
4513
+
4514#ifdef DOCTEST_IS_DEBUGGER_ACTIVE
+
4515 bool isDebuggerActive() { return DOCTEST_IS_DEBUGGER_ACTIVE(); }
+
4516#else // DOCTEST_IS_DEBUGGER_ACTIVE
+
4517#ifdef DOCTEST_PLATFORM_LINUX
+
4518 class ErrnoGuard {
+
4519 public:
+
4520 ErrnoGuard() : m_oldErrno(errno) {}
+
4521 ~ErrnoGuard() { errno = m_oldErrno; }
+
4522 private:
+
4523 int m_oldErrno;
+
4524 };
+
4525 // See the comments in Catch2 for the reasoning behind this implementation:
+
4526 // https://github.com/catchorg/Catch2/blob/v2.13.1/include/internal/catch_debugger.cpp#L79-L102
+
4527 bool isDebuggerActive() {
+
4528 ErrnoGuard guard;
+
4529 std::ifstream in("/proc/self/status");
+
4530 for(std::string line; std::getline(in, line);) {
+
4531 static const int PREFIX_LEN = 11;
+
4532 if(line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0) {
+
4533 return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
+
4534 }
+
4535 }
+
4536 return false;
+
4537 }
+
4538#elif defined(DOCTEST_PLATFORM_MAC)
+
4539 // The following function is taken directly from the following technical note:
+
4540 // https://developer.apple.com/library/archive/qa/qa1361/_index.html
+
4541 // Returns true if the current process is being debugged (either
+
4542 // running under the debugger or has a debugger attached post facto).
+
4543 bool isDebuggerActive() {
+
4544 int mib[4];
+
4545 kinfo_proc info;
+
4546 size_t size;
+
4547 // Initialize the flags so that, if sysctl fails for some bizarre
+
4548 // reason, we get a predictable result.
+
4549 info.kp_proc.p_flag = 0;
+
4550 // Initialize mib, which tells sysctl the info we want, in this case
+
4551 // we're looking for information about a specific process ID.
+
4552 mib[0] = CTL_KERN;
+
4553 mib[1] = KERN_PROC;
+
4554 mib[2] = KERN_PROC_PID;
+
4555 mib[3] = getpid();
+
4556 // Call sysctl.
+
4557 size = sizeof(info);
+
4558 if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {
+
4559 std::cerr << "\nCall to sysctl failed - unable to determine if debugger is active **\n";
+
4560 return false;
+
4561 }
+
4562 // We're being debugged if the P_TRACED flag is set.
+
4563 return ((info.kp_proc.p_flag & P_TRACED) != 0);
+
4564 }
+
4565#elif DOCTEST_MSVC || defined(__MINGW32__) || defined(__MINGW64__)
+
4566 bool isDebuggerActive() { return ::IsDebuggerPresent() != 0; }
+
4567#else
+
4568 bool isDebuggerActive() { return false; }
+
4569#endif // Platform
+
4570#endif // DOCTEST_IS_DEBUGGER_ACTIVE
+
4571
+
4572 void registerExceptionTranslatorImpl(const IExceptionTranslator* et) {
+
4573 if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
+
4574 getExceptionTranslators().end())
+
4575 getExceptionTranslators().push_back(et);
+
4576 }
+
4577
+
4578 DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO()
+
4579
+
4580 ContextScopeBase::ContextScopeBase() {
+
4581 g_infoContexts.push_back(this);
+
4582 }
+
4583
+
4584 ContextScopeBase::ContextScopeBase(ContextScopeBase&& other) noexcept {
+
4585 if (other.need_to_destroy) {
+
4586 other.destroy();
+
4587 }
+
4588 other.need_to_destroy = false;
+
4589 g_infoContexts.push_back(this);
+
4590 }
+
4591
+
4592 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
+
4593 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
4594 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
4595
+
4596 // destroy cannot be inlined into the destructor because that would mean calling stringify after
+
4597 // ContextScope has been destroyed (base class destructors run after derived class destructors).
+
4598 // Instead, ContextScope calls this method directly from its destructor.
+
4599 void ContextScopeBase::destroy() {
+
4600#if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
+
4601 if(std::uncaught_exceptions() > 0) {
+
4602#else
+
4603 if(std::uncaught_exception()) {
+
4604#endif
+
4605 std::ostringstream s;
+
4606 this->stringify(&s);
+
4607 g_cs->stringifiedContexts.push_back(s.str().c_str());
+
4608 }
+
4609 g_infoContexts.pop_back();
+
4610 }
+
4611
+
4612 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
4613 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
4614 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
4615} // namespace detail
+
4616namespace {
+
4617 using namespace detail;
+
4618
+
4619#if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
4620 struct FatalConditionHandler
+
4621 {
+
4622 static void reset() {}
+
4623 static void allocateAltStackMem() {}
+
4624 static void freeAltStackMem() {}
+
4625 };
+
4626#else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
4627
+
4628 void reportFatal(const std::string&);
+
4629
+
4630#ifdef DOCTEST_PLATFORM_WINDOWS
+
4631
+
4632 struct SignalDefs
+
4633 {
+
4634 DWORD id;
+
4635 const char* name;
+
4636 };
+
4637 // There is no 1-1 mapping between signals and windows exceptions.
+
4638 // Windows can easily distinguish between SO and SigSegV,
+
4639 // but SigInt, SigTerm, etc are handled differently.
+
4640 SignalDefs signalDefs[] = {
+
4641 {static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),
+
4642 "SIGILL - Illegal instruction signal"},
+
4643 {static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow"},
+
4644 {static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION),
+
4645 "SIGSEGV - Segmentation violation signal"},
+
4646 {static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error"},
+
4647 };
+
4648
+
4649 struct FatalConditionHandler
+
4650 {
+
4651 static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) {
+
4652 // Multiple threads may enter this filter/handler at once. We want the error message to be printed on the
+
4653 // console just once no matter how many threads have crashed.
+
4654 DOCTEST_DECLARE_STATIC_MUTEX(mutex)
+
4655 static bool execute = true;
+
4656 {
+
4657 DOCTEST_LOCK_MUTEX(mutex)
+
4658 if(execute) {
+
4659 bool reported = false;
+
4660 for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
4661 if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
+
4662 reportFatal(signalDefs[i].name);
+
4663 reported = true;
+
4664 break;
+
4665 }
+
4666 }
+
4667 if(reported == false)
+
4668 reportFatal("Unhandled SEH exception caught");
+
4669 if(isDebuggerActive() && !g_cs->no_breaks)
+
4670 DOCTEST_BREAK_INTO_DEBUGGER();
+
4671 }
+
4672 execute = false;
+
4673 }
+
4674 std::exit(EXIT_FAILURE);
+
4675 }
+
4676
+
4677 static void allocateAltStackMem() {}
+
4678 static void freeAltStackMem() {}
+
4679
+
4680 FatalConditionHandler() {
+
4681 isSet = true;
+
4682 // 32k seems enough for doctest to handle stack overflow,
+
4683 // but the value was found experimentally, so there is no strong guarantee
+
4684 guaranteeSize = 32 * 1024;
+
4685 // Register an unhandled exception filter
+
4686 previousTop = SetUnhandledExceptionFilter(handleException);
+
4687 // Pass in guarantee size to be filled
+
4688 SetThreadStackGuarantee(&guaranteeSize);
+
4689
+
4690 // On Windows uncaught exceptions from another thread, exceptions from
+
4691 // destructors, or calls to std::terminate are not a SEH exception
+
4692
+
4693 // The terminal handler gets called when:
+
4694 // - std::terminate is called FROM THE TEST RUNNER THREAD
+
4695 // - an exception is thrown from a destructor FROM THE TEST RUNNER THREAD
+
4696 original_terminate_handler = std::get_terminate();
+
4697 std::set_terminate([]() DOCTEST_NOEXCEPT {
+
4698 reportFatal("Terminate handler called");
+
4699 if(isDebuggerActive() && !g_cs->no_breaks)
+
4700 DOCTEST_BREAK_INTO_DEBUGGER();
+
4701 std::exit(EXIT_FAILURE); // explicitly exit - otherwise the SIGABRT handler may be called as well
+
4702 });
+
4703
+
4704 // SIGABRT is raised when:
+
4705 // - std::terminate is called FROM A DIFFERENT THREAD
+
4706 // - an exception is thrown from a destructor FROM A DIFFERENT THREAD
+
4707 // - an uncaught exception is thrown FROM A DIFFERENT THREAD
+
4708 prev_sigabrt_handler = std::signal(SIGABRT, [](int signal) DOCTEST_NOEXCEPT {
+
4709 if(signal == SIGABRT) {
+
4710 reportFatal("SIGABRT - Abort (abnormal termination) signal");
+
4711 if(isDebuggerActive() && !g_cs->no_breaks)
+
4712 DOCTEST_BREAK_INTO_DEBUGGER();
+
4713 std::exit(EXIT_FAILURE);
+
4714 }
+
4715 });
+
4716
+
4717 // The following settings are taken from google test, and more
+
4718 // specifically from UnitTest::Run() inside of gtest.cc
+
4719
+
4720 // the user does not want to see pop-up dialogs about crashes
+
4721 prev_error_mode_1 = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+
4722 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+
4723 // This forces the abort message to go to stderr in all circumstances.
+
4724 prev_error_mode_2 = _set_error_mode(_OUT_TO_STDERR);
+
4725 // In the debug version, Visual Studio pops up a separate dialog
+
4726 // offering a choice to debug the aborted program - we want to disable that.
+
4727 prev_abort_behavior = _set_abort_behavior(0x0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+
4728 // In debug mode, the Windows CRT can crash with an assertion over invalid
+
4729 // input (e.g. passing an invalid file descriptor). The default handling
+
4730 // for these assertions is to pop up a dialog and wait for user input.
+
4731 // Instead ask the CRT to dump such assertions to stderr non-interactively.
+
4732 prev_report_mode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+
4733 prev_report_file = _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+
4734 }
+
4735
+
4736 static void reset() {
+
4737 if(isSet) {
+
4738 // Unregister handler and restore the old guarantee
+
4739 SetUnhandledExceptionFilter(previousTop);
+
4740 SetThreadStackGuarantee(&guaranteeSize);
+
4741 std::set_terminate(original_terminate_handler);
+
4742 std::signal(SIGABRT, prev_sigabrt_handler);
+
4743 SetErrorMode(prev_error_mode_1);
+
4744 _set_error_mode(prev_error_mode_2);
+
4745 _set_abort_behavior(prev_abort_behavior, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+
4746 static_cast<void>(_CrtSetReportMode(_CRT_ASSERT, prev_report_mode));
+
4747 static_cast<void>(_CrtSetReportFile(_CRT_ASSERT, prev_report_file));
+
4748 isSet = false;
+
4749 }
+
4750 }
+
4751
+
4752 ~FatalConditionHandler() { reset(); }
+
4753
+
4754 private:
+
4755 static UINT prev_error_mode_1;
+
4756 static int prev_error_mode_2;
+
4757 static unsigned int prev_abort_behavior;
+
4758 static int prev_report_mode;
+
4759 static _HFILE prev_report_file;
+
4760 static void (DOCTEST_CDECL *prev_sigabrt_handler)(int);
+
4761 static std::terminate_handler original_terminate_handler;
+
4762 static bool isSet;
+
4763 static ULONG guaranteeSize;
+
4764 static LPTOP_LEVEL_EXCEPTION_FILTER previousTop;
+
4765 };
+
4766
+
4767 UINT FatalConditionHandler::prev_error_mode_1;
+
4768 int FatalConditionHandler::prev_error_mode_2;
+
4769 unsigned int FatalConditionHandler::prev_abort_behavior;
+
4770 int FatalConditionHandler::prev_report_mode;
+
4771 _HFILE FatalConditionHandler::prev_report_file;
+
4772 void (DOCTEST_CDECL *FatalConditionHandler::prev_sigabrt_handler)(int);
+
4773 std::terminate_handler FatalConditionHandler::original_terminate_handler;
+
4774 bool FatalConditionHandler::isSet = false;
+
4775 ULONG FatalConditionHandler::guaranteeSize = 0;
+
4776 LPTOP_LEVEL_EXCEPTION_FILTER FatalConditionHandler::previousTop = nullptr;
+
4777
+
4778#else // DOCTEST_PLATFORM_WINDOWS
+
4779
+
4780 struct SignalDefs
+
4781 {
+
4782 int id;
+
4783 const char* name;
+
4784 };
+
4785 SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
+
4786 {SIGILL, "SIGILL - Illegal instruction signal"},
+
4787 {SIGFPE, "SIGFPE - Floating point error signal"},
+
4788 {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
+
4789 {SIGTERM, "SIGTERM - Termination request signal"},
+
4790 {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};
+
4791
+
4792 struct FatalConditionHandler
+
4793 {
+
4794 static bool isSet;
+
4795 static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
+
4796 static stack_t oldSigStack;
+
4797 static size_t altStackSize;
+
4798 static char* altStackMem;
+
4799
+
4800 static void handleSignal(int sig) {
+
4801 const char* name = "<unknown signal>";
+
4802 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
4803 SignalDefs& def = signalDefs[i];
+
4804 if(sig == def.id) {
+
4805 name = def.name;
+
4806 break;
+
4807 }
+
4808 }
+
4809 reset();
+
4810 reportFatal(name);
+
4811 raise(sig);
+
4812 }
+
4813
+
4814 static void allocateAltStackMem() {
+
4815 altStackMem = new char[altStackSize];
+
4816 }
+
4817
+
4818 static void freeAltStackMem() {
+
4819 delete[] altStackMem;
+
4820 }
+
4821
+
4822 FatalConditionHandler() {
+
4823 isSet = true;
+
4824 stack_t sigStack;
+
4825 sigStack.ss_sp = altStackMem;
+
4826 sigStack.ss_size = altStackSize;
+
4827 sigStack.ss_flags = 0;
+
4828 sigaltstack(&sigStack, &oldSigStack);
+
4829 struct sigaction sa = {};
+
4830 sa.sa_handler = handleSignal;
+
4831 sa.sa_flags = SA_ONSTACK;
+
4832 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
4833 sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
+
4834 }
+
4835 }
+
4836
+
4837 ~FatalConditionHandler() { reset(); }
+
4838 static void reset() {
+
4839 if(isSet) {
+
4840 // Set signals back to previous values -- hopefully nobody overwrote them in the meantime
+
4841 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
4842 sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
+
4843 }
+
4844 // Return the old stack
+
4845 sigaltstack(&oldSigStack, nullptr);
+
4846 isSet = false;
+
4847 }
+
4848 }
+
4849 };
+
4850
+
4851 bool FatalConditionHandler::isSet = false;
+
4852 struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
+
4853 stack_t FatalConditionHandler::oldSigStack = {};
+
4854 size_t FatalConditionHandler::altStackSize = 4 * SIGSTKSZ;
+
4855 char* FatalConditionHandler::altStackMem = nullptr;
+
4856
+
4857#endif // DOCTEST_PLATFORM_WINDOWS
+
4858#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
4859
+
4860} // namespace
+
4861
+
4862namespace {
+
4863 using namespace detail;
+
4864
+
4865#ifdef DOCTEST_PLATFORM_WINDOWS
+
4866#define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)
+
4867#else
+
4868 // TODO: integration with XCode and other IDEs
+
4869#define DOCTEST_OUTPUT_DEBUG_STRING(text)
+
4870#endif // Platform
+
4871
+
4872 void addAssert(assertType::Enum at) {
+
4873 if((at & assertType::is_warn) == 0)
+
4874 g_cs->numAssertsCurrentTest_atomic++;
+
4875 }
+
4876
+
4877 void addFailedAssert(assertType::Enum at) {
+
4878 if((at & assertType::is_warn) == 0)
+
4879 g_cs->numAssertsFailedCurrentTest_atomic++;
+
4880 }
+
4881
+
4882#if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
4883 void reportFatal(const std::string& message) {
+
4884 g_cs->failure_flags |= TestCaseFailureReason::Crash;
+
4885
+
4886 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(), true});
+
4887
+
4888 while (g_cs->subcaseStack.size()) {
+
4889 g_cs->subcaseStack.pop_back();
+
4890 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);
+
4891 }
+
4892
+
4893 g_cs->finalizeTestCaseData();
+
4894
+
4895 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
+
4896
+
4897 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
+
4898 }
+
4899#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
4900} // namespace
+
4901
+
4902AssertData::AssertData(assertType::Enum at, const char* file, int line, const char* expr,
+
4903 const char* exception_type, const StringContains& exception_string)
+
4904 : m_test_case(g_cs->currentTest), m_at(at), m_file(file), m_line(line), m_expr(expr),
+
4905 m_failed(true), m_threw(false), m_threw_as(false), m_exception_type(exception_type),
+
4906 m_exception_string(exception_string) {
+
4907#if DOCTEST_MSVC
+
4908 if (m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC
+
4909 ++m_expr;
+
4910#endif // MSVC
+
4911}
+
4912
+
4913namespace detail {
+
4914 ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
4915 const char* exception_type, const String& exception_string)
+
4916 : AssertData(at, file, line, expr, exception_type, exception_string) { }
+
4917
+
4918 ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
4919 const char* exception_type, const Contains& exception_string)
+
4920 : AssertData(at, file, line, expr, exception_type, exception_string) { }
+
4921
+
4922 void ResultBuilder::setResult(const Result& res) {
+
4923 m_decomp = res.m_decomp;
+
4924 m_failed = !res.m_passed;
+
4925 }
+
4926
+
4927 void ResultBuilder::translateException() {
+
4928 m_threw = true;
+
4929 m_exception = translateActiveException();
+
4930 }
+
4931
+
4932 bool ResultBuilder::log() {
+
4933 if(m_at & assertType::is_throws) {
+
4934 m_failed = !m_threw;
+
4935 } else if((m_at & assertType::is_throws_as) && (m_at & assertType::is_throws_with)) {
+
4936 m_failed = !m_threw_as || !m_exception_string.check(m_exception);
+
4937 } else if(m_at & assertType::is_throws_as) {
+
4938 m_failed = !m_threw_as;
+
4939 } else if(m_at & assertType::is_throws_with) {
+
4940 m_failed = !m_exception_string.check(m_exception);
+
4941 } else if(m_at & assertType::is_nothrow) {
+
4942 m_failed = m_threw;
+
4943 }
+
4944
+
4945 if(m_exception.size())
+
4946 m_exception = "\"" + m_exception + "\"";
+
4947
+
4948 if(is_running_in_test) {
+
4949 addAssert(m_at);
+
4950 DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *this);
+
4951
+
4952 if(m_failed)
+
4953 addFailedAssert(m_at);
+
4954 } else if(m_failed) {
+
4955 failed_out_of_a_testing_context(*this);
+
4956 }
+
4957
+
4958 return m_failed && isDebuggerActive() && !getContextOptions()->no_breaks &&
+
4959 (g_cs->currentTest == nullptr || !g_cs->currentTest->m_no_breaks); // break into debugger
+
4960 }
+
4961
+
4962 void ResultBuilder::react() const {
+
4963 if(m_failed && checkIfShouldThrow(m_at))
+
4964 throwException();
+
4965 }
+
4966
+
4967 void failed_out_of_a_testing_context(const AssertData& ad) {
+
4968 if(g_cs->ah)
+
4969 g_cs->ah(ad);
+
4970 else
+
4971 std::abort();
+
4972 }
+
4973
+
4974 bool decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,
+
4975 const Result& result) {
+
4976 bool failed = !result.m_passed;
+
4977
+
4978 // ###################################################################################
+
4979 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
4980 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
4981 // ###################################################################################
+
4982 DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);
+
4983 DOCTEST_ASSERT_IN_TESTS(result.m_decomp);
+
4984 return !failed;
+
4985 }
+
4986
+
4987 MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {
+
4988 m_stream = tlssPush();
+
4989 m_file = file;
+
4990 m_line = line;
+
4991 m_severity = severity;
+
4992 }
+
4993
+
4994 MessageBuilder::~MessageBuilder() {
+
4995 if (!logged)
+
4996 tlssPop();
+
4997 }
+
4998
+
4999 DOCTEST_DEFINE_INTERFACE(IExceptionTranslator)
+
5000
+
5001 bool MessageBuilder::log() {
+
5002 if (!logged) {
+
5003 m_string = tlssPop();
+
5004 logged = true;
+
5005 }
+
5006
+
5007 DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);
+
5008
+
5009 const bool isWarn = m_severity & assertType::is_warn;
+
5010
+
5011 // warn is just a message in this context so we don't treat it as an assert
+
5012 if(!isWarn) {
+
5013 addAssert(m_severity);
+
5014 addFailedAssert(m_severity);
+
5015 }
+
5016
+
5017 return isDebuggerActive() && !getContextOptions()->no_breaks && !isWarn &&
+
5018 (g_cs->currentTest == nullptr || !g_cs->currentTest->m_no_breaks); // break into debugger
+
5019 }
+
5020
+
5021 void MessageBuilder::react() {
+
5022 if(m_severity & assertType::is_require)
+
5023 throwException();
+
5024 }
+
5025} // namespace detail
+
5026namespace {
+
5027 using namespace detail;
+
5028
+
5029 // clang-format off
+
5030
+
5031// =================================================================================================
+
5032// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp
+
5033// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.
+
5034// =================================================================================================
+
5035
+
5036 class XmlEncode {
+
5037 public:
+
5038 enum ForWhat { ForTextNodes, ForAttributes };
+
5039
+
5040 XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );
+
5041
+
5042 void encodeTo( std::ostream& os ) const;
+
5043
+
5044 friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );
+
5045
+
5046 private:
+
5047 std::string m_str;
+
5048 ForWhat m_forWhat;
+
5049 };
+
5050
+
5051 class XmlWriter {
+
5052 public:
+
5053
+
5054 class ScopedElement {
+
5055 public:
+
5056 ScopedElement( XmlWriter* writer );
+
5057
+
5058 ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT;
+
5059 ScopedElement& operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT;
+
5060
+
5061 ~ScopedElement();
+
5062
+
5063 ScopedElement& writeText( std::string const& text, bool indent = true );
+
5064
+
5065 template<typename T>
+
5066 ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
+
5067 m_writer->writeAttribute( name, attribute );
+
5068 return *this;
+
5069 }
+
5070
+
5071 private:
+
5072 mutable XmlWriter* m_writer = nullptr;
+
5073 };
+
5074
+
5075#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
5076 XmlWriter( std::ostream& os = std::cout );
+
5077#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
5078 XmlWriter( std::ostream& os );
+
5079#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
5080 ~XmlWriter();
+
5081
+
5082 XmlWriter( XmlWriter const& ) = delete;
+
5083 XmlWriter& operator=( XmlWriter const& ) = delete;
+
5084
+
5085 XmlWriter& startElement( std::string const& name );
+
5086
+
5087 ScopedElement scopedElement( std::string const& name );
+
5088
+
5089 XmlWriter& endElement();
+
5090
+
5091 XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );
+
5092
+
5093 XmlWriter& writeAttribute( std::string const& name, const char* attribute );
+
5094
+
5095 XmlWriter& writeAttribute( std::string const& name, bool attribute );
+
5096
+
5097 template<typename T>
+
5098 XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
+
5099 std::stringstream rss;
+
5100 rss << attribute;
+
5101 return writeAttribute( name, rss.str() );
+
5102 }
+
5103
+
5104 XmlWriter& writeText( std::string const& text, bool indent = true );
+
5105
+
5106 //XmlWriter& writeComment( std::string const& text );
+
5107
+
5108 //void writeStylesheetRef( std::string const& url );
+
5109
+
5110 //XmlWriter& writeBlankLine();
+
5111
+
5112 void ensureTagClosed();
+
5113
+
5114 void writeDeclaration();
+
5115
+
5116 private:
+
5117
+
5118 void newlineIfNecessary();
+
5119
+
5120 bool m_tagIsOpen = false;
+
5121 bool m_needsNewline = false;
+
5122 std::vector<std::string> m_tags;
+
5123 std::string m_indent;
+
5124 std::ostream& m_os;
+
5125 };
+
5126
+
5127// =================================================================================================
+
5128// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp
+
5129// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.
+
5130// =================================================================================================
+
5131
+
5132using uchar = unsigned char;
+
5133
+
5134namespace {
+
5135
+
5136 size_t trailingBytes(unsigned char c) {
+
5137 if ((c & 0xE0) == 0xC0) {
+
5138 return 2;
+
5139 }
+
5140 if ((c & 0xF0) == 0xE0) {
+
5141 return 3;
+
5142 }
+
5143 if ((c & 0xF8) == 0xF0) {
+
5144 return 4;
+
5145 }
+
5146 DOCTEST_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+
5147 }
+
5148
+
5149 uint32_t headerValue(unsigned char c) {
+
5150 if ((c & 0xE0) == 0xC0) {
+
5151 return c & 0x1F;
+
5152 }
+
5153 if ((c & 0xF0) == 0xE0) {
+
5154 return c & 0x0F;
+
5155 }
+
5156 if ((c & 0xF8) == 0xF0) {
+
5157 return c & 0x07;
+
5158 }
+
5159 DOCTEST_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+
5160 }
+
5161
+
5162 void hexEscapeChar(std::ostream& os, unsigned char c) {
+
5163 std::ios_base::fmtflags f(os.flags());
+
5164 os << "\\x"
+
5165 << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
+
5166 << static_cast<int>(c);
+
5167 os.flags(f);
+
5168 }
+
5169
+
5170} // anonymous namespace
+
5171
+
5172 XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )
+
5173 : m_str( str ),
+
5174 m_forWhat( forWhat )
+
5175 {}
+
5176
+
5177 void XmlEncode::encodeTo( std::ostream& os ) const {
+
5178 // Apostrophe escaping not necessary if we always use " to write attributes
+
5179 // (see: https://www.w3.org/TR/xml/#syntax)
+
5180
+
5181 for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
+
5182 uchar c = m_str[idx];
+
5183 switch (c) {
+
5184 case '<': os << "&lt;"; break;
+
5185 case '&': os << "&amp;"; break;
+
5186
+
5187 case '>':
+
5188 // See: https://www.w3.org/TR/xml/#syntax
+
5189 if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')
+
5190 os << "&gt;";
+
5191 else
+
5192 os << c;
+
5193 break;
+
5194
+
5195 case '\"':
+
5196 if (m_forWhat == ForAttributes)
+
5197 os << "&quot;";
+
5198 else
+
5199 os << c;
+
5200 break;
+
5201
+
5202 default:
+
5203 // Check for control characters and invalid utf-8
+
5204
+
5205 // Escape control characters in standard ascii
+
5206 // see https://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
+
5207 if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
+
5208 hexEscapeChar(os, c);
+
5209 break;
+
5210 }
+
5211
+
5212 // Plain ASCII: Write it to stream
+
5213 if (c < 0x7F) {
+
5214 os << c;
+
5215 break;
+
5216 }
+
5217
+
5218 // UTF-8 territory
+
5219 // Check if the encoding is valid and if it is not, hex escape bytes.
+
5220 // Important: We do not check the exact decoded values for validity, only the encoding format
+
5221 // First check that this bytes is a valid lead byte:
+
5222 // This means that it is not encoded as 1111 1XXX
+
5223 // Or as 10XX XXXX
+
5224 if (c < 0xC0 ||
+
5225 c >= 0xF8) {
+
5226 hexEscapeChar(os, c);
+
5227 break;
+
5228 }
+
5229
+
5230 auto encBytes = trailingBytes(c);
+
5231 // Are there enough bytes left to avoid accessing out-of-bounds memory?
+
5232 if (idx + encBytes - 1 >= m_str.size()) {
+
5233 hexEscapeChar(os, c);
+
5234 break;
+
5235 }
+
5236 // The header is valid, check data
+
5237 // The next encBytes bytes must together be a valid utf-8
+
5238 // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)
+
5239 bool valid = true;
+
5240 uint32_t value = headerValue(c);
+
5241 for (std::size_t n = 1; n < encBytes; ++n) {
+
5242 uchar nc = m_str[idx + n];
+
5243 valid &= ((nc & 0xC0) == 0x80);
+
5244 value = (value << 6) | (nc & 0x3F);
+
5245 }
+
5246
+
5247 if (
+
5248 // Wrong bit pattern of following bytes
+
5249 (!valid) ||
+
5250 // Overlong encodings
+
5251 (value < 0x80) ||
+
5252 ( value < 0x800 && encBytes > 2) || // removed "0x80 <= value &&" because redundant
+
5253 (0x800 < value && value < 0x10000 && encBytes > 3) ||
+
5254 // Encoded value out of range
+
5255 (value >= 0x110000)
+
5256 ) {
+
5257 hexEscapeChar(os, c);
+
5258 break;
+
5259 }
+
5260
+
5261 // If we got here, this is in fact a valid(ish) utf-8 sequence
+
5262 for (std::size_t n = 0; n < encBytes; ++n) {
+
5263 os << m_str[idx + n];
+
5264 }
+
5265 idx += encBytes - 1;
+
5266 break;
+
5267 }
+
5268 }
+
5269 }
+
5270
+
5271 std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {
+
5272 xmlEncode.encodeTo( os );
+
5273 return os;
+
5274 }
+
5275
+
5276 XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )
+
5277 : m_writer( writer )
+
5278 {}
+
5279
+
5280 XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT
+
5281 : m_writer( other.m_writer ){
+
5282 other.m_writer = nullptr;
+
5283 }
+
5284 XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT {
+
5285 if ( m_writer ) {
+
5286 m_writer->endElement();
+
5287 }
+
5288 m_writer = other.m_writer;
+
5289 other.m_writer = nullptr;
+
5290 return *this;
+
5291 }
+
5292
+
5293
+
5294 XmlWriter::ScopedElement::~ScopedElement() {
+
5295 if( m_writer )
+
5296 m_writer->endElement();
+
5297 }
+
5298
+
5299 XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) {
+
5300 m_writer->writeText( text, indent );
+
5301 return *this;
+
5302 }
+
5303
+
5304 XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )
+
5305 {
+
5306 // writeDeclaration(); // called explicitly by the reporters that use the writer class - see issue #627
+
5307 }
+
5308
+
5309 XmlWriter::~XmlWriter() {
+
5310 while( !m_tags.empty() )
+
5311 endElement();
+
5312 }
+
5313
+
5314 XmlWriter& XmlWriter::startElement( std::string const& name ) {
+
5315 ensureTagClosed();
+
5316 newlineIfNecessary();
+
5317 m_os << m_indent << '<' << name;
+
5318 m_tags.push_back( name );
+
5319 m_indent += " ";
+
5320 m_tagIsOpen = true;
+
5321 return *this;
+
5322 }
+
5323
+
5324 XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) {
+
5325 ScopedElement scoped( this );
+
5326 startElement( name );
+
5327 return scoped;
+
5328 }
+
5329
+
5330 XmlWriter& XmlWriter::endElement() {
+
5331 newlineIfNecessary();
+
5332 m_indent = m_indent.substr( 0, m_indent.size()-2 );
+
5333 if( m_tagIsOpen ) {
+
5334 m_os << "/>";
+
5335 m_tagIsOpen = false;
+
5336 }
+
5337 else {
+
5338 m_os << m_indent << "</" << m_tags.back() << ">";
+
5339 }
+
5340 m_os << std::endl;
+
5341 m_tags.pop_back();
+
5342 return *this;
+
5343 }
+
5344
+
5345 XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {
+
5346 if( !name.empty() && !attribute.empty() )
+
5347 m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+
5348 return *this;
+
5349 }
+
5350
+
5351 XmlWriter& XmlWriter::writeAttribute( std::string const& name, const char* attribute ) {
+
5352 if( !name.empty() && attribute && attribute[0] != '\0' )
+
5353 m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+
5354 return *this;
+
5355 }
+
5356
+
5357 XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {
+
5358 m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
+
5359 return *this;
+
5360 }
+
5361
+
5362 XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) {
+
5363 if( !text.empty() ){
+
5364 bool tagWasOpen = m_tagIsOpen;
+
5365 ensureTagClosed();
+
5366 if( tagWasOpen && indent )
+
5367 m_os << m_indent;
+
5368 m_os << XmlEncode( text );
+
5369 m_needsNewline = true;
+
5370 }
+
5371 return *this;
+
5372 }
+
5373
+
5374 //XmlWriter& XmlWriter::writeComment( std::string const& text ) {
+
5375 // ensureTagClosed();
+
5376 // m_os << m_indent << "<!--" << text << "-->";
+
5377 // m_needsNewline = true;
+
5378 // return *this;
+
5379 //}
+
5380
+
5381 //void XmlWriter::writeStylesheetRef( std::string const& url ) {
+
5382 // m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
+
5383 //}
+
5384
+
5385 //XmlWriter& XmlWriter::writeBlankLine() {
+
5386 // ensureTagClosed();
+
5387 // m_os << '\n';
+
5388 // return *this;
+
5389 //}
+
5390
+
5391 void XmlWriter::ensureTagClosed() {
+
5392 if( m_tagIsOpen ) {
+
5393 m_os << ">" << std::endl;
+
5394 m_tagIsOpen = false;
+
5395 }
+
5396 }
+
5397
+
5398 void XmlWriter::writeDeclaration() {
+
5399 m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
5400 }
+
5401
+
5402 void XmlWriter::newlineIfNecessary() {
+
5403 if( m_needsNewline ) {
+
5404 m_os << std::endl;
+
5405 m_needsNewline = false;
+
5406 }
+
5407 }
+
5408
+
5409// =================================================================================================
+
5410// End of copy-pasted code from Catch
+
5411// =================================================================================================
+
5412
+
5413 // clang-format on
+
5414
+
5415 struct XmlReporter : public IReporter
+
5416 {
+
5417 XmlWriter xml;
+
5418 DOCTEST_DECLARE_MUTEX(mutex)
+
5419
+
5420 // caching pointers/references to objects of these types - safe to do
+
5421 const ContextOptions& opt;
+
5422 const TestCaseData* tc = nullptr;
+
5423
+
5424 XmlReporter(const ContextOptions& co)
+
5425 : xml(*co.cout)
+
5426 , opt(co) {}
+
5427
+
5428 void log_contexts() {
+
5429 int num_contexts = get_num_active_contexts();
+
5430 if(num_contexts) {
+
5431 auto contexts = get_active_contexts();
+
5432 std::stringstream ss;
+
5433 for(int i = 0; i < num_contexts; ++i) {
+
5434 contexts[i]->stringify(&ss);
+
5435 xml.scopedElement("Info").writeText(ss.str());
+
5436 ss.str("");
+
5437 }
+
5438 }
+
5439 }
+
5440
+
5441 unsigned line(unsigned l) const { return opt.no_line_numbers ? 0 : l; }
+
5442
+
5443 void test_case_start_impl(const TestCaseData& in) {
+
5444 bool open_ts_tag = false;
+
5445 if(tc != nullptr) { // we have already opened a test suite
+
5446 if(std::strcmp(tc->m_test_suite, in.m_test_suite) != 0) {
+
5447 xml.endElement();
+
5448 open_ts_tag = true;
+
5449 }
+
5450 }
+
5451 else {
+
5452 open_ts_tag = true; // first test case ==> first test suite
+
5453 }
+
5454
+
5455 if(open_ts_tag) {
+
5456 xml.startElement("TestSuite");
+
5457 xml.writeAttribute("name", in.m_test_suite);
+
5458 }
+
5459
+
5460 tc = &in;
+
5461 xml.startElement("TestCase")
+
5462 .writeAttribute("name", in.m_name)
+
5463 .writeAttribute("filename", skipPathFromFilename(in.m_file.c_str()))
+
5464 .writeAttribute("line", line(in.m_line))
+
5465 .writeAttribute("description", in.m_description);
+
5466
+
5467 if(Approx(in.m_timeout) != 0)
+
5468 xml.writeAttribute("timeout", in.m_timeout);
+
5469 if(in.m_may_fail)
+
5470 xml.writeAttribute("may_fail", true);
+
5471 if(in.m_should_fail)
+
5472 xml.writeAttribute("should_fail", true);
+
5473 }
+
5474
+
5475 // =========================================================================================
+
5476 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
5477 // =========================================================================================
+
5478
+
5479 void report_query(const QueryData& in) override {
+
5480 test_run_start();
+
5481 if(opt.list_reporters) {
+
5482 for(auto& curr : getListeners())
+
5483 xml.scopedElement("Listener")
+
5484 .writeAttribute("priority", curr.first.first)
+
5485 .writeAttribute("name", curr.first.second);
+
5486 for(auto& curr : getReporters())
+
5487 xml.scopedElement("Reporter")
+
5488 .writeAttribute("priority", curr.first.first)
+
5489 .writeAttribute("name", curr.first.second);
+
5490 } else if(opt.count || opt.list_test_cases) {
+
5491 for(unsigned i = 0; i < in.num_data; ++i) {
+
5492 xml.scopedElement("TestCase").writeAttribute("name", in.data[i]->m_name)
+
5493 .writeAttribute("testsuite", in.data[i]->m_test_suite)
+
5494 .writeAttribute("filename", skipPathFromFilename(in.data[i]->m_file.c_str()))
+
5495 .writeAttribute("line", line(in.data[i]->m_line))
+
5496 .writeAttribute("skipped", in.data[i]->m_skip);
+
5497 }
+
5498 xml.scopedElement("OverallResultsTestCases")
+
5499 .writeAttribute("unskipped", in.run_stats->numTestCasesPassingFilters);
+
5500 } else if(opt.list_test_suites) {
+
5501 for(unsigned i = 0; i < in.num_data; ++i)
+
5502 xml.scopedElement("TestSuite").writeAttribute("name", in.data[i]->m_test_suite);
+
5503 xml.scopedElement("OverallResultsTestCases")
+
5504 .writeAttribute("unskipped", in.run_stats->numTestCasesPassingFilters);
+
5505 xml.scopedElement("OverallResultsTestSuites")
+
5506 .writeAttribute("unskipped", in.run_stats->numTestSuitesPassingFilters);
+
5507 }
+
5508 xml.endElement();
+
5509 }
+
5510
+
5511 void test_run_start() override {
+
5512 xml.writeDeclaration();
+
5513
+
5514 // remove .exe extension - mainly to have the same output on UNIX and Windows
+
5515 std::string binary_name = skipPathFromFilename(opt.binary_name.c_str());
+
5516#ifdef DOCTEST_PLATFORM_WINDOWS
+
5517 if(binary_name.rfind(".exe") != std::string::npos)
+
5518 binary_name = binary_name.substr(0, binary_name.length() - 4);
+
5519#endif // DOCTEST_PLATFORM_WINDOWS
+
5520
+
5521 xml.startElement("doctest").writeAttribute("binary", binary_name);
+
5522 if(opt.no_version == false)
+
5523 xml.writeAttribute("version", DOCTEST_VERSION_STR);
+
5524
+
5525 // only the consequential ones (TODO: filters)
+
5526 xml.scopedElement("Options")
+
5527 .writeAttribute("order_by", opt.order_by.c_str())
+
5528 .writeAttribute("rand_seed", opt.rand_seed)
+
5529 .writeAttribute("first", opt.first)
+
5530 .writeAttribute("last", opt.last)
+
5531 .writeAttribute("abort_after", opt.abort_after)
+
5532 .writeAttribute("subcase_filter_levels", opt.subcase_filter_levels)
+
5533 .writeAttribute("case_sensitive", opt.case_sensitive)
+
5534 .writeAttribute("no_throw", opt.no_throw)
+
5535 .writeAttribute("no_skip", opt.no_skip);
+
5536 }
+
5537
+
5538 void test_run_end(const TestRunStats& p) override {
+
5539 if(tc) // the TestSuite tag - only if there has been at least 1 test case
+
5540 xml.endElement();
+
5541
+
5542 xml.scopedElement("OverallResultsAsserts")
+
5543 .writeAttribute("successes", p.numAsserts - p.numAssertsFailed)
+
5544 .writeAttribute("failures", p.numAssertsFailed);
+
5545
+
5546 xml.startElement("OverallResultsTestCases")
+
5547 .writeAttribute("successes",
+
5548 p.numTestCasesPassingFilters - p.numTestCasesFailed)
+
5549 .writeAttribute("failures", p.numTestCasesFailed);
+
5550 if(opt.no_skipped_summary == false)
+
5551 xml.writeAttribute("skipped", p.numTestCases - p.numTestCasesPassingFilters);
+
5552 xml.endElement();
+
5553
+
5554 xml.endElement();
+
5555 }
+
5556
+
5557 void test_case_start(const TestCaseData& in) override {
+
5558 test_case_start_impl(in);
+
5559 xml.ensureTagClosed();
+
5560 }
+
5561
+
5562 void test_case_reenter(const TestCaseData&) override {}
+
5563
+
5564 void test_case_end(const CurrentTestCaseStats& st) override {
+
5565 xml.startElement("OverallResultsAsserts")
+
5566 .writeAttribute("successes",
+
5567 st.numAssertsCurrentTest - st.numAssertsFailedCurrentTest)
+
5568 .writeAttribute("failures", st.numAssertsFailedCurrentTest)
+
5569 .writeAttribute("test_case_success", st.testCaseSuccess);
+
5570 if(opt.duration)
+
5571 xml.writeAttribute("duration", st.seconds);
+
5572 if(tc->m_expected_failures)
+
5573 xml.writeAttribute("expected_failures", tc->m_expected_failures);
+
5574 xml.endElement();
+
5575
+
5576 xml.endElement();
+
5577 }
+
5578
+
5579 void test_case_exception(const TestCaseException& e) override {
+
5580 DOCTEST_LOCK_MUTEX(mutex)
+
5581
+
5582 xml.scopedElement("Exception")
+
5583 .writeAttribute("crash", e.is_crash)
+
5584 .writeText(e.error_string.c_str());
+
5585 }
+
5586
+
5587 void subcase_start(const SubcaseSignature& in) override {
+
5588 xml.startElement("SubCase")
+
5589 .writeAttribute("name", in.m_name)
+
5590 .writeAttribute("filename", skipPathFromFilename(in.m_file))
+
5591 .writeAttribute("line", line(in.m_line));
+
5592 xml.ensureTagClosed();
+
5593 }
+
5594
+
5595 void subcase_end() override { xml.endElement(); }
+
5596
+
5597 void log_assert(const AssertData& rb) override {
+
5598 if(!rb.m_failed && !opt.success)
+
5599 return;
+
5600
+
5601 DOCTEST_LOCK_MUTEX(mutex)
+
5602
+
5603 xml.startElement("Expression")
+
5604 .writeAttribute("success", !rb.m_failed)
+
5605 .writeAttribute("type", assertString(rb.m_at))
+
5606 .writeAttribute("filename", skipPathFromFilename(rb.m_file))
+
5607 .writeAttribute("line", line(rb.m_line));
+
5608
+
5609 xml.scopedElement("Original").writeText(rb.m_expr);
+
5610
+
5611 if(rb.m_threw)
+
5612 xml.scopedElement("Exception").writeText(rb.m_exception.c_str());
+
5613
+
5614 if(rb.m_at & assertType::is_throws_as)
+
5615 xml.scopedElement("ExpectedException").writeText(rb.m_exception_type);
+
5616 if(rb.m_at & assertType::is_throws_with)
+
5617 xml.scopedElement("ExpectedExceptionString").writeText(rb.m_exception_string.c_str());
+
5618 if((rb.m_at & assertType::is_normal) && !rb.m_threw)
+
5619 xml.scopedElement("Expanded").writeText(rb.m_decomp.c_str());
+
5620
+
5621 log_contexts();
+
5622
+
5623 xml.endElement();
+
5624 }
+
5625
+
5626 void log_message(const MessageData& mb) override {
+
5627 DOCTEST_LOCK_MUTEX(mutex)
+
5628
+
5629 xml.startElement("Message")
+
5630 .writeAttribute("type", failureString(mb.m_severity))
+
5631 .writeAttribute("filename", skipPathFromFilename(mb.m_file))
+
5632 .writeAttribute("line", line(mb.m_line));
+
5633
+
5634 xml.scopedElement("Text").writeText(mb.m_string.c_str());
+
5635
+
5636 log_contexts();
+
5637
+
5638 xml.endElement();
+
5639 }
+
5640
+
5641 void test_case_skipped(const TestCaseData& in) override {
+
5642 if(opt.no_skipped_summary == false) {
+
5643 test_case_start_impl(in);
+
5644 xml.writeAttribute("skipped", "true");
+
5645 xml.endElement();
+
5646 }
+
5647 }
+
5648 };
+
5649
+
5650 DOCTEST_REGISTER_REPORTER("xml", 0, XmlReporter);
+
5651
+
5652 void fulltext_log_assert_to_stream(std::ostream& s, const AssertData& rb) {
+
5653 if((rb.m_at & (assertType::is_throws_as | assertType::is_throws_with)) ==
+
5654 0)
+
5655 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << " ) "
+
5656 << Color::None;
+
5657
+
5658 if(rb.m_at & assertType::is_throws) {
+
5659 s << (rb.m_threw ? "threw as expected!" : "did NOT throw at all!") << "\n";
+
5660 } else if((rb.m_at & assertType::is_throws_as) &&
+
5661 (rb.m_at & assertType::is_throws_with)) {
+
5662 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
+
5663 << rb.m_exception_string.c_str()
+
5664 << "\", " << rb.m_exception_type << " ) " << Color::None;
+
5665 if(rb.m_threw) {
+
5666 if(!rb.m_failed) {
+
5667 s << "threw as expected!\n";
+
5668 } else {
+
5669 s << "threw a DIFFERENT exception! (contents: " << rb.m_exception << ")\n";
+
5670 }
+
5671 } else {
+
5672 s << "did NOT throw at all!\n";
+
5673 }
+
5674 } else if(rb.m_at &
+
5675 assertType::is_throws_as) {
+
5676 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", "
+
5677 << rb.m_exception_type << " ) " << Color::None
+
5678 << (rb.m_threw ? (rb.m_threw_as ? "threw as expected!" :
+
5679 "threw a DIFFERENT exception: ") :
+
5680 "did NOT throw at all!")
+
5681 << Color::Cyan << rb.m_exception << "\n";
+
5682 } else if(rb.m_at &
+
5683 assertType::is_throws_with) {
+
5684 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
+
5685 << rb.m_exception_string.c_str()
+
5686 << "\" ) " << Color::None
+
5687 << (rb.m_threw ? (!rb.m_failed ? "threw as expected!" :
+
5688 "threw a DIFFERENT exception: ") :
+
5689 "did NOT throw at all!")
+
5690 << Color::Cyan << rb.m_exception << "\n";
+
5691 } else if(rb.m_at & assertType::is_nothrow) {
+
5692 s << (rb.m_threw ? "THREW exception: " : "didn't throw!") << Color::Cyan
+
5693 << rb.m_exception << "\n";
+
5694 } else {
+
5695 s << (rb.m_threw ? "THREW exception: " :
+
5696 (!rb.m_failed ? "is correct!\n" : "is NOT correct!\n"));
+
5697 if(rb.m_threw)
+
5698 s << rb.m_exception << "\n";
+
5699 else
+
5700 s << " values: " << assertString(rb.m_at) << "( " << rb.m_decomp << " )\n";
+
5701 }
+
5702 }
+
5703
+
5704 // TODO:
+
5705 // - log_message()
+
5706 // - respond to queries
+
5707 // - honor remaining options
+
5708 // - more attributes in tags
+
5709 struct JUnitReporter : public IReporter
+
5710 {
+
5711 XmlWriter xml;
+
5712 DOCTEST_DECLARE_MUTEX(mutex)
+
5713 Timer timer;
+
5714 std::vector<String> deepestSubcaseStackNames;
+
5715
+
5716 struct JUnitTestCaseData
+
5717 {
+
5718 static std::string getCurrentTimestamp() {
+
5719 // Beware, this is not reentrant because of backward compatibility issues
+
5720 // Also, UTC only, again because of backward compatibility (%z is C++11)
+
5721 time_t rawtime;
+
5722 std::time(&rawtime);
+
5723 auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
+
5724
+
5725 std::tm timeInfo;
+
5726#ifdef DOCTEST_PLATFORM_WINDOWS
+
5727 gmtime_s(&timeInfo, &rawtime);
+
5728#else // DOCTEST_PLATFORM_WINDOWS
+
5729 gmtime_r(&rawtime, &timeInfo);
+
5730#endif // DOCTEST_PLATFORM_WINDOWS
+
5731
+
5732 char timeStamp[timeStampSize];
+
5733 const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";
+
5734
+
5735 std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
+
5736 return std::string(timeStamp);
+
5737 }
+
5738
+
5739 struct JUnitTestMessage
+
5740 {
+
5741 JUnitTestMessage(const std::string& _message, const std::string& _type, const std::string& _details)
+
5742 : message(_message), type(_type), details(_details) {}
+
5743
+
5744 JUnitTestMessage(const std::string& _message, const std::string& _details)
+
5745 : message(_message), type(), details(_details) {}
+
5746
+
5747 std::string message, type, details;
+
5748 };
+
5749
+
5750 struct JUnitTestCase
+
5751 {
+
5752 JUnitTestCase(const std::string& _classname, const std::string& _name)
+
5753 : classname(_classname), name(_name), time(0), failures() {}
+
5754
+
5755 std::string classname, name;
+
5756 double time;
+
5757 std::vector<JUnitTestMessage> failures, errors;
+
5758 };
+
5759
+
5760 void add(const std::string& classname, const std::string& name) {
+
5761 testcases.emplace_back(classname, name);
+
5762 }
+
5763
+
5764 void appendSubcaseNamesToLastTestcase(std::vector<String> nameStack) {
+
5765 for(auto& curr: nameStack)
+
5766 if(curr.size())
+
5767 testcases.back().name += std::string("/") + curr.c_str();
+
5768 }
+
5769
+
5770 void addTime(double time) {
+
5771 if(time < 1e-4)
+
5772 time = 0;
+
5773 testcases.back().time = time;
+
5774 totalSeconds += time;
+
5775 }
+
5776
+
5777 void addFailure(const std::string& message, const std::string& type, const std::string& details) {
+
5778 testcases.back().failures.emplace_back(message, type, details);
+
5779 ++totalFailures;
+
5780 }
+
5781
+
5782 void addError(const std::string& message, const std::string& details) {
+
5783 testcases.back().errors.emplace_back(message, details);
+
5784 ++totalErrors;
+
5785 }
+
5786
+
5787 std::vector<JUnitTestCase> testcases;
+
5788 double totalSeconds = 0;
+
5789 int totalErrors = 0, totalFailures = 0;
+
5790 };
+
5791
+
5792 JUnitTestCaseData testCaseData;
+
5793
+
5794 // caching pointers/references to objects of these types - safe to do
+
5795 const ContextOptions& opt;
+
5796 const TestCaseData* tc = nullptr;
+
5797
+
5798 JUnitReporter(const ContextOptions& co)
+
5799 : xml(*co.cout)
+
5800 , opt(co) {}
+
5801
+
5802 unsigned line(unsigned l) const { return opt.no_line_numbers ? 0 : l; }
+
5803
+
5804 // =========================================================================================
+
5805 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
5806 // =========================================================================================
+
5807
+
5808 void report_query(const QueryData&) override {
+
5809 xml.writeDeclaration();
+
5810 }
+
5811
+
5812 void test_run_start() override {
+
5813 xml.writeDeclaration();
+
5814 }
+
5815
+
5816 void test_run_end(const TestRunStats& p) override {
+
5817 // remove .exe extension - mainly to have the same output on UNIX and Windows
+
5818 std::string binary_name = skipPathFromFilename(opt.binary_name.c_str());
+
5819#ifdef DOCTEST_PLATFORM_WINDOWS
+
5820 if(binary_name.rfind(".exe") != std::string::npos)
+
5821 binary_name = binary_name.substr(0, binary_name.length() - 4);
+
5822#endif // DOCTEST_PLATFORM_WINDOWS
+
5823 xml.startElement("testsuites");
+
5824 xml.startElement("testsuite").writeAttribute("name", binary_name)
+
5825 .writeAttribute("errors", testCaseData.totalErrors)
+
5826 .writeAttribute("failures", testCaseData.totalFailures)
+
5827 .writeAttribute("tests", p.numAsserts);
+
5828 if(opt.no_time_in_output == false) {
+
5829 xml.writeAttribute("time", testCaseData.totalSeconds);
+
5830 xml.writeAttribute("timestamp", JUnitTestCaseData::getCurrentTimestamp());
+
5831 }
+
5832 if(opt.no_version == false)
+
5833 xml.writeAttribute("doctest_version", DOCTEST_VERSION_STR);
+
5834
+
5835 for(const auto& testCase : testCaseData.testcases) {
+
5836 xml.startElement("testcase")
+
5837 .writeAttribute("classname", testCase.classname)
+
5838 .writeAttribute("name", testCase.name);
+
5839 if(opt.no_time_in_output == false)
+
5840 xml.writeAttribute("time", testCase.time);
+
5841 // This is not ideal, but it should be enough to mimic gtest's junit output.
+
5842 xml.writeAttribute("status", "run");
+
5843
+
5844 for(const auto& failure : testCase.failures) {
+
5845 xml.scopedElement("failure")
+
5846 .writeAttribute("message", failure.message)
+
5847 .writeAttribute("type", failure.type)
+
5848 .writeText(failure.details, false);
+
5849 }
+
5850
+
5851 for(const auto& error : testCase.errors) {
+
5852 xml.scopedElement("error")
+
5853 .writeAttribute("message", error.message)
+
5854 .writeText(error.details);
+
5855 }
+
5856
+
5857 xml.endElement();
+
5858 }
+
5859 xml.endElement();
+
5860 xml.endElement();
+
5861 }
+
5862
+
5863 void test_case_start(const TestCaseData& in) override {
+
5864 testCaseData.add(skipPathFromFilename(in.m_file.c_str()), in.m_name);
+
5865 timer.start();
+
5866 }
+
5867
+
5868 void test_case_reenter(const TestCaseData& in) override {
+
5869 testCaseData.addTime(timer.getElapsedSeconds());
+
5870 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
+
5871 deepestSubcaseStackNames.clear();
+
5872
+
5873 timer.start();
+
5874 testCaseData.add(skipPathFromFilename(in.m_file.c_str()), in.m_name);
+
5875 }
+
5876
+
5877 void test_case_end(const CurrentTestCaseStats&) override {
+
5878 testCaseData.addTime(timer.getElapsedSeconds());
+
5879 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
+
5880 deepestSubcaseStackNames.clear();
+
5881 }
+
5882
+
5883 void test_case_exception(const TestCaseException& e) override {
+
5884 DOCTEST_LOCK_MUTEX(mutex)
+
5885 testCaseData.addError("exception", e.error_string.c_str());
+
5886 }
+
5887
+
5888 void subcase_start(const SubcaseSignature& in) override {
+
5889 deepestSubcaseStackNames.push_back(in.m_name);
+
5890 }
+
5891
+
5892 void subcase_end() override {}
+
5893
+
5894 void log_assert(const AssertData& rb) override {
+
5895 if(!rb.m_failed) // report only failures & ignore the `success` option
+
5896 return;
+
5897
+
5898 DOCTEST_LOCK_MUTEX(mutex)
+
5899
+
5900 std::ostringstream os;
+
5901 os << skipPathFromFilename(rb.m_file) << (opt.gnu_file_line ? ":" : "(")
+
5902 << line(rb.m_line) << (opt.gnu_file_line ? ":" : "):") << std::endl;
+
5903
+
5904 fulltext_log_assert_to_stream(os, rb);
+
5905 log_contexts(os);
+
5906 testCaseData.addFailure(rb.m_decomp.c_str(), assertString(rb.m_at), os.str());
+
5907 }
+
5908
+
5909 void log_message(const MessageData& mb) override {
+
5910 if(mb.m_severity & assertType::is_warn) // report only failures
+
5911 return;
+
5912
+
5913 DOCTEST_LOCK_MUTEX(mutex)
+
5914
+
5915 std::ostringstream os;
+
5916 os << skipPathFromFilename(mb.m_file) << (opt.gnu_file_line ? ":" : "(")
+
5917 << line(mb.m_line) << (opt.gnu_file_line ? ":" : "):") << std::endl;
+
5918
+
5919 os << mb.m_string.c_str() << "\n";
+
5920 log_contexts(os);
+
5921
+
5922 testCaseData.addFailure(mb.m_string.c_str(),
+
5923 mb.m_severity & assertType::is_check ? "FAIL_CHECK" : "FAIL", os.str());
+
5924 }
+
5925
+
5926 void test_case_skipped(const TestCaseData&) override {}
+
5927
+
5928 void log_contexts(std::ostringstream& s) {
+
5929 int num_contexts = get_num_active_contexts();
+
5930 if(num_contexts) {
+
5931 auto contexts = get_active_contexts();
+
5932
+
5933 s << " logged: ";
+
5934 for(int i = 0; i < num_contexts; ++i) {
+
5935 s << (i == 0 ? "" : " ");
+
5936 contexts[i]->stringify(&s);
+
5937 s << std::endl;
+
5938 }
+
5939 }
+
5940 }
+
5941 };
+
5942
+
5943 DOCTEST_REGISTER_REPORTER("junit", 0, JUnitReporter);
+
5944
+
5945 struct Whitespace
+
5946 {
+
5947 int nrSpaces;
+
5948 explicit Whitespace(int nr)
+
5949 : nrSpaces(nr) {}
+
5950 };
+
5951
+
5952 std::ostream& operator<<(std::ostream& out, const Whitespace& ws) {
+
5953 if(ws.nrSpaces != 0)
+
5954 out << std::setw(ws.nrSpaces) << ' ';
+
5955 return out;
+
5956 }
+
5957
+
5958 struct ConsoleReporter : public IReporter
+
5959 {
+
5960 std::ostream& s;
+
5961 bool hasLoggedCurrentTestStart;
+
5962 std::vector<SubcaseSignature> subcasesStack;
+
5963 size_t currentSubcaseLevel;
+
5964 DOCTEST_DECLARE_MUTEX(mutex)
+
5965
+
5966 // caching pointers/references to objects of these types - safe to do
+
5967 const ContextOptions& opt;
+
5968 const TestCaseData* tc;
+
5969
+
5970 ConsoleReporter(const ContextOptions& co)
+
5971 : s(*co.cout)
+
5972 , opt(co) {}
+
5973
+
5974 ConsoleReporter(const ContextOptions& co, std::ostream& ostr)
+
5975 : s(ostr)
+
5976 , opt(co) {}
+
5977
+
5978 // =========================================================================================
+
5979 // WHAT FOLLOWS ARE HELPERS USED BY THE OVERRIDES OF THE VIRTUAL METHODS OF THE INTERFACE
+
5980 // =========================================================================================
+
5981
+
5982 void separator_to_stream() {
+
5983 s << Color::Yellow
+
5984 << "==============================================================================="
+
5985 "\n";
+
5986 }
+
5987
+
5988 const char* getSuccessOrFailString(bool success, assertType::Enum at,
+
5989 const char* success_str) {
+
5990 if(success)
+
5991 return success_str;
+
5992 return failureString(at);
+
5993 }
+
5994
+
5995 Color::Enum getSuccessOrFailColor(bool success, assertType::Enum at) {
+
5996 return success ? Color::BrightGreen :
+
5997 (at & assertType::is_warn) ? Color::Yellow : Color::Red;
+
5998 }
+
5999
+
6000 void successOrFailColoredStringToStream(bool success, assertType::Enum at,
+
6001 const char* success_str = "SUCCESS") {
+
6002 s << getSuccessOrFailColor(success, at)
+
6003 << getSuccessOrFailString(success, at, success_str) << ": ";
+
6004 }
+
6005
+
6006 void log_contexts() {
+
6007 int num_contexts = get_num_active_contexts();
+
6008 if(num_contexts) {
+
6009 auto contexts = get_active_contexts();
+
6010
+
6011 s << Color::None << " logged: ";
+
6012 for(int i = 0; i < num_contexts; ++i) {
+
6013 s << (i == 0 ? "" : " ");
+
6014 contexts[i]->stringify(&s);
+
6015 s << "\n";
+
6016 }
+
6017 }
+
6018
+
6019 s << "\n";
+
6020 }
+
6021
+
6022 // this was requested to be made virtual so users could override it
+
6023 virtual void file_line_to_stream(const char* file, int line,
+
6024 const char* tail = "") {
+
6025 s << Color::LightGrey << skipPathFromFilename(file) << (opt.gnu_file_line ? ":" : "(")
+
6026 << (opt.no_line_numbers ? 0 : line) // 0 or the real num depending on the option
+
6027 << (opt.gnu_file_line ? ":" : "):") << tail;
+
6028 }
+
6029
+
6030 void logTestStart() {
+
6031 if(hasLoggedCurrentTestStart)
+
6032 return;
+
6033
+
6034 separator_to_stream();
+
6035 file_line_to_stream(tc->m_file.c_str(), tc->m_line, "\n");
+
6036 if(tc->m_description)
+
6037 s << Color::Yellow << "DESCRIPTION: " << Color::None << tc->m_description << "\n";
+
6038 if(tc->m_test_suite && tc->m_test_suite[0] != '\0')
+
6039 s << Color::Yellow << "TEST SUITE: " << Color::None << tc->m_test_suite << "\n";
+
6040 if(strncmp(tc->m_name, " Scenario:", 11) != 0)
+
6041 s << Color::Yellow << "TEST CASE: ";
+
6042 s << Color::None << tc->m_name << "\n";
+
6043
+
6044 for(size_t i = 0; i < currentSubcaseLevel; ++i) {
+
6045 if(subcasesStack[i].m_name[0] != '\0')
+
6046 s << " " << subcasesStack[i].m_name << "\n";
+
6047 }
+
6048
+
6049 if(currentSubcaseLevel != subcasesStack.size()) {
+
6050 s << Color::Yellow << "\nDEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):\n" << Color::None;
+
6051 for(size_t i = 0; i < subcasesStack.size(); ++i) {
+
6052 if(subcasesStack[i].m_name[0] != '\0')
+
6053 s << " " << subcasesStack[i].m_name << "\n";
+
6054 }
+
6055 }
+
6056
+
6057 s << "\n";
+
6058
+
6059 hasLoggedCurrentTestStart = true;
+
6060 }
+
6061
+
6062 void printVersion() {
+
6063 if(opt.no_version == false)
+
6064 s << Color::Cyan << "[doctest] " << Color::None << "doctest version is \""
+
6065 << DOCTEST_VERSION_STR << "\"\n";
+
6066 }
+
6067
+
6068 void printIntro() {
+
6069 if(opt.no_intro == false) {
+
6070 printVersion();
+
6071 s << Color::Cyan << "[doctest] " << Color::None
+
6072 << "run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY "help\" for options\n";
+
6073 }
+
6074 }
+
6075
+
6076 void printHelp() {
+
6077 int sizePrefixDisplay = static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
+
6078 printVersion();
+
6079 // clang-format off
+
6080 s << Color::Cyan << "[doctest]\n" << Color::None;
+
6081 s << Color::Cyan << "[doctest] " << Color::None;
+
6082 s << "boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
+
6083 s << Color::Cyan << "[doctest] " << Color::None;
+
6084 s << "filter values: \"str1,str2,str3\" (comma separated strings)\n";
+
6085 s << Color::Cyan << "[doctest]\n" << Color::None;
+
6086 s << Color::Cyan << "[doctest] " << Color::None;
+
6087 s << "filters use wildcards for matching strings\n";
+
6088 s << Color::Cyan << "[doctest] " << Color::None;
+
6089 s << "something passes a filter if any of the strings in a filter matches\n";
+
6090#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
6091 s << Color::Cyan << "[doctest]\n" << Color::None;
+
6092 s << Color::Cyan << "[doctest] " << Color::None;
+
6093 s << "ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX "\" PREFIX!!!\n";
+
6094#endif
+
6095 s << Color::Cyan << "[doctest]\n" << Color::None;
+
6096 s << Color::Cyan << "[doctest] " << Color::None;
+
6097 s << "Query flags - the program quits after them. Available:\n\n";
+
6098 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "?, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY "h "
+
6099 << Whitespace(sizePrefixDisplay*0) << "prints this message\n";
+
6100 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "v, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "version "
+
6101 << Whitespace(sizePrefixDisplay*1) << "prints the version\n";
+
6102 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "c, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "count "
+
6103 << Whitespace(sizePrefixDisplay*1) << "prints the number of matching tests\n";
+
6104 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-cases "
+
6105 << Whitespace(sizePrefixDisplay*1) << "lists all matching tests by name\n";
+
6106 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-suites "
+
6107 << Whitespace(sizePrefixDisplay*1) << "lists all matching test suites\n";
+
6108 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-reporters "
+
6109 << Whitespace(sizePrefixDisplay*1) << "lists all registered reporters\n\n";
+
6110 // ================================================================================== << 79
+
6111 s << Color::Cyan << "[doctest] " << Color::None;
+
6112 s << "The available <int>/<string> options/filters are:\n\n";
+
6113 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case=<filters> "
+
6114 << Whitespace(sizePrefixDisplay*1) << "filters tests by their name\n";
+
6115 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case-exclude=<filters> "
+
6116 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their name\n";
+
6117 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file=<filters> "
+
6118 << Whitespace(sizePrefixDisplay*1) << "filters tests by their file\n";
+
6119 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file-exclude=<filters> "
+
6120 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their file\n";
+
6121 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite=<filters> "
+
6122 << Whitespace(sizePrefixDisplay*1) << "filters tests by their test suite\n";
+
6123 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite-exclude=<filters> "
+
6124 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their test suite\n";
+
6125 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase=<filters> "
+
6126 << Whitespace(sizePrefixDisplay*1) << "filters subcases by their name\n";
+
6127 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-exclude=<filters> "
+
6128 << Whitespace(sizePrefixDisplay*1) << "filters OUT subcases by their name\n";
+
6129 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "r, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "reporters=<filters> "
+
6130 << Whitespace(sizePrefixDisplay*1) << "reporters to use (console is default)\n";
+
6131 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "o, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "out=<string> "
+
6132 << Whitespace(sizePrefixDisplay*1) << "output filename\n";
+
6133 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ob, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "order-by=<string> "
+
6134 << Whitespace(sizePrefixDisplay*1) << "how the tests should be ordered\n";
+
6135 s << Whitespace(sizePrefixDisplay*3) << " <string> - [file/suite/name/rand/none]\n";
+
6136 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "rs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "rand-seed=<int> "
+
6137 << Whitespace(sizePrefixDisplay*1) << "seed for random ordering\n";
+
6138 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "f, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "first=<int> "
+
6139 << Whitespace(sizePrefixDisplay*1) << "the first test passing the filters to\n";
+
6140 s << Whitespace(sizePrefixDisplay*3) << " execute - for range-based execution\n";
+
6141 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "l, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "last=<int> "
+
6142 << Whitespace(sizePrefixDisplay*1) << "the last test passing the filters to\n";
+
6143 s << Whitespace(sizePrefixDisplay*3) << " execute - for range-based execution\n";
+
6144 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "aa, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "abort-after=<int> "
+
6145 << Whitespace(sizePrefixDisplay*1) << "stop after <int> failed assertions\n";
+
6146 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-filter-levels=<int> "
+
6147 << Whitespace(sizePrefixDisplay*1) << "apply filters for the first <int> levels\n";
+
6148 s << Color::Cyan << "\n[doctest] " << Color::None;
+
6149 s << "Bool options - can be used like flags and true is assumed. Available:\n\n";
+
6150 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "s, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "success=<bool> "
+
6151 << Whitespace(sizePrefixDisplay*1) << "include successful assertions in output\n";
+
6152 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "cs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "case-sensitive=<bool> "
+
6153 << Whitespace(sizePrefixDisplay*1) << "filters being treated as case sensitive\n";
+
6154 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "e, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "exit=<bool> "
+
6155 << Whitespace(sizePrefixDisplay*1) << "exits after the tests finish\n";
+
6156 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "d, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "duration=<bool> "
+
6157 << Whitespace(sizePrefixDisplay*1) << "prints the time duration of each test\n";
+
6158 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "m, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "minimal=<bool> "
+
6159 << Whitespace(sizePrefixDisplay*1) << "minimal console output (only failures)\n";
+
6160 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "q, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "quiet=<bool> "
+
6161 << Whitespace(sizePrefixDisplay*1) << "no console output\n";
+
6162 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nt, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-throw=<bool> "
+
6163 << Whitespace(sizePrefixDisplay*1) << "skips exceptions-related assert checks\n";
+
6164 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ne, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-exitcode=<bool> "
+
6165 << Whitespace(sizePrefixDisplay*1) << "returns (or exits) always with success\n";
+
6166 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-run=<bool> "
+
6167 << Whitespace(sizePrefixDisplay*1) << "skips all runtime doctest operations\n";
+
6168 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ni, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-intro=<bool> "
+
6169 << Whitespace(sizePrefixDisplay*1) << "omit the framework intro in the output\n";
+
6170 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nv, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-version=<bool> "
+
6171 << Whitespace(sizePrefixDisplay*1) << "omit the framework version in the output\n";
+
6172 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-colors=<bool> "
+
6173 << Whitespace(sizePrefixDisplay*1) << "disables colors in output\n";
+
6174 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "fc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "force-colors=<bool> "
+
6175 << Whitespace(sizePrefixDisplay*1) << "use colors even when not in a tty\n";
+
6176 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nb, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-breaks=<bool> "
+
6177 << Whitespace(sizePrefixDisplay*1) << "disables breakpoints in debuggers\n";
+
6178 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ns, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-skip=<bool> "
+
6179 << Whitespace(sizePrefixDisplay*1) << "don't skip test cases marked as skip\n";
+
6180 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "gnu-file-line=<bool> "
+
6181 << Whitespace(sizePrefixDisplay*1) << ":n: vs (n): for line numbers in output\n";
+
6182 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-path-filenames=<bool> "
+
6183 << Whitespace(sizePrefixDisplay*1) << "only filenames and no paths in output\n";
+
6184 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-line-numbers=<bool> "
+
6185 << Whitespace(sizePrefixDisplay*1) << "0 instead of real line numbers in output\n";
+
6186 // ================================================================================== << 79
+
6187 // clang-format on
+
6188
+
6189 s << Color::Cyan << "\n[doctest] " << Color::None;
+
6190 s << "for more information visit the project documentation\n\n";
+
6191 }
+
6192
+
6193 void printRegisteredReporters() {
+
6194 printVersion();
+
6195 auto printReporters = [this] (const reporterMap& reporters, const char* type) {
+
6196 if(reporters.size()) {
+
6197 s << Color::Cyan << "[doctest] " << Color::None << "listing all registered " << type << "\n";
+
6198 for(auto& curr : reporters)
+
6199 s << "priority: " << std::setw(5) << curr.first.first
+
6200 << " name: " << curr.first.second << "\n";
+
6201 }
+
6202 };
+
6203 printReporters(getListeners(), "listeners");
+
6204 printReporters(getReporters(), "reporters");
+
6205 }
+
6206
+
6207 // =========================================================================================
+
6208 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
6209 // =========================================================================================
+
6210
+
6211 void report_query(const QueryData& in) override {
+
6212 if(opt.version) {
+
6213 printVersion();
+
6214 } else if(opt.help) {
+
6215 printHelp();
+
6216 } else if(opt.list_reporters) {
+
6217 printRegisteredReporters();
+
6218 } else if(opt.count || opt.list_test_cases) {
+
6219 if(opt.list_test_cases) {
+
6220 s << Color::Cyan << "[doctest] " << Color::None
+
6221 << "listing all test case names\n";
+
6222 separator_to_stream();
+
6223 }
+
6224
+
6225 for(unsigned i = 0; i < in.num_data; ++i)
+
6226 s << Color::None << in.data[i]->m_name << "\n";
+
6227
+
6228 separator_to_stream();
+
6229
+
6230 s << Color::Cyan << "[doctest] " << Color::None
+
6231 << "unskipped test cases passing the current filters: "
+
6232 << g_cs->numTestCasesPassingFilters << "\n";
+
6233
+
6234 } else if(opt.list_test_suites) {
+
6235 s << Color::Cyan << "[doctest] " << Color::None << "listing all test suites\n";
+
6236 separator_to_stream();
+
6237
+
6238 for(unsigned i = 0; i < in.num_data; ++i)
+
6239 s << Color::None << in.data[i]->m_test_suite << "\n";
+
6240
+
6241 separator_to_stream();
+
6242
+
6243 s << Color::Cyan << "[doctest] " << Color::None
+
6244 << "unskipped test cases passing the current filters: "
+
6245 << g_cs->numTestCasesPassingFilters << "\n";
+
6246 s << Color::Cyan << "[doctest] " << Color::None
+
6247 << "test suites with unskipped test cases passing the current filters: "
+
6248 << g_cs->numTestSuitesPassingFilters << "\n";
+
6249 }
+
6250 }
+
6251
+
6252 void test_run_start() override {
+
6253 if(!opt.minimal)
+
6254 printIntro();
+
6255 }
+
6256
+
6257 void test_run_end(const TestRunStats& p) override {
+
6258 if(opt.minimal && p.numTestCasesFailed == 0)
+
6259 return;
+
6260
+
6261 separator_to_stream();
+
6262 s << std::dec;
+
6263
+
6264 auto totwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters, static_cast<unsigned>(p.numAsserts))) + 1)));
+
6265 auto passwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters - p.numTestCasesFailed, static_cast<unsigned>(p.numAsserts - p.numAssertsFailed))) + 1)));
+
6266 auto failwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesFailed, static_cast<unsigned>(p.numAssertsFailed))) + 1)));
+
6267 const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
+
6268 s << Color::Cyan << "[doctest] " << Color::None << "test cases: " << std::setw(totwidth)
+
6269 << p.numTestCasesPassingFilters << " | "
+
6270 << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ? Color::None :
+
6271 Color::Green)
+
6272 << std::setw(passwidth) << p.numTestCasesPassingFilters - p.numTestCasesFailed << " passed"
+
6273 << Color::None << " | " << (p.numTestCasesFailed > 0 ? Color::Red : Color::None)
+
6274 << std::setw(failwidth) << p.numTestCasesFailed << " failed" << Color::None << " |";
+
6275 if(opt.no_skipped_summary == false) {
+
6276 const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
+
6277 s << " " << (numSkipped == 0 ? Color::None : Color::Yellow) << numSkipped
+
6278 << " skipped" << Color::None;
+
6279 }
+
6280 s << "\n";
+
6281 s << Color::Cyan << "[doctest] " << Color::None << "assertions: " << std::setw(totwidth)
+
6282 << p.numAsserts << " | "
+
6283 << ((p.numAsserts == 0 || anythingFailed) ? Color::None : Color::Green)
+
6284 << std::setw(passwidth) << (p.numAsserts - p.numAssertsFailed) << " passed" << Color::None
+
6285 << " | " << (p.numAssertsFailed > 0 ? Color::Red : Color::None) << std::setw(failwidth)
+
6286 << p.numAssertsFailed << " failed" << Color::None << " |\n";
+
6287 s << Color::Cyan << "[doctest] " << Color::None
+
6288 << "Status: " << (p.numTestCasesFailed > 0 ? Color::Red : Color::Green)
+
6289 << ((p.numTestCasesFailed > 0) ? "FAILURE!" : "SUCCESS!") << Color::None << std::endl;
+
6290 }
+
6291
+
6292 void test_case_start(const TestCaseData& in) override {
+
6293 hasLoggedCurrentTestStart = false;
+
6294 tc = &in;
+
6295 subcasesStack.clear();
+
6296 currentSubcaseLevel = 0;
+
6297 }
+
6298
+
6299 void test_case_reenter(const TestCaseData&) override {
+
6300 subcasesStack.clear();
+
6301 }
+
6302
+
6303 void test_case_end(const CurrentTestCaseStats& st) override {
+
6304 if(tc->m_no_output)
+
6305 return;
+
6306
+
6307 // log the preamble of the test case only if there is something
+
6308 // else to print - something other than that an assert has failed
+
6309 if(opt.duration ||
+
6310 (st.failure_flags && st.failure_flags != static_cast<int>(TestCaseFailureReason::AssertFailure)))
+
6311 logTestStart();
+
6312
+
6313 if(opt.duration)
+
6314 s << Color::None << std::setprecision(6) << std::fixed << st.seconds
+
6315 << " s: " << tc->m_name << "\n";
+
6316
+
6317 if(st.failure_flags & TestCaseFailureReason::Timeout)
+
6318 s << Color::Red << "Test case exceeded time limit of " << std::setprecision(6)
+
6319 << std::fixed << tc->m_timeout << "!\n";
+
6320
+
6321 if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedButDidnt) {
+
6322 s << Color::Red << "Should have failed but didn't! Marking it as failed!\n";
+
6323 } else if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedAndDid) {
+
6324 s << Color::Yellow << "Failed as expected so marking it as not failed\n";
+
6325 } else if(st.failure_flags & TestCaseFailureReason::CouldHaveFailedAndDid) {
+
6326 s << Color::Yellow << "Allowed to fail so marking it as not failed\n";
+
6327 } else if(st.failure_flags & TestCaseFailureReason::DidntFailExactlyNumTimes) {
+
6328 s << Color::Red << "Didn't fail exactly " << tc->m_expected_failures
+
6329 << " times so marking it as failed!\n";
+
6330 } else if(st.failure_flags & TestCaseFailureReason::FailedExactlyNumTimes) {
+
6331 s << Color::Yellow << "Failed exactly " << tc->m_expected_failures
+
6332 << " times as expected so marking it as not failed!\n";
+
6333 }
+
6334 if(st.failure_flags & TestCaseFailureReason::TooManyFailedAsserts) {
+
6335 s << Color::Red << "Aborting - too many failed asserts!\n";
+
6336 }
+
6337 s << Color::None; // lgtm [cpp/useless-expression]
+
6338 }
+
6339
+
6340 void test_case_exception(const TestCaseException& e) override {
+
6341 DOCTEST_LOCK_MUTEX(mutex)
+
6342 if(tc->m_no_output)
+
6343 return;
+
6344
+
6345 logTestStart();
+
6346
+
6347 file_line_to_stream(tc->m_file.c_str(), tc->m_line, " ");
+
6348 successOrFailColoredStringToStream(false, e.is_crash ? assertType::is_require :
+
6349 assertType::is_check);
+
6350 s << Color::Red << (e.is_crash ? "test case CRASHED: " : "test case THREW exception: ")
+
6351 << Color::Cyan << e.error_string << "\n";
+
6352
+
6353 int num_stringified_contexts = get_num_stringified_contexts();
+
6354 if(num_stringified_contexts) {
+
6355 auto stringified_contexts = get_stringified_contexts();
+
6356 s << Color::None << " logged: ";
+
6357 for(int i = num_stringified_contexts; i > 0; --i) {
+
6358 s << (i == num_stringified_contexts ? "" : " ")
+
6359 << stringified_contexts[i - 1] << "\n";
+
6360 }
+
6361 }
+
6362 s << "\n" << Color::None;
+
6363 }
+
6364
+
6365 void subcase_start(const SubcaseSignature& subc) override {
+
6366 subcasesStack.push_back(subc);
+
6367 ++currentSubcaseLevel;
+
6368 hasLoggedCurrentTestStart = false;
+
6369 }
+
6370
+
6371 void subcase_end() override {
+
6372 --currentSubcaseLevel;
+
6373 hasLoggedCurrentTestStart = false;
+
6374 }
+
6375
+
6376 void log_assert(const AssertData& rb) override {
+
6377 if((!rb.m_failed && !opt.success) || tc->m_no_output)
+
6378 return;
+
6379
+
6380 DOCTEST_LOCK_MUTEX(mutex)
+
6381
+
6382 logTestStart();
+
6383
+
6384 file_line_to_stream(rb.m_file, rb.m_line, " ");
+
6385 successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
+
6386
+
6387 fulltext_log_assert_to_stream(s, rb);
+
6388
+
6389 log_contexts();
+
6390 }
+
6391
+
6392 void log_message(const MessageData& mb) override {
+
6393 if(tc->m_no_output)
+
6394 return;
+
6395
+
6396 DOCTEST_LOCK_MUTEX(mutex)
+
6397
+
6398 logTestStart();
+
6399
+
6400 file_line_to_stream(mb.m_file, mb.m_line, " ");
+
6401 s << getSuccessOrFailColor(false, mb.m_severity)
+
6402 << getSuccessOrFailString(mb.m_severity & assertType::is_warn, mb.m_severity,
+
6403 "MESSAGE") << ": ";
+
6404 s << Color::None << mb.m_string << "\n";
+
6405 log_contexts();
+
6406 }
+
6407
+
6408 void test_case_skipped(const TestCaseData&) override {}
+
6409 };
+
6410
+
6411 DOCTEST_REGISTER_REPORTER("console", 0, ConsoleReporter);
+
6412
+
6413#ifdef DOCTEST_PLATFORM_WINDOWS
+
6414 struct DebugOutputWindowReporter : public ConsoleReporter
+
6415 {
+
6416 DOCTEST_THREAD_LOCAL static std::ostringstream oss;
+
6417
+
6418 DebugOutputWindowReporter(const ContextOptions& co)
+
6419 : ConsoleReporter(co, oss) {}
+
6420
+
6421#define DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(func, type, arg) \
+
6422 void func(type arg) override { \
+
6423 bool with_col = g_no_colors; \
+
6424 g_no_colors = false; \
+
6425 ConsoleReporter::func(arg); \
+
6426 if(oss.tellp() != std::streampos{}) { \
+
6427 DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str()); \
+
6428 oss.str(""); \
+
6429 } \
+
6430 g_no_colors = with_col; \
+
6431 }
+
6432
+
6433 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_start, DOCTEST_EMPTY, DOCTEST_EMPTY)
+
6434 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_end, const TestRunStats&, in)
+
6435 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_start, const TestCaseData&, in)
+
6436 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_reenter, const TestCaseData&, in)
+
6437 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_end, const CurrentTestCaseStats&, in)
+
6438 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_exception, const TestCaseException&, in)
+
6439 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_start, const SubcaseSignature&, in)
+
6440 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_end, DOCTEST_EMPTY, DOCTEST_EMPTY)
+
6441 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_assert, const AssertData&, in)
+
6442 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_message, const MessageData&, in)
+
6443 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_skipped, const TestCaseData&, in)
+
6444 };
+
6445
+
6446 DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
+
6447#endif // DOCTEST_PLATFORM_WINDOWS
+
6448
+
6449 // the implementation of parseOption()
+
6450 bool parseOptionImpl(int argc, const char* const* argv, const char* pattern, String* value) {
+
6451 // going from the end to the beginning and stopping on the first occurrence from the end
+
6452 for(int i = argc; i > 0; --i) {
+
6453 auto index = i - 1;
+
6454 auto temp = std::strstr(argv[index], pattern);
+
6455 if(temp && (value || strlen(temp) == strlen(pattern))) {
+
6456 // eliminate matches in which the chars before the option are not '-'
+
6457 bool noBadCharsFound = true;
+
6458 auto curr = argv[index];
+
6459 while(curr != temp) {
+
6460 if(*curr++ != '-') {
+
6461 noBadCharsFound = false;
+
6462 break;
+
6463 }
+
6464 }
+
6465 if(noBadCharsFound && argv[index][0] == '-') {
+
6466 if(value) {
+
6467 // parsing the value of an option
+
6468 temp += strlen(pattern);
+
6469 const unsigned len = strlen(temp);
+
6470 if(len) {
+
6471 *value = temp;
+
6472 return true;
+
6473 }
+
6474 } else {
+
6475 // just a flag - no value
+
6476 return true;
+
6477 }
+
6478 }
+
6479 }
+
6480 }
+
6481 return false;
+
6482 }
+
6483
+
6484 // parses an option and returns the string after the '=' character
+
6485 bool parseOption(int argc, const char* const* argv, const char* pattern, String* value = nullptr,
+
6486 const String& defaultVal = String()) {
+
6487 if(value)
+
6488 *value = defaultVal;
+
6489#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
6490 // offset (normally 3 for "dt-") to skip prefix
+
6491 if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), value))
+
6492 return true;
+
6493#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
6494 return parseOptionImpl(argc, argv, pattern, value);
+
6495 }
+
6496
+
6497 // locates a flag on the command line
+
6498 bool parseFlag(int argc, const char* const* argv, const char* pattern) {
+
6499 return parseOption(argc, argv, pattern);
+
6500 }
+
6501
+
6502 // parses a comma separated list of words after a pattern in one of the arguments in argv
+
6503 bool parseCommaSepArgs(int argc, const char* const* argv, const char* pattern,
+
6504 std::vector<String>& res) {
+
6505 String filtersString;
+
6506 if(parseOption(argc, argv, pattern, &filtersString)) {
+
6507 // tokenize with "," as a separator, unless escaped with backslash
+
6508 std::ostringstream s;
+
6509 auto flush = [&s, &res]() {
+
6510 auto string = s.str();
+
6511 if(string.size() > 0) {
+
6512 res.push_back(string.c_str());
+
6513 }
+
6514 s.str("");
+
6515 };
+
6516
+
6517 bool seenBackslash = false;
+
6518 const char* current = filtersString.c_str();
+
6519 const char* end = current + strlen(current);
+
6520 while(current != end) {
+
6521 char character = *current++;
+
6522 if(seenBackslash) {
+
6523 seenBackslash = false;
+
6524 if(character == ',' || character == '\\') {
+
6525 s.put(character);
+
6526 continue;
+
6527 }
+
6528 s.put('\\');
+
6529 }
+
6530 if(character == '\\') {
+
6531 seenBackslash = true;
+
6532 } else if(character == ',') {
+
6533 flush();
+
6534 } else {
+
6535 s.put(character);
+
6536 }
+
6537 }
+
6538
+
6539 if(seenBackslash) {
+
6540 s.put('\\');
+
6541 }
+
6542 flush();
+
6543 return true;
+
6544 }
+
6545 return false;
+
6546 }
+
6547
+
6548 enum optionType
+
6549 {
+
6550 option_bool,
+
6551 option_int
+
6552 };
+
6553
+
6554 // parses an int/bool option from the command line
+
6555 bool parseIntOption(int argc, const char* const* argv, const char* pattern, optionType type,
+
6556 int& res) {
+
6557 String parsedValue;
+
6558 if(!parseOption(argc, argv, pattern, &parsedValue))
+
6559 return false;
+
6560
+
6561 if(type) {
+
6562 // integer
+
6563 // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
+
6564 int theInt = std::atoi(parsedValue.c_str());
+
6565 if (theInt != 0) {
+
6566 res = theInt;
+
6567 return true;
+
6568 }
+
6569 } else {
+
6570 // boolean
+
6571 const char positive[][5] = { "1", "true", "on", "yes" }; // 5 - strlen("true") + 1
+
6572 const char negative[][6] = { "0", "false", "off", "no" }; // 6 - strlen("false") + 1
+
6573
+
6574 // if the value matches any of the positive/negative possibilities
+
6575 for (unsigned i = 0; i < 4; i++) {
+
6576 if (parsedValue.compare(positive[i], true) == 0) {
+
6577 res = 1;
+
6578 return true;
+
6579 }
+
6580 if (parsedValue.compare(negative[i], true) == 0) {
+
6581 res = 0;
+
6582 return true;
+
6583 }
+
6584 }
+
6585 }
+
6586 return false;
+
6587 }
+
6588} // namespace
+
6589
+
6590Context::Context(int argc, const char* const* argv)
+
6591 : p(new detail::ContextState) {
+
6592 parseArgs(argc, argv, true);
+
6593 if(argc)
+
6594 p->binary_name = argv[0];
+
6595}
+
6596
+
6597Context::~Context() {
+
6598 if(g_cs == p)
+
6599 g_cs = nullptr;
+
6600 delete p;
+
6601}
+
6602
+
6603void Context::applyCommandLine(int argc, const char* const* argv) {
+
6604 parseArgs(argc, argv);
+
6605 if(argc)
+
6606 p->binary_name = argv[0];
+
6607}
+
6608
+
6609// parses args
+
6610void Context::parseArgs(int argc, const char* const* argv, bool withDefaults) {
+
6611 using namespace detail;
+
6612
+
6613 // clang-format off
+
6614 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file=", p->filters[0]);
+
6615 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sf=", p->filters[0]);
+
6616 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file-exclude=",p->filters[1]);
+
6617 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sfe=", p->filters[1]);
+
6618 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite=", p->filters[2]);
+
6619 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ts=", p->filters[2]);
+
6620 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite-exclude=", p->filters[3]);
+
6621 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tse=", p->filters[3]);
+
6622 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case=", p->filters[4]);
+
6623 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tc=", p->filters[4]);
+
6624 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case-exclude=", p->filters[5]);
+
6625 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tce=", p->filters[5]);
+
6626 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase=", p->filters[6]);
+
6627 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sc=", p->filters[6]);
+
6628 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase-exclude=", p->filters[7]);
+
6629 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sce=", p->filters[7]);
+
6630 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "reporters=", p->filters[8]);
+
6631 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "r=", p->filters[8]);
+
6632 // clang-format on
+
6633
+
6634 int intRes = 0;
+
6635 String strRes;
+
6636
+
6637#define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default) \
+
6638 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) || \
+
6639 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes)) \
+
6640 p->var = static_cast<bool>(intRes); \
+
6641 else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) || \
+
6642 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname)) \
+
6643 p->var = true; \
+
6644 else if(withDefaults) \
+
6645 p->var = default
+
6646
+
6647#define DOCTEST_PARSE_INT_OPTION(name, sname, var, default) \
+
6648 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) || \
+
6649 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes)) \
+
6650 p->var = intRes; \
+
6651 else if(withDefaults) \
+
6652 p->var = default
+
6653
+
6654#define DOCTEST_PARSE_STR_OPTION(name, sname, var, default) \
+
6655 if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", &strRes, default) || \
+
6656 parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", &strRes, default) || \
+
6657 withDefaults) \
+
6658 p->var = strRes
+
6659
+
6660 // clang-format off
+
6661 DOCTEST_PARSE_STR_OPTION("out", "o", out, "");
+
6662 DOCTEST_PARSE_STR_OPTION("order-by", "ob", order_by, "file");
+
6663 DOCTEST_PARSE_INT_OPTION("rand-seed", "rs", rand_seed, 0);
+
6664
+
6665 DOCTEST_PARSE_INT_OPTION("first", "f", first, 0);
+
6666 DOCTEST_PARSE_INT_OPTION("last", "l", last, UINT_MAX);
+
6667
+
6668 DOCTEST_PARSE_INT_OPTION("abort-after", "aa", abort_after, 0);
+
6669 DOCTEST_PARSE_INT_OPTION("subcase-filter-levels", "scfl", subcase_filter_levels, INT_MAX);
+
6670
+
6671 DOCTEST_PARSE_AS_BOOL_OR_FLAG("success", "s", success, false);
+
6672 DOCTEST_PARSE_AS_BOOL_OR_FLAG("case-sensitive", "cs", case_sensitive, false);
+
6673 DOCTEST_PARSE_AS_BOOL_OR_FLAG("exit", "e", exit, false);
+
6674 DOCTEST_PARSE_AS_BOOL_OR_FLAG("duration", "d", duration, false);
+
6675 DOCTEST_PARSE_AS_BOOL_OR_FLAG("minimal", "m", minimal, false);
+
6676 DOCTEST_PARSE_AS_BOOL_OR_FLAG("quiet", "q", quiet, false);
+
6677 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-throw", "nt", no_throw, false);
+
6678 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-exitcode", "ne", no_exitcode, false);
+
6679 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-run", "nr", no_run, false);
+
6680 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-intro", "ni", no_intro, false);
+
6681 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-version", "nv", no_version, false);
+
6682 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-colors", "nc", no_colors, false);
+
6683 DOCTEST_PARSE_AS_BOOL_OR_FLAG("force-colors", "fc", force_colors, false);
+
6684 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-breaks", "nb", no_breaks, false);
+
6685 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skip", "ns", no_skip, false);
+
6686 DOCTEST_PARSE_AS_BOOL_OR_FLAG("gnu-file-line", "gfl", gnu_file_line, !bool(DOCTEST_MSVC));
+
6687 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-path-filenames", "npf", no_path_in_filenames, false);
+
6688 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-line-numbers", "nln", no_line_numbers, false);
+
6689 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-debug-output", "ndo", no_debug_output, false);
+
6690 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skipped-summary", "nss", no_skipped_summary, false);
+
6691 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-time-in-output", "ntio", no_time_in_output, false);
+
6692 // clang-format on
+
6693
+
6694 if(withDefaults) {
+
6695 p->help = false;
+
6696 p->version = false;
+
6697 p->count = false;
+
6698 p->list_test_cases = false;
+
6699 p->list_test_suites = false;
+
6700 p->list_reporters = false;
+
6701 }
+
6702 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "help") ||
+
6703 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "h") ||
+
6704 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "?")) {
+
6705 p->help = true;
+
6706 p->exit = true;
+
6707 }
+
6708 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "version") ||
+
6709 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "v")) {
+
6710 p->version = true;
+
6711 p->exit = true;
+
6712 }
+
6713 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "count") ||
+
6714 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "c")) {
+
6715 p->count = true;
+
6716 p->exit = true;
+
6717 }
+
6718 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-cases") ||
+
6719 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ltc")) {
+
6720 p->list_test_cases = true;
+
6721 p->exit = true;
+
6722 }
+
6723 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-suites") ||
+
6724 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lts")) {
+
6725 p->list_test_suites = true;
+
6726 p->exit = true;
+
6727 }
+
6728 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-reporters") ||
+
6729 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lr")) {
+
6730 p->list_reporters = true;
+
6731 p->exit = true;
+
6732 }
+
6733}
+
6734
+
6735// allows the user to add procedurally to the filters from the command line
+
6736void Context::addFilter(const char* filter, const char* value) { setOption(filter, value); }
+
6737
+
6738// allows the user to clear all filters from the command line
+
6739void Context::clearFilters() {
+
6740 for(auto& curr : p->filters)
+
6741 curr.clear();
+
6742}
+
6743
+
6744// allows the user to override procedurally the bool options from the command line
+
6745void Context::setOption(const char* option, bool value) {
+
6746 setOption(option, value ? "true" : "false");
+
6747}
+
6748
+
6749// allows the user to override procedurally the int options from the command line
+
6750void Context::setOption(const char* option, int value) {
+
6751 setOption(option, toString(value).c_str());
+
6752}
+
6753
+
6754// allows the user to override procedurally the string options from the command line
+
6755void Context::setOption(const char* option, const char* value) {
+
6756 auto argv = String("-") + option + "=" + value;
+
6757 auto lvalue = argv.c_str();
+
6758 parseArgs(1, &lvalue);
+
6759}
+
6760
+
6761// users should query this in their main() and exit the program if true
+
6762bool Context::shouldExit() { return p->exit; }
+
6763
+
6764void Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }
+
6765
+
6766void Context::setAssertHandler(detail::assert_handler ah) { p->ah = ah; }
+
6767
+
6768void Context::setCout(std::ostream* out) { p->cout = out; }
+
6769
+
6770static class DiscardOStream : public std::ostream
+
6771{
+
6772private:
+
6773 class : public std::streambuf
+
6774 {
+
6775 private:
+
6776 // allowing some buffering decreases the amount of calls to overflow
+
6777 char buf[1024];
+
6778
+
6779 protected:
+
6780 std::streamsize xsputn(const char_type*, std::streamsize count) override { return count; }
+
6781
+
6782 int_type overflow(int_type ch) override {
+
6783 setp(std::begin(buf), std::end(buf));
+
6784 return traits_type::not_eof(ch);
+
6785 }
+
6786 } discardBuf;
+
6787
+
6788public:
+
6789 DiscardOStream()
+
6790 : std::ostream(&discardBuf) {}
+
6791} discardOut;
+
6792
+
6793// the main function that does all the filtering and test running
+
6794int Context::run() {
+
6795 using namespace detail;
+
6796
+
6797 // save the old context state in case such was setup - for using asserts out of a testing context
+
6798 auto old_cs = g_cs;
+
6799 // this is the current contest
+
6800 g_cs = p;
+
6801 is_running_in_test = true;
+
6802
+
6803 g_no_colors = p->no_colors;
+
6804 p->resetRunData();
+
6805
+
6806 std::fstream fstr;
+
6807 if(p->cout == nullptr) {
+
6808 if(p->quiet) {
+
6809 p->cout = &discardOut;
+
6810 } else if(p->out.size()) {
+
6811 // to a file if specified
+
6812 fstr.open(p->out.c_str(), std::fstream::out);
+
6813 p->cout = &fstr;
+
6814 } else {
+
6815#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
6816 // stdout by default
+
6817 p->cout = &std::cout;
+
6818#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
6819 return EXIT_FAILURE;
+
6820#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
6821 }
+
6822 }
+
6823
+
6824 FatalConditionHandler::allocateAltStackMem();
+
6825
+
6826 auto cleanup_and_return = [&]() {
+
6827 FatalConditionHandler::freeAltStackMem();
+
6828
+
6829 if(fstr.is_open())
+
6830 fstr.close();
+
6831
+
6832 // restore context
+
6833 g_cs = old_cs;
+
6834 is_running_in_test = false;
+
6835
+
6836 // we have to free the reporters which were allocated when the run started
+
6837 for(auto& curr : p->reporters_currently_used)
+
6838 delete curr;
+
6839 p->reporters_currently_used.clear();
+
6840
+
6841 if(p->numTestCasesFailed && !p->no_exitcode)
+
6842 return EXIT_FAILURE;
+
6843 return EXIT_SUCCESS;
+
6844 };
+
6845
+
6846 // setup default reporter if none is given through the command line
+
6847 if(p->filters[8].empty())
+
6848 p->filters[8].push_back("console");
+
6849
+
6850 // check to see if any of the registered reporters has been selected
+
6851 for(auto& curr : getReporters()) {
+
6852 if(matchesAny(curr.first.second.c_str(), p->filters[8], false, p->case_sensitive))
+
6853 p->reporters_currently_used.push_back(curr.second(*g_cs));
+
6854 }
+
6855
+
6856 // TODO: check if there is nothing in reporters_currently_used
+
6857
+
6858 // prepend all listeners
+
6859 for(auto& curr : getListeners())
+
6860 p->reporters_currently_used.insert(p->reporters_currently_used.begin(), curr.second(*g_cs));
+
6861
+
6862#ifdef DOCTEST_PLATFORM_WINDOWS
+
6863 if(isDebuggerActive() && p->no_debug_output == false)
+
6864 p->reporters_currently_used.push_back(new DebugOutputWindowReporter(*g_cs));
+
6865#endif // DOCTEST_PLATFORM_WINDOWS
+
6866
+
6867 // handle version, help and no_run
+
6868 if(p->no_run || p->version || p->help || p->list_reporters) {
+
6869 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, QueryData());
+
6870
+
6871 return cleanup_and_return();
+
6872 }
+
6873
+
6874 std::vector<const TestCase*> testArray;
+
6875 for(auto& curr : getRegisteredTests())
+
6876 testArray.push_back(&curr);
+
6877 p->numTestCases = testArray.size();
+
6878
+
6879 // sort the collected records
+
6880 if(!testArray.empty()) {
+
6881 if(p->order_by.compare("file", true) == 0) {
+
6882 std::sort(testArray.begin(), testArray.end(), fileOrderComparator);
+
6883 } else if(p->order_by.compare("suite", true) == 0) {
+
6884 std::sort(testArray.begin(), testArray.end(), suiteOrderComparator);
+
6885 } else if(p->order_by.compare("name", true) == 0) {
+
6886 std::sort(testArray.begin(), testArray.end(), nameOrderComparator);
+
6887 } else if(p->order_by.compare("rand", true) == 0) {
+
6888 std::srand(p->rand_seed);
+
6889
+
6890 // random_shuffle implementation
+
6891 const auto first = &testArray[0];
+
6892 for(size_t i = testArray.size() - 1; i > 0; --i) {
+
6893 int idxToSwap = std::rand() % (i + 1);
+
6894
+
6895 const auto temp = first[i];
+
6896
+
6897 first[i] = first[idxToSwap];
+
6898 first[idxToSwap] = temp;
+
6899 }
+
6900 } else if(p->order_by.compare("none", true) == 0) {
+
6901 // means no sorting - beneficial for death tests which call into the executable
+
6902 // with a specific test case in mind - we don't want to slow down the startup times
+
6903 }
+
6904 }
+
6905
+
6906 std::set<String> testSuitesPassingFilt;
+
6907
+
6908 bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
+
6909 std::vector<const TestCaseData*> queryResults;
+
6910
+
6911 if(!query_mode)
+
6912 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start, DOCTEST_EMPTY);
+
6913
+
6914 // invoke the registered functions if they match the filter criteria (or just count them)
+
6915 for(auto& curr : testArray) {
+
6916 const auto& tc = *curr;
+
6917
+
6918 bool skip_me = false;
+
6919 if(tc.m_skip && !p->no_skip)
+
6920 skip_me = true;
+
6921
+
6922 if(!matchesAny(tc.m_file.c_str(), p->filters[0], true, p->case_sensitive))
+
6923 skip_me = true;
+
6924 if(matchesAny(tc.m_file.c_str(), p->filters[1], false, p->case_sensitive))
+
6925 skip_me = true;
+
6926 if(!matchesAny(tc.m_test_suite, p->filters[2], true, p->case_sensitive))
+
6927 skip_me = true;
+
6928 if(matchesAny(tc.m_test_suite, p->filters[3], false, p->case_sensitive))
+
6929 skip_me = true;
+
6930 if(!matchesAny(tc.m_name, p->filters[4], true, p->case_sensitive))
+
6931 skip_me = true;
+
6932 if(matchesAny(tc.m_name, p->filters[5], false, p->case_sensitive))
+
6933 skip_me = true;
+
6934
+
6935 if(!skip_me)
+
6936 p->numTestCasesPassingFilters++;
+
6937
+
6938 // skip the test if it is not in the execution range
+
6939 if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
+
6940 (p->first > p->numTestCasesPassingFilters))
+
6941 skip_me = true;
+
6942
+
6943 if(skip_me) {
+
6944 if(!query_mode)
+
6945 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
+
6946 continue;
+
6947 }
+
6948
+
6949 // do not execute the test if we are to only count the number of filter passing tests
+
6950 if(p->count)
+
6951 continue;
+
6952
+
6953 // print the name of the test and don't execute it
+
6954 if(p->list_test_cases) {
+
6955 queryResults.push_back(&tc);
+
6956 continue;
+
6957 }
+
6958
+
6959 // print the name of the test suite if not done already and don't execute it
+
6960 if(p->list_test_suites) {
+
6961 if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] != '\0') {
+
6962 queryResults.push_back(&tc);
+
6963 testSuitesPassingFilt.insert(tc.m_test_suite);
+
6964 p->numTestSuitesPassingFilters++;
+
6965 }
+
6966 continue;
+
6967 }
+
6968
+
6969 // execute the test if it passes all the filtering
+
6970 {
+
6971 p->currentTest = &tc;
+
6972
+
6973 p->failure_flags = TestCaseFailureReason::None;
+
6974 p->seconds = 0;
+
6975
+
6976 // reset atomic counters
+
6977 p->numAssertsFailedCurrentTest_atomic = 0;
+
6978 p->numAssertsCurrentTest_atomic = 0;
+
6979
+
6980 p->fullyTraversedSubcases.clear();
+
6981
+
6982 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
+
6983
+
6984 p->timer.start();
+
6985
+
6986 bool run_test = true;
+
6987
+
6988 do {
+
6989 // reset some of the fields for subcases (except for the set of fully passed ones)
+
6990 p->reachedLeaf = false;
+
6991 // May not be empty if previous subcase exited via exception.
+
6992 p->subcaseStack.clear();
+
6993 p->currentSubcaseDepth = 0;
+
6994
+
6995 p->shouldLogCurrentException = true;
+
6996
+
6997 // reset stuff for logging with INFO()
+
6998 p->stringifiedContexts.clear();
+
6999
+
7000#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
7001 try {
+
7002#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
7003// MSVC 2015 diagnoses fatalConditionHandler as unused (because reset() is a static method)
+
7004DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4101) // unreferenced local variable
+
7005 FatalConditionHandler fatalConditionHandler; // Handle signals
+
7006 // execute the test
+
7007 tc.m_test();
+
7008 fatalConditionHandler.reset();
+
7009DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
7010#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
7011 } catch(const TestFailureException&) {
+
7012 p->failure_flags |= TestCaseFailureReason::AssertFailure;
+
7013 } catch(...) {
+
7014 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception,
+
7015 {translateActiveException(), false});
+
7016 p->failure_flags |= TestCaseFailureReason::Exception;
+
7017 }
+
7018#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
7019
+
7020 // exit this loop if enough assertions have failed - even if there are more subcases
+
7021 if(p->abort_after > 0 &&
+
7022 p->numAssertsFailed + p->numAssertsFailedCurrentTest_atomic >= p->abort_after) {
+
7023 run_test = false;
+
7024 p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts;
+
7025 }
+
7026
+
7027 if(!p->nextSubcaseStack.empty() && run_test)
+
7028 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc);
+
7029 if(p->nextSubcaseStack.empty())
+
7030 run_test = false;
+
7031 } while(run_test);
+
7032
+
7033 p->finalizeTestCaseData();
+
7034
+
7035 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
+
7036
+
7037 p->currentTest = nullptr;
+
7038
+
7039 // stop executing tests if enough assertions have failed
+
7040 if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
+
7041 break;
+
7042 }
+
7043 }
+
7044
+
7045 if(!query_mode) {
+
7046 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
+
7047 } else {
+
7048 QueryData qdata;
+
7049 qdata.run_stats = g_cs;
+
7050 qdata.data = queryResults.data();
+
7051 qdata.num_data = unsigned(queryResults.size());
+
7052 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);
+
7053 }
+
7054
+
7055 return cleanup_and_return();
+
7056}
+
7057
+
7058DOCTEST_DEFINE_INTERFACE(IReporter)
+
7059
+
7060int IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); }
+
7061const IContextScope* const* IReporter::get_active_contexts() {
+
7062 return get_num_active_contexts() ? &detail::g_infoContexts[0] : nullptr;
+
7063}
+
7064
+
7065int IReporter::get_num_stringified_contexts() { return detail::g_cs->stringifiedContexts.size(); }
+
7066const String* IReporter::get_stringified_contexts() {
+
7067 return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] : nullptr;
+
7068}
+
7069
+
7070namespace detail {
+
7071 void registerReporterImpl(const char* name, int priority, reporterCreatorFunc c, bool isReporter) {
+
7072 if(isReporter)
+
7073 getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
+
7074 else
+
7075 getListeners().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
+
7076 }
+
7077} // namespace detail
+
7078
+
7079} // namespace doctest
+
7080
+
7081#endif // DOCTEST_CONFIG_DISABLE
+
7082
+
7083#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
7084DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) // 'function' : must be 'attribute' - see issue #182
+
7085int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); }
+
7086DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
7087#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
7088
+
7089DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
7090DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
7091DOCTEST_GCC_SUPPRESS_WARNING_POP
+
7092
+
7093DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
+
7094
+
7095#endif // DOCTEST_LIBRARY_IMPLEMENTATION
+
7096#endif // DOCTEST_CONFIG_IMPLEMENT
+
7097
+
7098#ifdef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
7099#undef WIN32_LEAN_AND_MEAN
+
7100#undef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
7101#endif // DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
7102
+
7103#ifdef DOCTEST_UNDEF_NOMINMAX
+
7104#undef NOMINMAX
+
7105#undef DOCTEST_UNDEF_NOMINMAX
+
7106#endif // DOCTEST_UNDEF_NOMINMAX
+
Definition doctest.h:845
+
Definition doctest.h:674
+
Definition doctest.h:1965
+
Definition doctest.h:588
+
Definition doctest.h:1847
+
OCLINT destructor of virtual class.
Definition doctest.h:1803
+
Definition doctest.h:536
+
Definition doctest.h:530
+
Definition doctest.h:539
+
Definition how_subcases_work.cpp:32
+
Definition doctest.h:1210
+
Definition doctest.h:825
+
OCLINT too many fields.
Definition doctest.h:894
+
Definition doctest.h:2018
+
Definition doctest.h:884
+
Definition doctest.h:2050
+
Definition doctest.h:1292
+
Definition doctest.h:866
+
Definition doctest.h:2043
+
Definition doctest.h:1082
+
Definition doctest.h:874
+
Definition doctest.h:809
+
Definition doctest.h:2027
+
Definition doctest.h:2033
+
Definition doctest.h:1830
+
Definition doctest.cpp:422
+
Definition doctest.h:1571
+
Definition doctest.h:1500
+
Definition doctest.h:1796
+
Definition doctest.h:1870
+
void react()
Definition doctest.cpp:1931
+
Definition doctest.h:1668
+
Definition doctest.h:1682
+
bool log()
Definition doctest.cpp:1842
+
DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val)
Definition doctest.h:1702
+
Definition doctest.h:1396
+
Definition doctest.h:1038
+
Definition doctest.h:1336
+
Definition doctest.h:1615
+
Definition doctest.h:1325
+
Definition doctest.h:1592
+
Definition doctest.h:993
+
Definition doctest_fwd.h:1147
+ + +
Definition doctest.h:947
+
Definition doctest.h:953
+
Definition doctest.h:972
+
Definition doctest.h:966
+
Definition doctest.h:969
+ +
Definition doctest.h:962
+ +
Definition doctest.h:952
+ +
Definition doctest.h:526
+
+ + + + diff --git a/git-main/doctest_8cpp_source.html b/git-main/doctest_8cpp_source.html new file mode 100644 index 0000000..3ebe557 --- /dev/null +++ b/git-main/doctest_8cpp_source.html @@ -0,0 +1,4148 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts/doctest.cpp Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest.cpp
+
+
+
1#if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)
+
2
+
3#ifndef DOCTEST_SINGLE_HEADER
+
4#include "doctest_fwd.h"
+
5#endif // DOCTEST_SINGLE_HEADER
+
6
+
7DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-macros")
+
8
+
9#ifndef DOCTEST_LIBRARY_IMPLEMENTATION
+
10#define DOCTEST_LIBRARY_IMPLEMENTATION
+
11
+
12DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
13
+
14DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
+
15
+
16DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
17DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors")
+
18DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
+
19DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
+
20DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32")
+
21DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations")
+
22DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch")
+
23DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum")
+
24DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default")
+
25DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn")
+
26DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion")
+
27DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces")
+
28DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers")
+
29DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-member-function")
+
30DOCTEST_CLANG_SUPPRESS_WARNING("-Wnonportable-system-include-path")
+
31
+
32DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
33DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
+
34DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
+
35DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers")
+
36DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces")
+
37DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch")
+
38DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum")
+
39DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default")
+
40DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations")
+
41DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast")
+
42DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-function")
+
43DOCTEST_GCC_SUPPRESS_WARNING("-Wmultiple-inheritance")
+
44DOCTEST_GCC_SUPPRESS_WARNING("-Wsuggest-attribute")
+
45
+
46DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
47DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data
+
48DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled
+
49DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified
+
50DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal
+
51DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch
+
52DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C
+
53DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)
+
54DOCTEST_MSVC_SUPPRESS_WARNING(5245) // unreferenced function with internal linkage has been removed
+
55
+
56DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+
57
+
58// required includes - will go only in one translation unit!
+
59#include <ctime>
+
60#include <cmath>
+
61#include <climits>
+
62// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/doctest/doctest/pull/37
+
63#ifdef __BORLANDC__
+
64#include <math.h>
+
65#endif // __BORLANDC__
+
66#include <new>
+
67#include <cstdio>
+
68#include <cstdlib>
+
69#include <cstring>
+
70#include <limits>
+
71#include <utility>
+
72#include <fstream>
+
73#include <sstream>
+
74#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
75#include <iostream>
+
76#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
77#include <algorithm>
+
78#include <iomanip>
+
79#include <vector>
+
80#ifndef DOCTEST_CONFIG_NO_MULTITHREADING
+
81#include <atomic>
+
82#include <mutex>
+
83#define DOCTEST_DECLARE_MUTEX(name) std::mutex name;
+
84#define DOCTEST_DECLARE_STATIC_MUTEX(name) static DOCTEST_DECLARE_MUTEX(name)
+
85#define DOCTEST_LOCK_MUTEX(name) std::lock_guard<std::mutex> DOCTEST_ANONYMOUS(DOCTEST_ANON_LOCK_)(name);
+
86#else // DOCTEST_CONFIG_NO_MULTITHREADING
+
87#define DOCTEST_DECLARE_MUTEX(name)
+
88#define DOCTEST_DECLARE_STATIC_MUTEX(name)
+
89#define DOCTEST_LOCK_MUTEX(name)
+
90#endif // DOCTEST_CONFIG_NO_MULTITHREADING
+
91#include <set>
+
92#include <map>
+
93#include <unordered_set>
+
94#include <exception>
+
95#include <stdexcept>
+
96#include <csignal>
+
97#include <cfloat>
+
98#include <cctype>
+
99#include <cstdint>
+
100#include <string>
+
101
+
102#ifdef DOCTEST_PLATFORM_MAC
+
103#include <sys/types.h>
+
104#include <unistd.h>
+
105#include <sys/sysctl.h>
+
106#endif // DOCTEST_PLATFORM_MAC
+
107
+
108#ifdef DOCTEST_PLATFORM_WINDOWS
+
109
+
110// defines for a leaner windows.h
+
111#ifndef WIN32_LEAN_AND_MEAN
+
112#define WIN32_LEAN_AND_MEAN
+
113#define DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
114#endif // WIN32_LEAN_AND_MEAN
+
115#ifndef NOMINMAX
+
116#define NOMINMAX
+
117#define DOCTEST_UNDEF_NOMINMAX
+
118#endif // NOMINMAX
+
119
+
120// not sure what AfxWin.h is for - here I do what Catch does
+
121#ifdef __AFXDLL
+
122#include <AfxWin.h>
+
123#else
+
124#include <windows.h>
+
125#endif
+
126#include <io.h>
+
127
+
128#else // DOCTEST_PLATFORM_WINDOWS
+
129
+
130#include <sys/time.h>
+
131#include <unistd.h>
+
132
+
133#endif // DOCTEST_PLATFORM_WINDOWS
+
134
+
135// this is a fix for https://github.com/doctest/doctest/issues/348
+
136// https://mail.gnome.org/archives/xml/2012-January/msg00000.html
+
137#if !defined(HAVE_UNISTD_H) && !defined(STDOUT_FILENO)
+
138#define STDOUT_FILENO fileno(stdout)
+
139#endif // HAVE_UNISTD_H
+
140
+
141DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
142
+
143// counts the number of elements in a C array
+
144#define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
+
145
+
146#ifdef DOCTEST_CONFIG_DISABLE
+
147#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled
+
148#else // DOCTEST_CONFIG_DISABLE
+
149#define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled
+
150#endif // DOCTEST_CONFIG_DISABLE
+
151
+
152#ifndef DOCTEST_CONFIG_OPTIONS_PREFIX
+
153#define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-"
+
154#endif
+
155
+
156#ifndef DOCTEST_THREAD_LOCAL
+
157#if defined(DOCTEST_CONFIG_NO_MULTITHREADING) || DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
158#define DOCTEST_THREAD_LOCAL
+
159#else // DOCTEST_MSVC
+
160#define DOCTEST_THREAD_LOCAL thread_local
+
161#endif // DOCTEST_MSVC
+
162#endif // DOCTEST_THREAD_LOCAL
+
163
+
164#ifndef DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES
+
165#define DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES 32
+
166#endif
+
167
+
168#ifndef DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE
+
169#define DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE 64
+
170#endif
+
171
+
172#ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
173#define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX
+
174#else
+
175#define DOCTEST_OPTIONS_PREFIX_DISPLAY ""
+
176#endif
+
177
+
178#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+
179#define DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
180#endif
+
181
+
182#ifndef DOCTEST_CDECL
+
183#define DOCTEST_CDECL __cdecl
+
184#endif
+
185
+
186namespace doctest {
+
187
+
188bool is_running_in_test = false;
+
189
+
190namespace {
+
191 using namespace detail;
+
192
+
193 template <typename Ex>
+
194 DOCTEST_NORETURN void throw_exception(Ex const& e) {
+
195#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
196 throw e;
+
197#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
198#ifdef DOCTEST_CONFIG_HANDLE_EXCEPTION
+
199 DOCTEST_CONFIG_HANDLE_EXCEPTION(e);
+
200#else // DOCTEST_CONFIG_HANDLE_EXCEPTION
+
201#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
202 std::cerr << "doctest will terminate because it needed to throw an exception.\n"
+
203 << "The message was: " << e.what() << '\n';
+
204#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
205#endif // DOCTEST_CONFIG_HANDLE_EXCEPTION
+
206 std::terminate();
+
207#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
208 }
+
209
+
210#ifndef DOCTEST_INTERNAL_ERROR
+
211#define DOCTEST_INTERNAL_ERROR(msg) \
+
212 throw_exception(std::logic_error( \
+
213 __FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg))
+
214#endif // DOCTEST_INTERNAL_ERROR
+
215
+
216 // case insensitive strcmp
+
217 int stricmp(const char* a, const char* b) {
+
218 for(;; a++, b++) {
+
219 const int d = tolower(*a) - tolower(*b);
+
220 if(d != 0 || !*a)
+
221 return d;
+
222 }
+
223 }
+
224
+
225 struct Endianness
+
226 {
+
227 enum Arch
+
228 {
+
229 Big,
+
230 Little
+
231 };
+
232
+
233 static Arch which() {
+
234 int x = 1;
+
235 // casting any data pointer to char* is allowed
+
236 auto ptr = reinterpret_cast<char*>(&x);
+
237 if(*ptr)
+
238 return Little;
+
239 return Big;
+
240 }
+
241 };
+
242} // namespace
+
243
+
244namespace detail {
+
245 DOCTEST_THREAD_LOCAL class
+
246 {
+
247 std::vector<std::streampos> stack;
+
248 std::stringstream ss;
+
249
+
250 public:
+
251 std::ostream* push() {
+
252 stack.push_back(ss.tellp());
+
253 return &ss;
+
254 }
+
255
+
256 String pop() {
+
257 if (stack.empty())
+
258 DOCTEST_INTERNAL_ERROR("TLSS was empty when trying to pop!");
+
259
+
260 std::streampos pos = stack.back();
+
261 stack.pop_back();
+
262 unsigned sz = static_cast<unsigned>(ss.tellp() - pos);
+
263 ss.rdbuf()->pubseekpos(pos, std::ios::in | std::ios::out);
+
264 return String(ss, sz);
+
265 }
+
266 } g_oss;
+
267
+
268 std::ostream* tlssPush() {
+
269 return g_oss.push();
+
270 }
+
271
+
272 String tlssPop() {
+
273 return g_oss.pop();
+
274 }
+
275
+
276#ifndef DOCTEST_CONFIG_DISABLE
+
277
+
278namespace timer_large_integer
+
279{
+
280
+
281#if defined(DOCTEST_PLATFORM_WINDOWS)
+
282 using type = ULONGLONG;
+
283#else // DOCTEST_PLATFORM_WINDOWS
+
284 using type = std::uint64_t;
+
285#endif // DOCTEST_PLATFORM_WINDOWS
+
286}
+
287
+
288using ticks_t = timer_large_integer::type;
+
289
+
290#ifdef DOCTEST_CONFIG_GETCURRENTTICKS
+
291 ticks_t getCurrentTicks() { return DOCTEST_CONFIG_GETCURRENTTICKS(); }
+
292#elif defined(DOCTEST_PLATFORM_WINDOWS)
+
293 ticks_t getCurrentTicks() {
+
294 static LARGE_INTEGER hz = { {0} }, hzo = { {0} };
+
295 if(!hz.QuadPart) {
+
296 QueryPerformanceFrequency(&hz);
+
297 QueryPerformanceCounter(&hzo);
+
298 }
+
299 LARGE_INTEGER t;
+
300 QueryPerformanceCounter(&t);
+
301 return ((t.QuadPart - hzo.QuadPart) * LONGLONG(1000000)) / hz.QuadPart;
+
302 }
+
303#else // DOCTEST_PLATFORM_WINDOWS
+
304 ticks_t getCurrentTicks() {
+
305 timeval t;
+
306 gettimeofday(&t, nullptr);
+
307 return static_cast<ticks_t>(t.tv_sec) * 1000000 + static_cast<ticks_t>(t.tv_usec);
+
308 }
+
309#endif // DOCTEST_PLATFORM_WINDOWS
+
310
+
+
311 struct Timer
+
312 {
+
313 void start() { m_ticks = getCurrentTicks(); }
+
314 unsigned int getElapsedMicroseconds() const {
+
315 return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
+
316 }
+
317 //unsigned int getElapsedMilliseconds() const {
+
318 // return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
+
319 //}
+
320 double getElapsedSeconds() const { return static_cast<double>(getCurrentTicks() - m_ticks) / 1000000.0; }
+
321
+
322 private:
+
323 ticks_t m_ticks = 0;
+
324 };
+
+
325
+
326#ifdef DOCTEST_CONFIG_NO_MULTITHREADING
+
327 template <typename T>
+
328 using Atomic = T;
+
329#else // DOCTEST_CONFIG_NO_MULTITHREADING
+
330 template <typename T>
+
331 using Atomic = std::atomic<T>;
+
332#endif // DOCTEST_CONFIG_NO_MULTITHREADING
+
333
+
334#if defined(DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS) || defined(DOCTEST_CONFIG_NO_MULTITHREADING)
+
335 template <typename T>
+
336 using MultiLaneAtomic = Atomic<T>;
+
337#else // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
338 // Provides a multilane implementation of an atomic variable that supports add, sub, load,
+
339 // store. Instead of using a single atomic variable, this splits up into multiple ones,
+
340 // each sitting on a separate cache line. The goal is to provide a speedup when most
+
341 // operations are modifying. It achieves this with two properties:
+
342 //
+
343 // * Multiple atomics are used, so chance of congestion from the same atomic is reduced.
+
344 // * Each atomic sits on a separate cache line, so false sharing is reduced.
+
345 //
+
346 // The disadvantage is that there is a small overhead due to the use of TLS, and load/store
+
347 // is slower because all atomics have to be accessed.
+
348 template <typename T>
+
+ +
350 {
+
351 struct CacheLineAlignedAtomic
+
352 {
+
353 Atomic<T> atomic{};
+
354 char padding[DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE - sizeof(Atomic<T>)];
+
355 };
+
356 CacheLineAlignedAtomic m_atomics[DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES];
+
357
+
358 static_assert(sizeof(CacheLineAlignedAtomic) == DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE,
+
359 "guarantee one atomic takes exactly one cache line");
+
360
+
361 public:
+
362 T operator++() DOCTEST_NOEXCEPT { return fetch_add(1) + 1; }
+
363
+
364 T operator++(int) DOCTEST_NOEXCEPT { return fetch_add(1); }
+
365
+
366 T fetch_add(T arg, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
367 return myAtomic().fetch_add(arg, order);
+
368 }
+
369
+
370 T fetch_sub(T arg, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
371 return myAtomic().fetch_sub(arg, order);
+
372 }
+
373
+
374 operator T() const DOCTEST_NOEXCEPT { return load(); }
+
375
+
376 T load(std::memory_order order = std::memory_order_seq_cst) const DOCTEST_NOEXCEPT {
+
377 auto result = T();
+
378 for(auto const& c : m_atomics) {
+
379 result += c.atomic.load(order);
+
380 }
+
381 return result;
+
382 }
+
383
+
384 T operator=(T desired) DOCTEST_NOEXCEPT { // lgtm [cpp/assignment-does-not-return-this]
+
385 store(desired);
+
386 return desired;
+
387 }
+
388
+
389 void store(T desired, std::memory_order order = std::memory_order_seq_cst) DOCTEST_NOEXCEPT {
+
390 // first value becomes desired", all others become 0.
+
391 for(auto& c : m_atomics) {
+
392 c.atomic.store(desired, order);
+
393 desired = {};
+
394 }
+
395 }
+
396
+
397 private:
+
398 // Each thread has a different atomic that it operates on. If more than NumLanes threads
+
399 // use this, some will use the same atomic. So performance will degrade a bit, but still
+
400 // everything will work.
+
401 //
+
402 // The logic here is a bit tricky. The call should be as fast as possible, so that there
+
403 // is minimal to no overhead in determining the correct atomic for the current thread.
+
404 //
+
405 // 1. A global static counter laneCounter counts continuously up.
+
406 // 2. Each successive thread will use modulo operation of that counter so it gets an atomic
+
407 // assigned in a round-robin fashion.
+
408 // 3. This tlsLaneIdx is stored in the thread local data, so it is directly available with
+
409 // little overhead.
+
410 Atomic<T>& myAtomic() DOCTEST_NOEXCEPT {
+
411 static Atomic<size_t> laneCounter;
+
412 DOCTEST_THREAD_LOCAL size_t tlsLaneIdx =
+
413 laneCounter++ % DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES;
+
414
+
415 return m_atomics[tlsLaneIdx].atomic;
+
416 }
+
417 };
+
+
418#endif // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
+
419
+
420 // this holds both parameters from the command line and runtime data for tests
+
+ +
422 {
+
423 MultiLaneAtomic<int> numAssertsCurrentTest_atomic;
+
424 MultiLaneAtomic<int> numAssertsFailedCurrentTest_atomic;
+
425
+
426 std::vector<std::vector<String>> filters = decltype(filters)(9); // 9 different filters
+
427
+
428 std::vector<IReporter*> reporters_currently_used;
+
429
+
430 assert_handler ah = nullptr;
+
431
+
432 Timer timer;
+
433
+
434 std::vector<String> stringifiedContexts; // logging from INFO() due to an exception
+
435
+
436 // stuff for subcases
+
437 bool reachedLeaf;
+
438 std::vector<SubcaseSignature> subcaseStack;
+
439 std::vector<SubcaseSignature> nextSubcaseStack;
+
440 std::unordered_set<unsigned long long> fullyTraversedSubcases;
+
441 size_t currentSubcaseDepth;
+
442 Atomic<bool> shouldLogCurrentException;
+
443
+
444 void resetRunData() {
+
445 numTestCases = 0;
+
446 numTestCasesPassingFilters = 0;
+
447 numTestSuitesPassingFilters = 0;
+
448 numTestCasesFailed = 0;
+
449 numAsserts = 0;
+
450 numAssertsFailed = 0;
+
451 numAssertsCurrentTest = 0;
+
452 numAssertsFailedCurrentTest = 0;
+
453 }
+
454
+
455 void finalizeTestCaseData() {
+
456 seconds = timer.getElapsedSeconds();
+
457
+
458 // update the non-atomic counters
+
459 numAsserts += numAssertsCurrentTest_atomic;
+
460 numAssertsFailed += numAssertsFailedCurrentTest_atomic;
+
461 numAssertsCurrentTest = numAssertsCurrentTest_atomic;
+
462 numAssertsFailedCurrentTest = numAssertsFailedCurrentTest_atomic;
+
463
+
464 if(numAssertsFailedCurrentTest)
+
465 failure_flags |= TestCaseFailureReason::AssertFailure;
+
466
+
467 if(Approx(currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
+
468 Approx(seconds).epsilon(DBL_EPSILON) > currentTest->m_timeout)
+
469 failure_flags |= TestCaseFailureReason::Timeout;
+
470
+
471 if(currentTest->m_should_fail) {
+
472 if(failure_flags) {
+
473 failure_flags |= TestCaseFailureReason::ShouldHaveFailedAndDid;
+
474 } else {
+
475 failure_flags |= TestCaseFailureReason::ShouldHaveFailedButDidnt;
+
476 }
+
477 } else if(failure_flags && currentTest->m_may_fail) {
+
478 failure_flags |= TestCaseFailureReason::CouldHaveFailedAndDid;
+
479 } else if(currentTest->m_expected_failures > 0) {
+
480 if(numAssertsFailedCurrentTest == currentTest->m_expected_failures) {
+
481 failure_flags |= TestCaseFailureReason::FailedExactlyNumTimes;
+
482 } else {
+
483 failure_flags |= TestCaseFailureReason::DidntFailExactlyNumTimes;
+
484 }
+
485 }
+
486
+
487 bool ok_to_fail = (TestCaseFailureReason::ShouldHaveFailedAndDid & failure_flags) ||
+
488 (TestCaseFailureReason::CouldHaveFailedAndDid & failure_flags) ||
+
489 (TestCaseFailureReason::FailedExactlyNumTimes & failure_flags);
+
490
+
491 // if any subcase has failed - the whole test case has failed
+
492 testCaseSuccess = !(failure_flags && !ok_to_fail);
+
493 if(!testCaseSuccess)
+
494 numTestCasesFailed++;
+
495 }
+
496 };
+
+
497
+
498 ContextState* g_cs = nullptr;
+
499
+
500 // used to avoid locks for the debug output
+
501 // TODO: figure out if this is indeed necessary/correct - seems like either there still
+
502 // could be a race or that there wouldn't be a race even if using the context directly
+
503 DOCTEST_THREAD_LOCAL bool g_no_colors;
+
504
+
505#endif // DOCTEST_CONFIG_DISABLE
+
506} // namespace detail
+
507
+
508char* String::allocate(size_type sz) {
+
509 if (sz <= last) {
+
510 buf[sz] = '\0';
+
511 setLast(last - sz);
+
512 return buf;
+
513 } else {
+
514 setOnHeap();
+
515 data.size = sz;
+
516 data.capacity = data.size + 1;
+
517 data.ptr = new char[data.capacity];
+
518 data.ptr[sz] = '\0';
+
519 return data.ptr;
+
520 }
+
521}
+
522
+
523void String::setOnHeap() noexcept { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }
+
524void String::setLast(size_type in) noexcept { buf[last] = char(in); }
+
525void String::setSize(size_type sz) noexcept {
+
526 if (isOnStack()) { buf[sz] = '\0'; setLast(last - sz); }
+
527 else { data.ptr[sz] = '\0'; data.size = sz; }
+
528}
+
529
+
530void String::copy(const String& other) {
+
531 if(other.isOnStack()) {
+
532 memcpy(buf, other.buf, len);
+
533 } else {
+
534 memcpy(allocate(other.data.size), other.data.ptr, other.data.size);
+
535 }
+
536}
+
537
+
538String::String() noexcept {
+
539 buf[0] = '\0';
+
540 setLast();
+
541}
+
542
+
543String::~String() {
+
544 if(!isOnStack())
+
545 delete[] data.ptr;
+
546} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
547
+
548String::String(const char* in)
+
549 : String(in, strlen(in)) {}
+
550
+
551String::String(const char* in, size_type in_size) {
+
552 memcpy(allocate(in_size), in, in_size);
+
553}
+
554
+
555String::String(std::istream& in, size_type in_size) {
+
556 in.read(allocate(in_size), in_size);
+
557}
+
558
+
559String::String(const String& other) { copy(other); }
+
560
+
561String& String::operator=(const String& other) {
+
562 if(this != &other) {
+
563 if(!isOnStack())
+
564 delete[] data.ptr;
+
565
+
566 copy(other);
+
567 }
+
568
+
569 return *this;
+
570}
+
571
+
572String& String::operator+=(const String& other) {
+
573 const size_type my_old_size = size();
+
574 const size_type other_size = other.size();
+
575 const size_type total_size = my_old_size + other_size;
+
576 if(isOnStack()) {
+
577 if(total_size < len) {
+
578 // append to the current stack space
+
579 memcpy(buf + my_old_size, other.c_str(), other_size + 1);
+
580 // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
+
581 setLast(last - total_size);
+
582 } else {
+
583 // alloc new chunk
+
584 char* temp = new char[total_size + 1];
+
585 // copy current data to new location before writing in the union
+
586 memcpy(temp, buf, my_old_size); // skip the +1 ('\0') for speed
+
587 // update data in union
+
588 setOnHeap();
+
589 data.size = total_size;
+
590 data.capacity = data.size + 1;
+
591 data.ptr = temp;
+
592 // transfer the rest of the data
+
593 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
594 }
+
595 } else {
+
596 if(data.capacity > total_size) {
+
597 // append to the current heap block
+
598 data.size = total_size;
+
599 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
600 } else {
+
601 // resize
+
602 data.capacity *= 2;
+
603 if(data.capacity <= total_size)
+
604 data.capacity = total_size + 1;
+
605 // alloc new chunk
+
606 char* temp = new char[data.capacity];
+
607 // copy current data to new location before releasing it
+
608 memcpy(temp, data.ptr, my_old_size); // skip the +1 ('\0') for speed
+
609 // release old chunk
+
610 delete[] data.ptr;
+
611 // update the rest of the union members
+
612 data.size = total_size;
+
613 data.ptr = temp;
+
614 // transfer the rest of the data
+
615 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
+
616 }
+
617 }
+
618
+
619 return *this;
+
620}
+
621
+
622String::String(String&& other) noexcept {
+
623 memcpy(buf, other.buf, len);
+
624 other.buf[0] = '\0';
+
625 other.setLast();
+
626}
+
627
+
628String& String::operator=(String&& other) noexcept {
+
629 if(this != &other) {
+
630 if(!isOnStack())
+
631 delete[] data.ptr;
+
632 memcpy(buf, other.buf, len);
+
633 other.buf[0] = '\0';
+
634 other.setLast();
+
635 }
+
636 return *this;
+
637}
+
638
+
639char String::operator[](size_type i) const {
+
640 return const_cast<String*>(this)->operator[](i);
+
641}
+
642
+
643char& String::operator[](size_type i) {
+
644 if(isOnStack())
+
645 return reinterpret_cast<char*>(buf)[i];
+
646 return data.ptr[i];
+
647}
+
648
+
649DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmaybe-uninitialized")
+
650String::size_type String::size() const {
+
651 if(isOnStack())
+
652 return last - (size_type(buf[last]) & 31); // using "last" would work only if "len" is 32
+
653 return data.size;
+
654}
+
655DOCTEST_GCC_SUPPRESS_WARNING_POP
+
656
+
657String::size_type String::capacity() const {
+
658 if(isOnStack())
+
659 return len;
+
660 return data.capacity;
+
661}
+
662
+
663String String::substr(size_type pos, size_type cnt) && {
+
664 cnt = std::min(cnt, size() - 1 - pos);
+
665 char* cptr = c_str();
+
666 memmove(cptr, cptr + pos, cnt);
+
667 setSize(cnt);
+
668 return std::move(*this);
+
669}
+
670
+
671String String::substr(size_type pos, size_type cnt) const & {
+
672 cnt = std::min(cnt, size() - 1 - pos);
+
673 return String{ c_str() + pos, cnt };
+
674}
+
675
+
676String::size_type String::find(char ch, size_type pos) const {
+
677 const char* begin = c_str();
+
678 const char* end = begin + size();
+
679 const char* it = begin + pos;
+
680 for (; it < end && *it != ch; it++);
+
681 if (it < end) { return static_cast<size_type>(it - begin); }
+
682 else { return npos; }
+
683}
+
684
+
685String::size_type String::rfind(char ch, size_type pos) const {
+
686 const char* begin = c_str();
+
687 const char* it = begin + std::min(pos, size() - 1);
+
688 for (; it >= begin && *it != ch; it--);
+
689 if (it >= begin) { return static_cast<size_type>(it - begin); }
+
690 else { return npos; }
+
691}
+
692
+
693int String::compare(const char* other, bool no_case) const {
+
694 if(no_case)
+
695 return doctest::stricmp(c_str(), other);
+
696 return std::strcmp(c_str(), other);
+
697}
+
698
+
699int String::compare(const String& other, bool no_case) const {
+
700 return compare(other.c_str(), no_case);
+
701}
+
702
+
703String operator+(const String& lhs, const String& rhs) { return String(lhs) += rhs; }
+
704
+
705bool operator==(const String& lhs, const String& rhs) { return lhs.compare(rhs) == 0; }
+
706bool operator!=(const String& lhs, const String& rhs) { return lhs.compare(rhs) != 0; }
+
707bool operator< (const String& lhs, const String& rhs) { return lhs.compare(rhs) < 0; }
+
708bool operator> (const String& lhs, const String& rhs) { return lhs.compare(rhs) > 0; }
+
709bool operator<=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) < 0 : true; }
+
710bool operator>=(const String& lhs, const String& rhs) { return (lhs != rhs) ? lhs.compare(rhs) > 0 : true; }
+
711
+
712std::ostream& operator<<(std::ostream& s, const String& in) { return s << in.c_str(); }
+
713
+
714Contains::Contains(const String& str) : string(str) { }
+
715
+
716bool Contains::checkWith(const String& other) const {
+
717 return strstr(other.c_str(), string.c_str()) != nullptr;
+
718}
+
719
+
720String toString(const Contains& in) {
+
721 return "Contains( " + in.string + " )";
+
722}
+
723
+
724bool operator==(const String& lhs, const Contains& rhs) { return rhs.checkWith(lhs); }
+
725bool operator==(const Contains& lhs, const String& rhs) { return lhs.checkWith(rhs); }
+
726bool operator!=(const String& lhs, const Contains& rhs) { return !rhs.checkWith(lhs); }
+
727bool operator!=(const Contains& lhs, const String& rhs) { return !lhs.checkWith(rhs); }
+
728
+
729namespace {
+
730 void color_to_stream(std::ostream&, Color::Enum) DOCTEST_BRANCH_ON_DISABLED({}, ;)
+
731} // namespace
+
732
+
733namespace Color {
+
734 std::ostream& operator<<(std::ostream& s, Color::Enum code) {
+
735 color_to_stream(s, code);
+
736 return s;
+
737 }
+
738} // namespace Color
+
739
+
740// clang-format off
+
741const char* assertString(assertType::Enum at) {
+
742 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4061) // enum 'x' in switch of enum 'y' is not explicitly handled
+
743 #define DOCTEST_GENERATE_ASSERT_TYPE_CASE(assert_type) case assertType::DT_ ## assert_type: return #assert_type
+
744 #define DOCTEST_GENERATE_ASSERT_TYPE_CASES(assert_type) \
+
745 DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN_ ## assert_type); \
+
746 DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK_ ## assert_type); \
+
747 DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE_ ## assert_type)
+
748 switch(at) {
+
749 DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN);
+
750 DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK);
+
751 DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE);
+
752
+
753 DOCTEST_GENERATE_ASSERT_TYPE_CASES(FALSE);
+
754
+
755 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS);
+
756
+
757 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_AS);
+
758
+
759 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH);
+
760
+
761 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH_AS);
+
762
+
763 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NOTHROW);
+
764
+
765 DOCTEST_GENERATE_ASSERT_TYPE_CASES(EQ);
+
766 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NE);
+
767 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GT);
+
768 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LT);
+
769 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GE);
+
770 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LE);
+
771
+
772 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY);
+
773 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY_FALSE);
+
774
+
775 default: DOCTEST_INTERNAL_ERROR("Tried stringifying invalid assert type!");
+
776 }
+
777 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
778}
+
779// clang-format on
+
780
+
781const char* failureString(assertType::Enum at) {
+
782 if(at & assertType::is_warn)
+
783 return "WARNING";
+
784 if(at & assertType::is_check)
+
785 return "ERROR";
+
786 if(at & assertType::is_require)
+
787 return "FATAL ERROR";
+
788 return "";
+
789}
+
790
+
791DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
+
792DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wnull-dereference")
+
793// depending on the current options this will remove the path of filenames
+
794const char* skipPathFromFilename(const char* file) {
+
795#ifndef DOCTEST_CONFIG_DISABLE
+
796 if(getContextOptions()->no_path_in_filenames) {
+
797 auto back = std::strrchr(file, '\\');
+
798 auto forward = std::strrchr(file, '/');
+
799 if(back || forward) {
+
800 if(back > forward)
+
801 forward = back;
+
802 return forward + 1;
+
803 }
+
804 }
+
805#endif // DOCTEST_CONFIG_DISABLE
+
806 return file;
+
807}
+
808DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
809DOCTEST_GCC_SUPPRESS_WARNING_POP
+
810
+
811bool SubcaseSignature::operator==(const SubcaseSignature& other) const {
+
812 return m_line == other.m_line
+
813 && std::strcmp(m_file, other.m_file) == 0
+
814 && m_name == other.m_name;
+
815}
+
816
+
817bool SubcaseSignature::operator<(const SubcaseSignature& other) const {
+
818 if(m_line != other.m_line)
+
819 return m_line < other.m_line;
+
820 if(std::strcmp(m_file, other.m_file) != 0)
+
821 return std::strcmp(m_file, other.m_file) < 0;
+
822 return m_name.compare(other.m_name) < 0;
+
823}
+
824
+
825DOCTEST_DEFINE_INTERFACE(IContextScope)
+
826
+
827namespace detail {
+
828 void filldata<const void*>::fill(std::ostream* stream, const void* in) {
+
829 if (in) { *stream << in; }
+
830 else { *stream << "nullptr"; }
+
831 }
+
832
+
833 template <typename T>
+
834 String toStreamLit(T t) {
+
835 std::ostream* os = tlssPush();
+
836 os->operator<<(t);
+
837 return tlssPop();
+
838 }
+
839}
+
840
+
841#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
842String toString(const char* in) { return String("\"") + (in ? in : "{null string}") + "\""; }
+
843#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
844
+
845#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
846// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
847String toString(const std::string& in) { return in.c_str(); }
+
848#endif // VS 2019
+
849
+
850String toString(String in) { return in; }
+
851
+
852String toString(std::nullptr_t) { return "nullptr"; }
+
853
+
854String toString(bool in) { return in ? "true" : "false"; }
+
855
+
856String toString(float in) { return toStreamLit(in); }
+
857String toString(double in) { return toStreamLit(in); }
+
858String toString(double long in) { return toStreamLit(in); }
+
859
+
860String toString(char in) { return toStreamLit(static_cast<signed>(in)); }
+
861String toString(char signed in) { return toStreamLit(static_cast<signed>(in)); }
+
862String toString(char unsigned in) { return toStreamLit(static_cast<unsigned>(in)); }
+
863String toString(short in) { return toStreamLit(in); }
+
864String toString(short unsigned in) { return toStreamLit(in); }
+
865String toString(signed in) { return toStreamLit(in); }
+
866String toString(unsigned in) { return toStreamLit(in); }
+
867String toString(long in) { return toStreamLit(in); }
+
868String toString(long unsigned in) { return toStreamLit(in); }
+
869String toString(long long in) { return toStreamLit(in); }
+
870String toString(long long unsigned in) { return toStreamLit(in); }
+
871
+
872Approx::Approx(double value)
+
873 : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
+
874 , m_scale(1.0)
+
875 , m_value(value) {}
+
876
+
877Approx Approx::operator()(double value) const {
+
878 Approx approx(value);
+
879 approx.epsilon(m_epsilon);
+
880 approx.scale(m_scale);
+
881 return approx;
+
882}
+
883
+
884Approx& Approx::epsilon(double newEpsilon) {
+
885 m_epsilon = newEpsilon;
+
886 return *this;
+
887}
+
888Approx& Approx::scale(double newScale) {
+
889 m_scale = newScale;
+
890 return *this;
+
891}
+
892
+
893bool operator==(double lhs, const Approx& rhs) {
+
894 // Thanks to Richard Harris for his help refining this formula
+
895 return std::fabs(lhs - rhs.m_value) <
+
896 rhs.m_epsilon * (rhs.m_scale + std::max<double>(std::fabs(lhs), std::fabs(rhs.m_value)));
+
897}
+
898bool operator==(const Approx& lhs, double rhs) { return operator==(rhs, lhs); }
+
899bool operator!=(double lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
+
900bool operator!=(const Approx& lhs, double rhs) { return !operator==(rhs, lhs); }
+
901bool operator<=(double lhs, const Approx& rhs) { return lhs < rhs.m_value || lhs == rhs; }
+
902bool operator<=(const Approx& lhs, double rhs) { return lhs.m_value < rhs || lhs == rhs; }
+
903bool operator>=(double lhs, const Approx& rhs) { return lhs > rhs.m_value || lhs == rhs; }
+
904bool operator>=(const Approx& lhs, double rhs) { return lhs.m_value > rhs || lhs == rhs; }
+
905bool operator<(double lhs, const Approx& rhs) { return lhs < rhs.m_value && lhs != rhs; }
+
906bool operator<(const Approx& lhs, double rhs) { return lhs.m_value < rhs && lhs != rhs; }
+
907bool operator>(double lhs, const Approx& rhs) { return lhs > rhs.m_value && lhs != rhs; }
+
908bool operator>(const Approx& lhs, double rhs) { return lhs.m_value > rhs && lhs != rhs; }
+
909
+
910String toString(const Approx& in) {
+
911 return "Approx( " + doctest::toString(in.m_value) + " )";
+
912}
+
913const ContextOptions* getContextOptions() { return DOCTEST_BRANCH_ON_DISABLED(nullptr, g_cs); }
+
914
+
915DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4738)
+
916template <typename F>
+
917IsNaN<F>::operator bool() const {
+
918 return std::isnan(value) ^ flipped;
+
919}
+
920DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
921template struct DOCTEST_INTERFACE_DEF IsNaN<float>;
+
922template struct DOCTEST_INTERFACE_DEF IsNaN<double>;
+
923template struct DOCTEST_INTERFACE_DEF IsNaN<long double>;
+
924template <typename F>
+
925String toString(IsNaN<F> in) { return String(in.flipped ? "! " : "") + "IsNaN( " + doctest::toString(in.value) + " )"; }
+
926String toString(IsNaN<float> in) { return toString<float>(in); }
+
927String toString(IsNaN<double> in) { return toString<double>(in); }
+
928String toString(IsNaN<double long> in) { return toString<double long>(in); }
+
929
+
930} // namespace doctest
+
931
+
932#ifdef DOCTEST_CONFIG_DISABLE
+
933namespace doctest {
+
934Context::Context(int, const char* const*) {}
+
935Context::~Context() = default;
+
936void Context::applyCommandLine(int, const char* const*) {}
+
937void Context::addFilter(const char*, const char*) {}
+
938void Context::clearFilters() {}
+
939void Context::setOption(const char*, bool) {}
+
940void Context::setOption(const char*, int) {}
+
941void Context::setOption(const char*, const char*) {}
+
942bool Context::shouldExit() { return false; }
+
943void Context::setAsDefaultForAssertsOutOfTestCases() {}
+
944void Context::setAssertHandler(detail::assert_handler) {}
+
945void Context::setCout(std::ostream*) {}
+
946int Context::run() { return 0; }
+
947
+
948int IReporter::get_num_active_contexts() { return 0; }
+
949const IContextScope* const* IReporter::get_active_contexts() { return nullptr; }
+
950int IReporter::get_num_stringified_contexts() { return 0; }
+
951const String* IReporter::get_stringified_contexts() { return nullptr; }
+
952
+
953int registerReporter(const char*, int, IReporter*) { return 0; }
+
954
+
955} // namespace doctest
+
956#else // DOCTEST_CONFIG_DISABLE
+
957
+
958#if !defined(DOCTEST_CONFIG_COLORS_NONE)
+
959#if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)
+
960#ifdef DOCTEST_PLATFORM_WINDOWS
+
961#define DOCTEST_CONFIG_COLORS_WINDOWS
+
962#else // linux
+
963#define DOCTEST_CONFIG_COLORS_ANSI
+
964#endif // platform
+
965#endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI
+
966#endif // DOCTEST_CONFIG_COLORS_NONE
+
967
+
968namespace doctest_detail_test_suite_ns {
+
969// holds the current test suite
+
970doctest::detail::TestSuite& getCurrentTestSuite() {
+
971 static doctest::detail::TestSuite data{};
+
972 return data;
+
973}
+
974} // namespace doctest_detail_test_suite_ns
+
975
+
976namespace doctest {
+
977namespace {
+
978 // the int (priority) is part of the key for automatic sorting - sadly one can register a
+
979 // reporter with a duplicate name and a different priority but hopefully that won't happen often :|
+
980 using reporterMap = std::map<std::pair<int, String>, reporterCreatorFunc>;
+
981
+
982 reporterMap& getReporters() {
+
983 static reporterMap data;
+
984 return data;
+
985 }
+
986 reporterMap& getListeners() {
+
987 static reporterMap data;
+
988 return data;
+
989 }
+
990} // namespace
+
991namespace detail {
+
992#define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...) \
+
993 for(auto& curr_rep : g_cs->reporters_currently_used) \
+
994 curr_rep->function(__VA_ARGS__)
+
995
+
996 bool checkIfShouldThrow(assertType::Enum at) {
+
997 if(at & assertType::is_require)
+
998 return true;
+
999
+
1000 if((at & assertType::is_check)
+
1001 && getContextOptions()->abort_after > 0 &&
+
1002 (g_cs->numAssertsFailed + g_cs->numAssertsFailedCurrentTest_atomic) >=
+
1003 getContextOptions()->abort_after)
+
1004 return true;
+
1005
+
1006 return false;
+
1007 }
+
1008
+
1009#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1010 DOCTEST_NORETURN void throwException() {
+
1011 g_cs->shouldLogCurrentException = false;
+
1012 throw TestFailureException(); // NOLINT(hicpp-exception-baseclass)
+
1013 }
+
1014#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1015 void throwException() {}
+
1016#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1017} // namespace detail
+
1018
+
1019namespace {
+
1020 using namespace detail;
+
1021 // matching of a string against a wildcard mask (case sensitivity configurable) taken from
+
1022 // https://www.codeproject.com/Articles/1088/Wildcard-string-compare-globbing
+
1023 int wildcmp(const char* str, const char* wild, bool caseSensitive) {
+
1024 const char* cp = str;
+
1025 const char* mp = wild;
+
1026
+
1027 while((*str) && (*wild != '*')) {
+
1028 if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
+
1029 (*wild != '?')) {
+
1030 return 0;
+
1031 }
+
1032 wild++;
+
1033 str++;
+
1034 }
+
1035
+
1036 while(*str) {
+
1037 if(*wild == '*') {
+
1038 if(!*++wild) {
+
1039 return 1;
+
1040 }
+
1041 mp = wild;
+
1042 cp = str + 1;
+
1043 } else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
+
1044 (*wild == '?')) {
+
1045 wild++;
+
1046 str++;
+
1047 } else {
+
1048 wild = mp;
+
1049 str = cp++;
+
1050 }
+
1051 }
+
1052
+
1053 while(*wild == '*') {
+
1054 wild++;
+
1055 }
+
1056 return !*wild;
+
1057 }
+
1058
+
1059 // checks if the name matches any of the filters (and can be configured what to do when empty)
+
1060 bool matchesAny(const char* name, const std::vector<String>& filters, bool matchEmpty,
+
1061 bool caseSensitive) {
+
1062 if (filters.empty() && matchEmpty)
+
1063 return true;
+
1064 for (auto& curr : filters)
+
1065 if (wildcmp(name, curr.c_str(), caseSensitive))
+
1066 return true;
+
1067 return false;
+
1068 }
+
1069
+
1070 DOCTEST_NO_SANITIZE_INTEGER
+
1071 unsigned long long hash(unsigned long long a, unsigned long long b) {
+
1072 return (a << 5) + b;
+
1073 }
+
1074
+
1075 // C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html
+
1076 DOCTEST_NO_SANITIZE_INTEGER
+
1077 unsigned long long hash(const char* str) {
+
1078 unsigned long long hash = 5381;
+
1079 char c;
+
1080 while ((c = *str++))
+
1081 hash = ((hash << 5) + hash) + c; // hash * 33 + c
+
1082 return hash;
+
1083 }
+
1084
+
1085 unsigned long long hash(const SubcaseSignature& sig) {
+
1086 return hash(hash(hash(sig.m_file), hash(sig.m_name.c_str())), sig.m_line);
+
1087 }
+
1088
+
1089 unsigned long long hash(const std::vector<SubcaseSignature>& sigs, size_t count) {
+
1090 unsigned long long running = 0;
+
1091 auto end = sigs.begin() + count;
+
1092 for (auto it = sigs.begin(); it != end; it++) {
+
1093 running = hash(running, hash(*it));
+
1094 }
+
1095 return running;
+
1096 }
+
1097
+
1098 unsigned long long hash(const std::vector<SubcaseSignature>& sigs) {
+
1099 unsigned long long running = 0;
+
1100 for (const SubcaseSignature& sig : sigs) {
+
1101 running = hash(running, hash(sig));
+
1102 }
+
1103 return running;
+
1104 }
+
1105} // namespace
+
1106namespace detail {
+
1107 bool Subcase::checkFilters() {
+
1108 if (g_cs->subcaseStack.size() < size_t(g_cs->subcase_filter_levels)) {
+
1109 if (!matchesAny(m_signature.m_name.c_str(), g_cs->filters[6], true, g_cs->case_sensitive))
+
1110 return true;
+
1111 if (matchesAny(m_signature.m_name.c_str(), g_cs->filters[7], false, g_cs->case_sensitive))
+
1112 return true;
+
1113 }
+
1114 return false;
+
1115 }
+
1116
+
1117 Subcase::Subcase(const String& name, const char* file, int line)
+
1118 : m_signature({name, file, line}) {
+
1119 if (!g_cs->reachedLeaf) {
+
1120 if (g_cs->nextSubcaseStack.size() <= g_cs->subcaseStack.size()
+
1121 || g_cs->nextSubcaseStack[g_cs->subcaseStack.size()] == m_signature) {
+
1122 // Going down.
+
1123 if (checkFilters()) { return; }
+
1124
+
1125 g_cs->subcaseStack.push_back(m_signature);
+
1126 g_cs->currentSubcaseDepth++;
+
1127 m_entered = true;
+
1128 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
+
1129 }
+
1130 } else {
+
1131 if (g_cs->subcaseStack[g_cs->currentSubcaseDepth] == m_signature) {
+
1132 // This subcase is reentered via control flow.
+
1133 g_cs->currentSubcaseDepth++;
+
1134 m_entered = true;
+
1135 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
+
1136 } else if (g_cs->nextSubcaseStack.size() <= g_cs->currentSubcaseDepth
+
1137 && g_cs->fullyTraversedSubcases.find(hash(hash(g_cs->subcaseStack, g_cs->currentSubcaseDepth), hash(m_signature)))
+
1138 == g_cs->fullyTraversedSubcases.end()) {
+
1139 if (checkFilters()) { return; }
+
1140 // This subcase is part of the one to be executed next.
+
1141 g_cs->nextSubcaseStack.clear();
+
1142 g_cs->nextSubcaseStack.insert(g_cs->nextSubcaseStack.end(),
+
1143 g_cs->subcaseStack.begin(), g_cs->subcaseStack.begin() + g_cs->currentSubcaseDepth);
+
1144 g_cs->nextSubcaseStack.push_back(m_signature);
+
1145 }
+
1146 }
+
1147 }
+
1148
+
1149 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
+
1150 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
1151 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
1152
+
1153 Subcase::~Subcase() {
+
1154 if (m_entered) {
+
1155 g_cs->currentSubcaseDepth--;
+
1156
+
1157 if (!g_cs->reachedLeaf) {
+
1158 // Leaf.
+
1159 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
+
1160 g_cs->nextSubcaseStack.clear();
+
1161 g_cs->reachedLeaf = true;
+
1162 } else if (g_cs->nextSubcaseStack.empty()) {
+
1163 // All children are finished.
+
1164 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
+
1165 }
+
1166
+
1167#if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
+
1168 if(std::uncaught_exceptions() > 0
+
1169#else
+
1170 if(std::uncaught_exception()
+
1171#endif
+
1172 && g_cs->shouldLogCurrentException) {
+
1173 DOCTEST_ITERATE_THROUGH_REPORTERS(
+
1174 test_case_exception, {"exception thrown in subcase - will translate later "
+
1175 "when the whole test case has been exited (cannot "
+
1176 "translate while there is an active exception)",
+
1177 false});
+
1178 g_cs->shouldLogCurrentException = false;
+
1179 }
+
1180
+
1181 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);
+
1182 }
+
1183 }
+
1184
+
1185 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1186 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
1187 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1188
+
1189 Subcase::operator bool() const { return m_entered; }
+
1190
+
1191 Result::Result(bool passed, const String& decomposition)
+
1192 : m_passed(passed)
+
1193 , m_decomp(decomposition) {}
+
1194
+
1195 ExpressionDecomposer::ExpressionDecomposer(assertType::Enum at)
+
1196 : m_at(at) {}
+
1197
+
1198 TestSuite& TestSuite::operator*(const char* in) {
+
1199 m_test_suite = in;
+
1200 return *this;
+
1201 }
+
1202
+
1203 TestCase::TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
+
1204 const String& type, int template_id) {
+
1205 m_file = file;
+
1206 m_line = line;
+
1207 m_name = nullptr; // will be later overridden in operator*
+
1208 m_test_suite = test_suite.m_test_suite;
+
1209 m_description = test_suite.m_description;
+
1210 m_skip = test_suite.m_skip;
+
1211 m_no_breaks = test_suite.m_no_breaks;
+
1212 m_no_output = test_suite.m_no_output;
+
1213 m_may_fail = test_suite.m_may_fail;
+
1214 m_should_fail = test_suite.m_should_fail;
+
1215 m_expected_failures = test_suite.m_expected_failures;
+
1216 m_timeout = test_suite.m_timeout;
+
1217
+
1218 m_test = test;
+
1219 m_type = type;
+
1220 m_template_id = template_id;
+
1221 }
+
1222
+
1223 TestCase::TestCase(const TestCase& other)
+
1224 : TestCaseData() {
+
1225 *this = other;
+
1226 }
+
1227
+
1228 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
+
1229 TestCase& TestCase::operator=(const TestCase& other) {
+
1230 TestCaseData::operator=(other);
+
1231 m_test = other.m_test;
+
1232 m_type = other.m_type;
+
1233 m_template_id = other.m_template_id;
+
1234 m_full_name = other.m_full_name;
+
1235
+
1236 if(m_template_id != -1)
+
1237 m_name = m_full_name.c_str();
+
1238 return *this;
+
1239 }
+
1240 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1241
+
1242 TestCase& TestCase::operator*(const char* in) {
+
1243 m_name = in;
+
1244 // make a new name with an appended type for templated test case
+
1245 if(m_template_id != -1) {
+
1246 m_full_name = String(m_name) + "<" + m_type + ">";
+
1247 // redirect the name to point to the newly constructed full name
+
1248 m_name = m_full_name.c_str();
+
1249 }
+
1250 return *this;
+
1251 }
+
1252
+
1253 bool TestCase::operator<(const TestCase& other) const {
+
1254 // this will be used only to differentiate between test cases - not relevant for sorting
+
1255 if(m_line != other.m_line)
+
1256 return m_line < other.m_line;
+
1257 const int name_cmp = strcmp(m_name, other.m_name);
+
1258 if(name_cmp != 0)
+
1259 return name_cmp < 0;
+
1260 const int file_cmp = m_file.compare(other.m_file);
+
1261 if(file_cmp != 0)
+
1262 return file_cmp < 0;
+
1263 return m_template_id < other.m_template_id;
+
1264 }
+
1265
+
1266 // all the registered tests
+
1267 std::set<TestCase>& getRegisteredTests() {
+
1268 static std::set<TestCase> data;
+
1269 return data;
+
1270 }
+
1271} // namespace detail
+
1272namespace {
+
1273 using namespace detail;
+
1274 // for sorting tests by file/line
+
1275 bool fileOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
1276 // this is needed because MSVC gives different case for drive letters
+
1277 // for __FILE__ when evaluated in a header and a source file
+
1278 const int res = lhs->m_file.compare(rhs->m_file, bool(DOCTEST_MSVC));
+
1279 if(res != 0)
+
1280 return res < 0;
+
1281 if(lhs->m_line != rhs->m_line)
+
1282 return lhs->m_line < rhs->m_line;
+
1283 return lhs->m_template_id < rhs->m_template_id;
+
1284 }
+
1285
+
1286 // for sorting tests by suite/file/line
+
1287 bool suiteOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
1288 const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
+
1289 if(res != 0)
+
1290 return res < 0;
+
1291 return fileOrderComparator(lhs, rhs);
+
1292 }
+
1293
+
1294 // for sorting tests by name/suite/file/line
+
1295 bool nameOrderComparator(const TestCase* lhs, const TestCase* rhs) {
+
1296 const int res = std::strcmp(lhs->m_name, rhs->m_name);
+
1297 if(res != 0)
+
1298 return res < 0;
+
1299 return suiteOrderComparator(lhs, rhs);
+
1300 }
+
1301
+
1302 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
1303 void color_to_stream(std::ostream& s, Color::Enum code) {
+
1304 static_cast<void>(s); // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS
+
1305 static_cast<void>(code); // for DOCTEST_CONFIG_COLORS_NONE
+
1306#ifdef DOCTEST_CONFIG_COLORS_ANSI
+
1307 if(g_no_colors ||
+
1308 (isatty(STDOUT_FILENO) == false && getContextOptions()->force_colors == false))
+
1309 return;
+
1310
+
1311 auto col = "";
+
1312 // clang-format off
+
1313 switch(code) {
+
1314 case Color::Red: col = "[0;31m"; break;
+
1315 case Color::Green: col = "[0;32m"; break;
+
1316 case Color::Blue: col = "[0;34m"; break;
+
1317 case Color::Cyan: col = "[0;36m"; break;
+
1318 case Color::Yellow: col = "[0;33m"; break;
+
1319 case Color::Grey: col = "[1;30m"; break;
+
1320 case Color::LightGrey: col = "[0;37m"; break;
+
1321 case Color::BrightRed: col = "[1;31m"; break;
+
1322 case Color::BrightGreen: col = "[1;32m"; break;
+
1323 case Color::BrightWhite: col = "[1;37m"; break;
+
1324 case Color::Bright: // invalid
+
1325 case Color::None:
+
1326 case Color::White:
+
1327 default: col = "[0m";
+
1328 }
+
1329 // clang-format on
+
1330 s << "\033" << col;
+
1331#endif // DOCTEST_CONFIG_COLORS_ANSI
+
1332
+
1333#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
+
1334 if(g_no_colors ||
+
1335 (_isatty(_fileno(stdout)) == false && getContextOptions()->force_colors == false))
+
1336 return;
+
1337
+
1338 static struct ConsoleHelper {
+
1339 HANDLE stdoutHandle;
+
1340 WORD origFgAttrs;
+
1341 WORD origBgAttrs;
+
1342
+
1343 ConsoleHelper() {
+
1344 stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
+
1345 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
+
1346 GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
+
1347 origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
+
1348 BACKGROUND_BLUE | BACKGROUND_INTENSITY);
+
1349 origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
+
1350 FOREGROUND_BLUE | FOREGROUND_INTENSITY);
+
1351 }
+
1352 } ch;
+
1353
+
1354#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(ch.stdoutHandle, x | ch.origBgAttrs)
+
1355
+
1356 // clang-format off
+
1357 switch (code) {
+
1358 case Color::White: DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
+
1359 case Color::Red: DOCTEST_SET_ATTR(FOREGROUND_RED); break;
+
1360 case Color::Green: DOCTEST_SET_ATTR(FOREGROUND_GREEN); break;
+
1361 case Color::Blue: DOCTEST_SET_ATTR(FOREGROUND_BLUE); break;
+
1362 case Color::Cyan: DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN); break;
+
1363 case Color::Yellow: DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN); break;
+
1364 case Color::Grey: DOCTEST_SET_ATTR(0); break;
+
1365 case Color::LightGrey: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY); break;
+
1366 case Color::BrightRed: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED); break;
+
1367 case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN); break;
+
1368 case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
+
1369 case Color::None:
+
1370 case Color::Bright: // invalid
+
1371 default: DOCTEST_SET_ATTR(ch.origFgAttrs);
+
1372 }
+
1373 // clang-format on
+
1374#endif // DOCTEST_CONFIG_COLORS_WINDOWS
+
1375 }
+
1376 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1377
+
1378 std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
+
1379 static std::vector<const IExceptionTranslator*> data;
+
1380 return data;
+
1381 }
+
1382
+
1383 String translateActiveException() {
+
1384#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1385 String res;
+
1386 auto& translators = getExceptionTranslators();
+
1387 for(auto& curr : translators)
+
1388 if(curr->translate(res))
+
1389 return res;
+
1390 // clang-format off
+
1391 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wcatch-value")
+
1392 try {
+
1393 throw;
+
1394 } catch(std::exception& ex) {
+
1395 return ex.what();
+
1396 } catch(std::string& msg) {
+
1397 return msg.c_str();
+
1398 } catch(const char* msg) {
+
1399 return msg;
+
1400 } catch(...) {
+
1401 return "unknown exception";
+
1402 }
+
1403 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
1404// clang-format on
+
1405#else // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1406 return "";
+
1407#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1408 }
+
1409} // namespace
+
1410
+
1411namespace detail {
+
1412 // used by the macros for registering tests
+
1413 int regTest(const TestCase& tc) {
+
1414 getRegisteredTests().insert(tc);
+
1415 return 0;
+
1416 }
+
1417
+
1418 // sets the current test suite
+
1419 int setTestSuite(const TestSuite& ts) {
+
1420 doctest_detail_test_suite_ns::getCurrentTestSuite() = ts;
+
1421 return 0;
+
1422 }
+
1423
+
1424#ifdef DOCTEST_IS_DEBUGGER_ACTIVE
+
1425 bool isDebuggerActive() { return DOCTEST_IS_DEBUGGER_ACTIVE(); }
+
1426#else // DOCTEST_IS_DEBUGGER_ACTIVE
+
1427#ifdef DOCTEST_PLATFORM_LINUX
+
+ +
1429 public:
+
1430 ErrnoGuard() : m_oldErrno(errno) {}
+
1431 ~ErrnoGuard() { errno = m_oldErrno; }
+
1432 private:
+
1433 int m_oldErrno;
+
1434 };
+
+
1435 // See the comments in Catch2 for the reasoning behind this implementation:
+
1436 // https://github.com/catchorg/Catch2/blob/v2.13.1/include/internal/catch_debugger.cpp#L79-L102
+
1437 bool isDebuggerActive() {
+
1438 ErrnoGuard guard;
+
1439 std::ifstream in("/proc/self/status");
+
1440 for(std::string line; std::getline(in, line);) {
+
1441 static const int PREFIX_LEN = 11;
+
1442 if(line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0) {
+
1443 return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
+
1444 }
+
1445 }
+
1446 return false;
+
1447 }
+
1448#elif defined(DOCTEST_PLATFORM_MAC)
+
1449 // The following function is taken directly from the following technical note:
+
1450 // https://developer.apple.com/library/archive/qa/qa1361/_index.html
+
1451 // Returns true if the current process is being debugged (either
+
1452 // running under the debugger or has a debugger attached post facto).
+
1453 bool isDebuggerActive() {
+
1454 int mib[4];
+
1455 kinfo_proc info;
+
1456 size_t size;
+
1457 // Initialize the flags so that, if sysctl fails for some bizarre
+
1458 // reason, we get a predictable result.
+
1459 info.kp_proc.p_flag = 0;
+
1460 // Initialize mib, which tells sysctl the info we want, in this case
+
1461 // we're looking for information about a specific process ID.
+
1462 mib[0] = CTL_KERN;
+
1463 mib[1] = KERN_PROC;
+
1464 mib[2] = KERN_PROC_PID;
+
1465 mib[3] = getpid();
+
1466 // Call sysctl.
+
1467 size = sizeof(info);
+
1468 if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {
+
1469 std::cerr << "\nCall to sysctl failed - unable to determine if debugger is active **\n";
+
1470 return false;
+
1471 }
+
1472 // We're being debugged if the P_TRACED flag is set.
+
1473 return ((info.kp_proc.p_flag & P_TRACED) != 0);
+
1474 }
+
1475#elif DOCTEST_MSVC || defined(__MINGW32__) || defined(__MINGW64__)
+
1476 bool isDebuggerActive() { return ::IsDebuggerPresent() != 0; }
+
1477#else
+
1478 bool isDebuggerActive() { return false; }
+
1479#endif // Platform
+
1480#endif // DOCTEST_IS_DEBUGGER_ACTIVE
+
1481
+
1482 void registerExceptionTranslatorImpl(const IExceptionTranslator* et) {
+
1483 if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
+
1484 getExceptionTranslators().end())
+
1485 getExceptionTranslators().push_back(et);
+
1486 }
+
1487
+
1488 DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts; // for logging with INFO()
+
1489
+
1490 ContextScopeBase::ContextScopeBase() {
+
1491 g_infoContexts.push_back(this);
+
1492 }
+
1493
+
1494 ContextScopeBase::ContextScopeBase(ContextScopeBase&& other) noexcept {
+
1495 if (other.need_to_destroy) {
+
1496 other.destroy();
+
1497 }
+
1498 other.need_to_destroy = false;
+
1499 g_infoContexts.push_back(this);
+
1500 }
+
1501
+
1502 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4996) // std::uncaught_exception is deprecated in C++17
+
1503 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
1504 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
+
1505
+
1506 // destroy cannot be inlined into the destructor because that would mean calling stringify after
+
1507 // ContextScope has been destroyed (base class destructors run after derived class destructors).
+
1508 // Instead, ContextScope calls this method directly from its destructor.
+
1509 void ContextScopeBase::destroy() {
+
1510#if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
+
1511 if(std::uncaught_exceptions() > 0) {
+
1512#else
+
1513 if(std::uncaught_exception()) {
+
1514#endif
+
1515 std::ostringstream s;
+
1516 this->stringify(&s);
+
1517 g_cs->stringifiedContexts.push_back(s.str().c_str());
+
1518 }
+
1519 g_infoContexts.pop_back();
+
1520 }
+
1521
+
1522 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1523 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
1524 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1525} // namespace detail
+
1526namespace {
+
1527 using namespace detail;
+
1528
+
1529#if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
1530 struct FatalConditionHandler
+
1531 {
+
1532 static void reset() {}
+
1533 static void allocateAltStackMem() {}
+
1534 static void freeAltStackMem() {}
+
1535 };
+
1536#else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
1537
+
1538 void reportFatal(const std::string&);
+
1539
+
1540#ifdef DOCTEST_PLATFORM_WINDOWS
+
1541
+
1542 struct SignalDefs
+
1543 {
+
1544 DWORD id;
+
1545 const char* name;
+
1546 };
+
1547 // There is no 1-1 mapping between signals and windows exceptions.
+
1548 // Windows can easily distinguish between SO and SigSegV,
+
1549 // but SigInt, SigTerm, etc are handled differently.
+
1550 SignalDefs signalDefs[] = {
+
1551 {static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),
+
1552 "SIGILL - Illegal instruction signal"},
+
1553 {static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow"},
+
1554 {static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION),
+
1555 "SIGSEGV - Segmentation violation signal"},
+
1556 {static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error"},
+
1557 };
+
1558
+
1559 struct FatalConditionHandler
+
1560 {
+
1561 static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) {
+
1562 // Multiple threads may enter this filter/handler at once. We want the error message to be printed on the
+
1563 // console just once no matter how many threads have crashed.
+
1564 DOCTEST_DECLARE_STATIC_MUTEX(mutex)
+
1565 static bool execute = true;
+
1566 {
+
1567 DOCTEST_LOCK_MUTEX(mutex)
+
1568 if(execute) {
+
1569 bool reported = false;
+
1570 for(size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
1571 if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
+
1572 reportFatal(signalDefs[i].name);
+
1573 reported = true;
+
1574 break;
+
1575 }
+
1576 }
+
1577 if(reported == false)
+
1578 reportFatal("Unhandled SEH exception caught");
+
1579 if(isDebuggerActive() && !g_cs->no_breaks)
+
1580 DOCTEST_BREAK_INTO_DEBUGGER();
+
1581 }
+
1582 execute = false;
+
1583 }
+
1584 std::exit(EXIT_FAILURE);
+
1585 }
+
1586
+
1587 static void allocateAltStackMem() {}
+
1588 static void freeAltStackMem() {}
+
1589
+
1590 FatalConditionHandler() {
+
1591 isSet = true;
+
1592 // 32k seems enough for doctest to handle stack overflow,
+
1593 // but the value was found experimentally, so there is no strong guarantee
+
1594 guaranteeSize = 32 * 1024;
+
1595 // Register an unhandled exception filter
+
1596 previousTop = SetUnhandledExceptionFilter(handleException);
+
1597 // Pass in guarantee size to be filled
+
1598 SetThreadStackGuarantee(&guaranteeSize);
+
1599
+
1600 // On Windows uncaught exceptions from another thread, exceptions from
+
1601 // destructors, or calls to std::terminate are not a SEH exception
+
1602
+
1603 // The terminal handler gets called when:
+
1604 // - std::terminate is called FROM THE TEST RUNNER THREAD
+
1605 // - an exception is thrown from a destructor FROM THE TEST RUNNER THREAD
+
1606 original_terminate_handler = std::get_terminate();
+
1607 std::set_terminate([]() DOCTEST_NOEXCEPT {
+
1608 reportFatal("Terminate handler called");
+
1609 if(isDebuggerActive() && !g_cs->no_breaks)
+
1610 DOCTEST_BREAK_INTO_DEBUGGER();
+
1611 std::exit(EXIT_FAILURE); // explicitly exit - otherwise the SIGABRT handler may be called as well
+
1612 });
+
1613
+
1614 // SIGABRT is raised when:
+
1615 // - std::terminate is called FROM A DIFFERENT THREAD
+
1616 // - an exception is thrown from a destructor FROM A DIFFERENT THREAD
+
1617 // - an uncaught exception is thrown FROM A DIFFERENT THREAD
+
1618 prev_sigabrt_handler = std::signal(SIGABRT, [](int signal) DOCTEST_NOEXCEPT {
+
1619 if(signal == SIGABRT) {
+
1620 reportFatal("SIGABRT - Abort (abnormal termination) signal");
+
1621 if(isDebuggerActive() && !g_cs->no_breaks)
+
1622 DOCTEST_BREAK_INTO_DEBUGGER();
+
1623 std::exit(EXIT_FAILURE);
+
1624 }
+
1625 });
+
1626
+
1627 // The following settings are taken from google test, and more
+
1628 // specifically from UnitTest::Run() inside of gtest.cc
+
1629
+
1630 // the user does not want to see pop-up dialogs about crashes
+
1631 prev_error_mode_1 = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+
1632 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+
1633 // This forces the abort message to go to stderr in all circumstances.
+
1634 prev_error_mode_2 = _set_error_mode(_OUT_TO_STDERR);
+
1635 // In the debug version, Visual Studio pops up a separate dialog
+
1636 // offering a choice to debug the aborted program - we want to disable that.
+
1637 prev_abort_behavior = _set_abort_behavior(0x0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+
1638 // In debug mode, the Windows CRT can crash with an assertion over invalid
+
1639 // input (e.g. passing an invalid file descriptor). The default handling
+
1640 // for these assertions is to pop up a dialog and wait for user input.
+
1641 // Instead ask the CRT to dump such assertions to stderr non-interactively.
+
1642 prev_report_mode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
+
1643 prev_report_file = _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
+
1644 }
+
1645
+
1646 static void reset() {
+
1647 if(isSet) {
+
1648 // Unregister handler and restore the old guarantee
+
1649 SetUnhandledExceptionFilter(previousTop);
+
1650 SetThreadStackGuarantee(&guaranteeSize);
+
1651 std::set_terminate(original_terminate_handler);
+
1652 std::signal(SIGABRT, prev_sigabrt_handler);
+
1653 SetErrorMode(prev_error_mode_1);
+
1654 _set_error_mode(prev_error_mode_2);
+
1655 _set_abort_behavior(prev_abort_behavior, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+
1656 static_cast<void>(_CrtSetReportMode(_CRT_ASSERT, prev_report_mode));
+
1657 static_cast<void>(_CrtSetReportFile(_CRT_ASSERT, prev_report_file));
+
1658 isSet = false;
+
1659 }
+
1660 }
+
1661
+
1662 ~FatalConditionHandler() { reset(); }
+
1663
+
1664 private:
+
1665 static UINT prev_error_mode_1;
+
1666 static int prev_error_mode_2;
+
1667 static unsigned int prev_abort_behavior;
+
1668 static int prev_report_mode;
+
1669 static _HFILE prev_report_file;
+
1670 static void (DOCTEST_CDECL *prev_sigabrt_handler)(int);
+
1671 static std::terminate_handler original_terminate_handler;
+
1672 static bool isSet;
+
1673 static ULONG guaranteeSize;
+
1674 static LPTOP_LEVEL_EXCEPTION_FILTER previousTop;
+
1675 };
+
1676
+
1677 UINT FatalConditionHandler::prev_error_mode_1;
+
1678 int FatalConditionHandler::prev_error_mode_2;
+
1679 unsigned int FatalConditionHandler::prev_abort_behavior;
+
1680 int FatalConditionHandler::prev_report_mode;
+
1681 _HFILE FatalConditionHandler::prev_report_file;
+
1682 void (DOCTEST_CDECL *FatalConditionHandler::prev_sigabrt_handler)(int);
+
1683 std::terminate_handler FatalConditionHandler::original_terminate_handler;
+
1684 bool FatalConditionHandler::isSet = false;
+
1685 ULONG FatalConditionHandler::guaranteeSize = 0;
+
1686 LPTOP_LEVEL_EXCEPTION_FILTER FatalConditionHandler::previousTop = nullptr;
+
1687
+
1688#else // DOCTEST_PLATFORM_WINDOWS
+
1689
+
1690 struct SignalDefs
+
1691 {
+
1692 int id;
+
1693 const char* name;
+
1694 };
+
1695 SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
+
1696 {SIGILL, "SIGILL - Illegal instruction signal"},
+
1697 {SIGFPE, "SIGFPE - Floating point error signal"},
+
1698 {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
+
1699 {SIGTERM, "SIGTERM - Termination request signal"},
+
1700 {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};
+
1701
+
1702 struct FatalConditionHandler
+
1703 {
+
1704 static bool isSet;
+
1705 static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
+
1706 static stack_t oldSigStack;
+
1707 static size_t altStackSize;
+
1708 static char* altStackMem;
+
1709
+
1710 static void handleSignal(int sig) {
+
1711 const char* name = "<unknown signal>";
+
1712 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
1713 SignalDefs& def = signalDefs[i];
+
1714 if(sig == def.id) {
+
1715 name = def.name;
+
1716 break;
+
1717 }
+
1718 }
+
1719 reset();
+
1720 reportFatal(name);
+
1721 raise(sig);
+
1722 }
+
1723
+
1724 static void allocateAltStackMem() {
+
1725 altStackMem = new char[altStackSize];
+
1726 }
+
1727
+
1728 static void freeAltStackMem() {
+
1729 delete[] altStackMem;
+
1730 }
+
1731
+
1732 FatalConditionHandler() {
+
1733 isSet = true;
+
1734 stack_t sigStack;
+
1735 sigStack.ss_sp = altStackMem;
+
1736 sigStack.ss_size = altStackSize;
+
1737 sigStack.ss_flags = 0;
+
1738 sigaltstack(&sigStack, &oldSigStack);
+
1739 struct sigaction sa = {};
+
1740 sa.sa_handler = handleSignal;
+
1741 sa.sa_flags = SA_ONSTACK;
+
1742 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
1743 sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
+
1744 }
+
1745 }
+
1746
+
1747 ~FatalConditionHandler() { reset(); }
+
1748 static void reset() {
+
1749 if(isSet) {
+
1750 // Set signals back to previous values -- hopefully nobody overwrote them in the meantime
+
1751 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
+
1752 sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
+
1753 }
+
1754 // Return the old stack
+
1755 sigaltstack(&oldSigStack, nullptr);
+
1756 isSet = false;
+
1757 }
+
1758 }
+
1759 };
+
1760
+
1761 bool FatalConditionHandler::isSet = false;
+
1762 struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
+
1763 stack_t FatalConditionHandler::oldSigStack = {};
+
1764 size_t FatalConditionHandler::altStackSize = 4 * SIGSTKSZ;
+
1765 char* FatalConditionHandler::altStackMem = nullptr;
+
1766
+
1767#endif // DOCTEST_PLATFORM_WINDOWS
+
1768#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
1769
+
1770} // namespace
+
1771
+
1772namespace {
+
1773 using namespace detail;
+
1774
+
1775#ifdef DOCTEST_PLATFORM_WINDOWS
+
1776#define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)
+
1777#else
+
1778 // TODO: integration with XCode and other IDEs
+
1779#define DOCTEST_OUTPUT_DEBUG_STRING(text)
+
1780#endif // Platform
+
1781
+
1782 void addAssert(assertType::Enum at) {
+
1783 if((at & assertType::is_warn) == 0)
+
1784 g_cs->numAssertsCurrentTest_atomic++;
+
1785 }
+
1786
+
1787 void addFailedAssert(assertType::Enum at) {
+
1788 if((at & assertType::is_warn) == 0)
+
1789 g_cs->numAssertsFailedCurrentTest_atomic++;
+
1790 }
+
1791
+
1792#if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
1793 void reportFatal(const std::string& message) {
+
1794 g_cs->failure_flags |= TestCaseFailureReason::Crash;
+
1795
+
1796 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(), true});
+
1797
+
1798 while (g_cs->subcaseStack.size()) {
+
1799 g_cs->subcaseStack.pop_back();
+
1800 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end, DOCTEST_EMPTY);
+
1801 }
+
1802
+
1803 g_cs->finalizeTestCaseData();
+
1804
+
1805 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
+
1806
+
1807 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
+
1808 }
+
1809#endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
+
1810} // namespace
+
1811
+
1812AssertData::AssertData(assertType::Enum at, const char* file, int line, const char* expr,
+
1813 const char* exception_type, const StringContains& exception_string)
+
1814 : m_test_case(g_cs->currentTest), m_at(at), m_file(file), m_line(line), m_expr(expr),
+
1815 m_failed(true), m_threw(false), m_threw_as(false), m_exception_type(exception_type),
+
1816 m_exception_string(exception_string) {
+
1817#if DOCTEST_MSVC
+
1818 if (m_expr[0] == ' ') // this happens when variadic macros are disabled under MSVC
+
1819 ++m_expr;
+
1820#endif // MSVC
+
1821}
+
1822
+
1823namespace detail {
+
1824 ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1825 const char* exception_type, const String& exception_string)
+
1826 : AssertData(at, file, line, expr, exception_type, exception_string) { }
+
1827
+
1828 ResultBuilder::ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1829 const char* exception_type, const Contains& exception_string)
+
1830 : AssertData(at, file, line, expr, exception_type, exception_string) { }
+
1831
+
1832 void ResultBuilder::setResult(const Result& res) {
+
1833 m_decomp = res.m_decomp;
+
1834 m_failed = !res.m_passed;
+
1835 }
+
1836
+
1837 void ResultBuilder::translateException() {
+
1838 m_threw = true;
+
1839 m_exception = translateActiveException();
+
1840 }
+
1841
+
+ +
1843 if(m_at & assertType::is_throws) {
+
1844 m_failed = !m_threw;
+
1845 } else if((m_at & assertType::is_throws_as) && (m_at & assertType::is_throws_with)) {
+
1846 m_failed = !m_threw_as || !m_exception_string.check(m_exception);
+
1847 } else if(m_at & assertType::is_throws_as) {
+
1848 m_failed = !m_threw_as;
+
1849 } else if(m_at & assertType::is_throws_with) {
+
1850 m_failed = !m_exception_string.check(m_exception);
+
1851 } else if(m_at & assertType::is_nothrow) {
+
1852 m_failed = m_threw;
+
1853 }
+
1854
+
1855 if(m_exception.size())
+
1856 m_exception = "\"" + m_exception + "\"";
+
1857
+
1858 if(is_running_in_test) {
+
1859 addAssert(m_at);
+
1860 DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *this);
+
1861
+
1862 if(m_failed)
+
1863 addFailedAssert(m_at);
+
1864 } else if(m_failed) {
+
1865 failed_out_of_a_testing_context(*this);
+
1866 }
+
1867
+
1868 return m_failed && isDebuggerActive() && !getContextOptions()->no_breaks &&
+
1869 (g_cs->currentTest == nullptr || !g_cs->currentTest->m_no_breaks); // break into debugger
+
1870 }
+
+
1871
+
1872 void ResultBuilder::react() const {
+
1873 if(m_failed && checkIfShouldThrow(m_at))
+
1874 throwException();
+
1875 }
+
1876
+
1877 void failed_out_of_a_testing_context(const AssertData& ad) {
+
1878 if(g_cs->ah)
+
1879 g_cs->ah(ad);
+
1880 else
+
1881 std::abort();
+
1882 }
+
1883
+
1884 bool decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,
+
1885 const Result& result) {
+
1886 bool failed = !result.m_passed;
+
1887
+
1888 // ###################################################################################
+
1889 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
1890 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
1891 // ###################################################################################
+
1892 DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);
+
1893 DOCTEST_ASSERT_IN_TESTS(result.m_decomp);
+
1894 return !failed;
+
1895 }
+
1896
+
1897 MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {
+
1898 m_stream = tlssPush();
+
1899 m_file = file;
+
1900 m_line = line;
+
1901 m_severity = severity;
+
1902 }
+
1903
+
1904 MessageBuilder::~MessageBuilder() {
+
1905 if (!logged)
+
1906 tlssPop();
+
1907 }
+
1908
+
1909 DOCTEST_DEFINE_INTERFACE(IExceptionTranslator)
+
1910
+
1911 bool MessageBuilder::log() {
+
1912 if (!logged) {
+
1913 m_string = tlssPop();
+
1914 logged = true;
+
1915 }
+
1916
+
1917 DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);
+
1918
+
1919 const bool isWarn = m_severity & assertType::is_warn;
+
1920
+
1921 // warn is just a message in this context so we don't treat it as an assert
+
1922 if(!isWarn) {
+
1923 addAssert(m_severity);
+
1924 addFailedAssert(m_severity);
+
1925 }
+
1926
+
1927 return isDebuggerActive() && !getContextOptions()->no_breaks && !isWarn &&
+
1928 (g_cs->currentTest == nullptr || !g_cs->currentTest->m_no_breaks); // break into debugger
+
1929 }
+
1930
+
+ +
1932 if(m_severity & assertType::is_require)
+
1933 throwException();
+
1934 }
+
+
1935} // namespace detail
+
1936namespace {
+
1937 using namespace detail;
+
1938
+
1939 // clang-format off
+
1940
+
1941// =================================================================================================
+
1942// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp
+
1943// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.
+
1944// =================================================================================================
+
1945
+
1946 class XmlEncode {
+
1947 public:
+
1948 enum ForWhat { ForTextNodes, ForAttributes };
+
1949
+
1950 XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );
+
1951
+
1952 void encodeTo( std::ostream& os ) const;
+
1953
+
1954 friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );
+
1955
+
1956 private:
+
1957 std::string m_str;
+
1958 ForWhat m_forWhat;
+
1959 };
+
1960
+
1961 class XmlWriter {
+
1962 public:
+
1963
+
1964 class ScopedElement {
+
1965 public:
+
1966 ScopedElement( XmlWriter* writer );
+
1967
+
1968 ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT;
+
1969 ScopedElement& operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT;
+
1970
+
1971 ~ScopedElement();
+
1972
+
1973 ScopedElement& writeText( std::string const& text, bool indent = true );
+
1974
+
1975 template<typename T>
+
1976 ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
+
1977 m_writer->writeAttribute( name, attribute );
+
1978 return *this;
+
1979 }
+
1980
+
1981 private:
+
1982 mutable XmlWriter* m_writer = nullptr;
+
1983 };
+
1984
+
1985#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
1986 XmlWriter( std::ostream& os = std::cout );
+
1987#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
1988 XmlWriter( std::ostream& os );
+
1989#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
1990 ~XmlWriter();
+
1991
+
1992 XmlWriter( XmlWriter const& ) = delete;
+
1993 XmlWriter& operator=( XmlWriter const& ) = delete;
+
1994
+
1995 XmlWriter& startElement( std::string const& name );
+
1996
+
1997 ScopedElement scopedElement( std::string const& name );
+
1998
+
1999 XmlWriter& endElement();
+
2000
+
2001 XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );
+
2002
+
2003 XmlWriter& writeAttribute( std::string const& name, const char* attribute );
+
2004
+
2005 XmlWriter& writeAttribute( std::string const& name, bool attribute );
+
2006
+
2007 template<typename T>
+
2008 XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
+
2009 std::stringstream rss;
+
2010 rss << attribute;
+
2011 return writeAttribute( name, rss.str() );
+
2012 }
+
2013
+
2014 XmlWriter& writeText( std::string const& text, bool indent = true );
+
2015
+
2016 //XmlWriter& writeComment( std::string const& text );
+
2017
+
2018 //void writeStylesheetRef( std::string const& url );
+
2019
+
2020 //XmlWriter& writeBlankLine();
+
2021
+
2022 void ensureTagClosed();
+
2023
+
2024 void writeDeclaration();
+
2025
+
2026 private:
+
2027
+
2028 void newlineIfNecessary();
+
2029
+
2030 bool m_tagIsOpen = false;
+
2031 bool m_needsNewline = false;
+
2032 std::vector<std::string> m_tags;
+
2033 std::string m_indent;
+
2034 std::ostream& m_os;
+
2035 };
+
2036
+
2037// =================================================================================================
+
2038// The following code has been taken verbatim from Catch2/include/internal/catch_xmlwriter.h/cpp
+
2039// This is done so cherry-picking bug fixes is trivial - even the style/formatting is untouched.
+
2040// =================================================================================================
+
2041
+
2042using uchar = unsigned char;
+
2043
+
2044namespace {
+
2045
+
2046 size_t trailingBytes(unsigned char c) {
+
2047 if ((c & 0xE0) == 0xC0) {
+
2048 return 2;
+
2049 }
+
2050 if ((c & 0xF0) == 0xE0) {
+
2051 return 3;
+
2052 }
+
2053 if ((c & 0xF8) == 0xF0) {
+
2054 return 4;
+
2055 }
+
2056 DOCTEST_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+
2057 }
+
2058
+
2059 uint32_t headerValue(unsigned char c) {
+
2060 if ((c & 0xE0) == 0xC0) {
+
2061 return c & 0x1F;
+
2062 }
+
2063 if ((c & 0xF0) == 0xE0) {
+
2064 return c & 0x0F;
+
2065 }
+
2066 if ((c & 0xF8) == 0xF0) {
+
2067 return c & 0x07;
+
2068 }
+
2069 DOCTEST_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
+
2070 }
+
2071
+
2072 void hexEscapeChar(std::ostream& os, unsigned char c) {
+
2073 std::ios_base::fmtflags f(os.flags());
+
2074 os << "\\x"
+
2075 << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
+
2076 << static_cast<int>(c);
+
2077 os.flags(f);
+
2078 }
+
2079
+
2080} // anonymous namespace
+
2081
+
2082 XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )
+
2083 : m_str( str ),
+
2084 m_forWhat( forWhat )
+
2085 {}
+
2086
+
2087 void XmlEncode::encodeTo( std::ostream& os ) const {
+
2088 // Apostrophe escaping not necessary if we always use " to write attributes
+
2089 // (see: https://www.w3.org/TR/xml/#syntax)
+
2090
+
2091 for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
+
2092 uchar c = m_str[idx];
+
2093 switch (c) {
+
2094 case '<': os << "&lt;"; break;
+
2095 case '&': os << "&amp;"; break;
+
2096
+
2097 case '>':
+
2098 // See: https://www.w3.org/TR/xml/#syntax
+
2099 if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')
+
2100 os << "&gt;";
+
2101 else
+
2102 os << c;
+
2103 break;
+
2104
+
2105 case '\"':
+
2106 if (m_forWhat == ForAttributes)
+
2107 os << "&quot;";
+
2108 else
+
2109 os << c;
+
2110 break;
+
2111
+
2112 default:
+
2113 // Check for control characters and invalid utf-8
+
2114
+
2115 // Escape control characters in standard ascii
+
2116 // see https://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
+
2117 if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
+
2118 hexEscapeChar(os, c);
+
2119 break;
+
2120 }
+
2121
+
2122 // Plain ASCII: Write it to stream
+
2123 if (c < 0x7F) {
+
2124 os << c;
+
2125 break;
+
2126 }
+
2127
+
2128 // UTF-8 territory
+
2129 // Check if the encoding is valid and if it is not, hex escape bytes.
+
2130 // Important: We do not check the exact decoded values for validity, only the encoding format
+
2131 // First check that this bytes is a valid lead byte:
+
2132 // This means that it is not encoded as 1111 1XXX
+
2133 // Or as 10XX XXXX
+
2134 if (c < 0xC0 ||
+
2135 c >= 0xF8) {
+
2136 hexEscapeChar(os, c);
+
2137 break;
+
2138 }
+
2139
+
2140 auto encBytes = trailingBytes(c);
+
2141 // Are there enough bytes left to avoid accessing out-of-bounds memory?
+
2142 if (idx + encBytes - 1 >= m_str.size()) {
+
2143 hexEscapeChar(os, c);
+
2144 break;
+
2145 }
+
2146 // The header is valid, check data
+
2147 // The next encBytes bytes must together be a valid utf-8
+
2148 // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)
+
2149 bool valid = true;
+
2150 uint32_t value = headerValue(c);
+
2151 for (std::size_t n = 1; n < encBytes; ++n) {
+
2152 uchar nc = m_str[idx + n];
+
2153 valid &= ((nc & 0xC0) == 0x80);
+
2154 value = (value << 6) | (nc & 0x3F);
+
2155 }
+
2156
+
2157 if (
+
2158 // Wrong bit pattern of following bytes
+
2159 (!valid) ||
+
2160 // Overlong encodings
+
2161 (value < 0x80) ||
+
2162 ( value < 0x800 && encBytes > 2) || // removed "0x80 <= value &&" because redundant
+
2163 (0x800 < value && value < 0x10000 && encBytes > 3) ||
+
2164 // Encoded value out of range
+
2165 (value >= 0x110000)
+
2166 ) {
+
2167 hexEscapeChar(os, c);
+
2168 break;
+
2169 }
+
2170
+
2171 // If we got here, this is in fact a valid(ish) utf-8 sequence
+
2172 for (std::size_t n = 0; n < encBytes; ++n) {
+
2173 os << m_str[idx + n];
+
2174 }
+
2175 idx += encBytes - 1;
+
2176 break;
+
2177 }
+
2178 }
+
2179 }
+
2180
+
2181 std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {
+
2182 xmlEncode.encodeTo( os );
+
2183 return os;
+
2184 }
+
2185
+
2186 XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )
+
2187 : m_writer( writer )
+
2188 {}
+
2189
+
2190 XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) DOCTEST_NOEXCEPT
+
2191 : m_writer( other.m_writer ){
+
2192 other.m_writer = nullptr;
+
2193 }
+
2194 XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) DOCTEST_NOEXCEPT {
+
2195 if ( m_writer ) {
+
2196 m_writer->endElement();
+
2197 }
+
2198 m_writer = other.m_writer;
+
2199 other.m_writer = nullptr;
+
2200 return *this;
+
2201 }
+
2202
+
2203
+
2204 XmlWriter::ScopedElement::~ScopedElement() {
+
2205 if( m_writer )
+
2206 m_writer->endElement();
+
2207 }
+
2208
+
2209 XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) {
+
2210 m_writer->writeText( text, indent );
+
2211 return *this;
+
2212 }
+
2213
+
2214 XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )
+
2215 {
+
2216 // writeDeclaration(); // called explicitly by the reporters that use the writer class - see issue #627
+
2217 }
+
2218
+
2219 XmlWriter::~XmlWriter() {
+
2220 while( !m_tags.empty() )
+
2221 endElement();
+
2222 }
+
2223
+
2224 XmlWriter& XmlWriter::startElement( std::string const& name ) {
+
2225 ensureTagClosed();
+
2226 newlineIfNecessary();
+
2227 m_os << m_indent << '<' << name;
+
2228 m_tags.push_back( name );
+
2229 m_indent += " ";
+
2230 m_tagIsOpen = true;
+
2231 return *this;
+
2232 }
+
2233
+
2234 XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) {
+
2235 ScopedElement scoped( this );
+
2236 startElement( name );
+
2237 return scoped;
+
2238 }
+
2239
+
2240 XmlWriter& XmlWriter::endElement() {
+
2241 newlineIfNecessary();
+
2242 m_indent = m_indent.substr( 0, m_indent.size()-2 );
+
2243 if( m_tagIsOpen ) {
+
2244 m_os << "/>";
+
2245 m_tagIsOpen = false;
+
2246 }
+
2247 else {
+
2248 m_os << m_indent << "</" << m_tags.back() << ">";
+
2249 }
+
2250 m_os << std::endl;
+
2251 m_tags.pop_back();
+
2252 return *this;
+
2253 }
+
2254
+
2255 XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {
+
2256 if( !name.empty() && !attribute.empty() )
+
2257 m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+
2258 return *this;
+
2259 }
+
2260
+
2261 XmlWriter& XmlWriter::writeAttribute( std::string const& name, const char* attribute ) {
+
2262 if( !name.empty() && attribute && attribute[0] != '\0' )
+
2263 m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
+
2264 return *this;
+
2265 }
+
2266
+
2267 XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {
+
2268 m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
+
2269 return *this;
+
2270 }
+
2271
+
2272 XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) {
+
2273 if( !text.empty() ){
+
2274 bool tagWasOpen = m_tagIsOpen;
+
2275 ensureTagClosed();
+
2276 if( tagWasOpen && indent )
+
2277 m_os << m_indent;
+
2278 m_os << XmlEncode( text );
+
2279 m_needsNewline = true;
+
2280 }
+
2281 return *this;
+
2282 }
+
2283
+
2284 //XmlWriter& XmlWriter::writeComment( std::string const& text ) {
+
2285 // ensureTagClosed();
+
2286 // m_os << m_indent << "<!--" << text << "-->";
+
2287 // m_needsNewline = true;
+
2288 // return *this;
+
2289 //}
+
2290
+
2291 //void XmlWriter::writeStylesheetRef( std::string const& url ) {
+
2292 // m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
+
2293 //}
+
2294
+
2295 //XmlWriter& XmlWriter::writeBlankLine() {
+
2296 // ensureTagClosed();
+
2297 // m_os << '\n';
+
2298 // return *this;
+
2299 //}
+
2300
+
2301 void XmlWriter::ensureTagClosed() {
+
2302 if( m_tagIsOpen ) {
+
2303 m_os << ">" << std::endl;
+
2304 m_tagIsOpen = false;
+
2305 }
+
2306 }
+
2307
+
2308 void XmlWriter::writeDeclaration() {
+
2309 m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+
2310 }
+
2311
+
2312 void XmlWriter::newlineIfNecessary() {
+
2313 if( m_needsNewline ) {
+
2314 m_os << std::endl;
+
2315 m_needsNewline = false;
+
2316 }
+
2317 }
+
2318
+
2319// =================================================================================================
+
2320// End of copy-pasted code from Catch
+
2321// =================================================================================================
+
2322
+
2323 // clang-format on
+
2324
+
2325 struct XmlReporter : public IReporter
+
2326 {
+
2327 XmlWriter xml;
+
2328 DOCTEST_DECLARE_MUTEX(mutex)
+
2329
+
2330 // caching pointers/references to objects of these types - safe to do
+
2331 const ContextOptions& opt;
+
2332 const TestCaseData* tc = nullptr;
+
2333
+
2334 XmlReporter(const ContextOptions& co)
+
2335 : xml(*co.cout)
+
2336 , opt(co) {}
+
2337
+
2338 void log_contexts() {
+
2339 int num_contexts = get_num_active_contexts();
+
2340 if(num_contexts) {
+
2341 auto contexts = get_active_contexts();
+
2342 std::stringstream ss;
+
2343 for(int i = 0; i < num_contexts; ++i) {
+
2344 contexts[i]->stringify(&ss);
+
2345 xml.scopedElement("Info").writeText(ss.str());
+
2346 ss.str("");
+
2347 }
+
2348 }
+
2349 }
+
2350
+
2351 unsigned line(unsigned l) const { return opt.no_line_numbers ? 0 : l; }
+
2352
+
2353 void test_case_start_impl(const TestCaseData& in) {
+
2354 bool open_ts_tag = false;
+
2355 if(tc != nullptr) { // we have already opened a test suite
+
2356 if(std::strcmp(tc->m_test_suite, in.m_test_suite) != 0) {
+
2357 xml.endElement();
+
2358 open_ts_tag = true;
+
2359 }
+
2360 }
+
2361 else {
+
2362 open_ts_tag = true; // first test case ==> first test suite
+
2363 }
+
2364
+
2365 if(open_ts_tag) {
+
2366 xml.startElement("TestSuite");
+
2367 xml.writeAttribute("name", in.m_test_suite);
+
2368 }
+
2369
+
2370 tc = &in;
+
2371 xml.startElement("TestCase")
+
2372 .writeAttribute("name", in.m_name)
+
2373 .writeAttribute("filename", skipPathFromFilename(in.m_file.c_str()))
+
2374 .writeAttribute("line", line(in.m_line))
+
2375 .writeAttribute("description", in.m_description);
+
2376
+
2377 if(Approx(in.m_timeout) != 0)
+
2378 xml.writeAttribute("timeout", in.m_timeout);
+
2379 if(in.m_may_fail)
+
2380 xml.writeAttribute("may_fail", true);
+
2381 if(in.m_should_fail)
+
2382 xml.writeAttribute("should_fail", true);
+
2383 }
+
2384
+
2385 // =========================================================================================
+
2386 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
2387 // =========================================================================================
+
2388
+
2389 void report_query(const QueryData& in) override {
+
2390 test_run_start();
+
2391 if(opt.list_reporters) {
+
2392 for(auto& curr : getListeners())
+
2393 xml.scopedElement("Listener")
+
2394 .writeAttribute("priority", curr.first.first)
+
2395 .writeAttribute("name", curr.first.second);
+
2396 for(auto& curr : getReporters())
+
2397 xml.scopedElement("Reporter")
+
2398 .writeAttribute("priority", curr.first.first)
+
2399 .writeAttribute("name", curr.first.second);
+
2400 } else if(opt.count || opt.list_test_cases) {
+
2401 for(unsigned i = 0; i < in.num_data; ++i) {
+
2402 xml.scopedElement("TestCase").writeAttribute("name", in.data[i]->m_name)
+
2403 .writeAttribute("testsuite", in.data[i]->m_test_suite)
+
2404 .writeAttribute("filename", skipPathFromFilename(in.data[i]->m_file.c_str()))
+
2405 .writeAttribute("line", line(in.data[i]->m_line))
+
2406 .writeAttribute("skipped", in.data[i]->m_skip);
+
2407 }
+
2408 xml.scopedElement("OverallResultsTestCases")
+
2409 .writeAttribute("unskipped", in.run_stats->numTestCasesPassingFilters);
+
2410 } else if(opt.list_test_suites) {
+
2411 for(unsigned i = 0; i < in.num_data; ++i)
+
2412 xml.scopedElement("TestSuite").writeAttribute("name", in.data[i]->m_test_suite);
+
2413 xml.scopedElement("OverallResultsTestCases")
+
2414 .writeAttribute("unskipped", in.run_stats->numTestCasesPassingFilters);
+
2415 xml.scopedElement("OverallResultsTestSuites")
+
2416 .writeAttribute("unskipped", in.run_stats->numTestSuitesPassingFilters);
+
2417 }
+
2418 xml.endElement();
+
2419 }
+
2420
+
2421 void test_run_start() override {
+
2422 xml.writeDeclaration();
+
2423
+
2424 // remove .exe extension - mainly to have the same output on UNIX and Windows
+
2425 std::string binary_name = skipPathFromFilename(opt.binary_name.c_str());
+
2426#ifdef DOCTEST_PLATFORM_WINDOWS
+
2427 if(binary_name.rfind(".exe") != std::string::npos)
+
2428 binary_name = binary_name.substr(0, binary_name.length() - 4);
+
2429#endif // DOCTEST_PLATFORM_WINDOWS
+
2430
+
2431 xml.startElement("doctest").writeAttribute("binary", binary_name);
+
2432 if(opt.no_version == false)
+
2433 xml.writeAttribute("version", DOCTEST_VERSION_STR);
+
2434
+
2435 // only the consequential ones (TODO: filters)
+
2436 xml.scopedElement("Options")
+
2437 .writeAttribute("order_by", opt.order_by.c_str())
+
2438 .writeAttribute("rand_seed", opt.rand_seed)
+
2439 .writeAttribute("first", opt.first)
+
2440 .writeAttribute("last", opt.last)
+
2441 .writeAttribute("abort_after", opt.abort_after)
+
2442 .writeAttribute("subcase_filter_levels", opt.subcase_filter_levels)
+
2443 .writeAttribute("case_sensitive", opt.case_sensitive)
+
2444 .writeAttribute("no_throw", opt.no_throw)
+
2445 .writeAttribute("no_skip", opt.no_skip);
+
2446 }
+
2447
+
2448 void test_run_end(const TestRunStats& p) override {
+
2449 if(tc) // the TestSuite tag - only if there has been at least 1 test case
+
2450 xml.endElement();
+
2451
+
2452 xml.scopedElement("OverallResultsAsserts")
+
2453 .writeAttribute("successes", p.numAsserts - p.numAssertsFailed)
+
2454 .writeAttribute("failures", p.numAssertsFailed);
+
2455
+
2456 xml.startElement("OverallResultsTestCases")
+
2457 .writeAttribute("successes",
+
2458 p.numTestCasesPassingFilters - p.numTestCasesFailed)
+
2459 .writeAttribute("failures", p.numTestCasesFailed);
+
2460 if(opt.no_skipped_summary == false)
+
2461 xml.writeAttribute("skipped", p.numTestCases - p.numTestCasesPassingFilters);
+
2462 xml.endElement();
+
2463
+
2464 xml.endElement();
+
2465 }
+
2466
+
2467 void test_case_start(const TestCaseData& in) override {
+
2468 test_case_start_impl(in);
+
2469 xml.ensureTagClosed();
+
2470 }
+
2471
+
2472 void test_case_reenter(const TestCaseData&) override {}
+
2473
+
2474 void test_case_end(const CurrentTestCaseStats& st) override {
+
2475 xml.startElement("OverallResultsAsserts")
+
2476 .writeAttribute("successes",
+
2477 st.numAssertsCurrentTest - st.numAssertsFailedCurrentTest)
+
2478 .writeAttribute("failures", st.numAssertsFailedCurrentTest)
+
2479 .writeAttribute("test_case_success", st.testCaseSuccess);
+
2480 if(opt.duration)
+
2481 xml.writeAttribute("duration", st.seconds);
+
2482 if(tc->m_expected_failures)
+
2483 xml.writeAttribute("expected_failures", tc->m_expected_failures);
+
2484 xml.endElement();
+
2485
+
2486 xml.endElement();
+
2487 }
+
2488
+
2489 void test_case_exception(const TestCaseException& e) override {
+
2490 DOCTEST_LOCK_MUTEX(mutex)
+
2491
+
2492 xml.scopedElement("Exception")
+
2493 .writeAttribute("crash", e.is_crash)
+
2494 .writeText(e.error_string.c_str());
+
2495 }
+
2496
+
2497 void subcase_start(const SubcaseSignature& in) override {
+
2498 xml.startElement("SubCase")
+
2499 .writeAttribute("name", in.m_name)
+
2500 .writeAttribute("filename", skipPathFromFilename(in.m_file))
+
2501 .writeAttribute("line", line(in.m_line));
+
2502 xml.ensureTagClosed();
+
2503 }
+
2504
+
2505 void subcase_end() override { xml.endElement(); }
+
2506
+
2507 void log_assert(const AssertData& rb) override {
+
2508 if(!rb.m_failed && !opt.success)
+
2509 return;
+
2510
+
2511 DOCTEST_LOCK_MUTEX(mutex)
+
2512
+
2513 xml.startElement("Expression")
+
2514 .writeAttribute("success", !rb.m_failed)
+
2515 .writeAttribute("type", assertString(rb.m_at))
+
2516 .writeAttribute("filename", skipPathFromFilename(rb.m_file))
+
2517 .writeAttribute("line", line(rb.m_line));
+
2518
+
2519 xml.scopedElement("Original").writeText(rb.m_expr);
+
2520
+
2521 if(rb.m_threw)
+
2522 xml.scopedElement("Exception").writeText(rb.m_exception.c_str());
+
2523
+
2524 if(rb.m_at & assertType::is_throws_as)
+
2525 xml.scopedElement("ExpectedException").writeText(rb.m_exception_type);
+
2526 if(rb.m_at & assertType::is_throws_with)
+
2527 xml.scopedElement("ExpectedExceptionString").writeText(rb.m_exception_string.c_str());
+
2528 if((rb.m_at & assertType::is_normal) && !rb.m_threw)
+
2529 xml.scopedElement("Expanded").writeText(rb.m_decomp.c_str());
+
2530
+
2531 log_contexts();
+
2532
+
2533 xml.endElement();
+
2534 }
+
2535
+
2536 void log_message(const MessageData& mb) override {
+
2537 DOCTEST_LOCK_MUTEX(mutex)
+
2538
+
2539 xml.startElement("Message")
+
2540 .writeAttribute("type", failureString(mb.m_severity))
+
2541 .writeAttribute("filename", skipPathFromFilename(mb.m_file))
+
2542 .writeAttribute("line", line(mb.m_line));
+
2543
+
2544 xml.scopedElement("Text").writeText(mb.m_string.c_str());
+
2545
+
2546 log_contexts();
+
2547
+
2548 xml.endElement();
+
2549 }
+
2550
+
2551 void test_case_skipped(const TestCaseData& in) override {
+
2552 if(opt.no_skipped_summary == false) {
+
2553 test_case_start_impl(in);
+
2554 xml.writeAttribute("skipped", "true");
+
2555 xml.endElement();
+
2556 }
+
2557 }
+
2558 };
+
2559
+
2560 DOCTEST_REGISTER_REPORTER("xml", 0, XmlReporter);
+
2561
+
2562 void fulltext_log_assert_to_stream(std::ostream& s, const AssertData& rb) {
+
2563 if((rb.m_at & (assertType::is_throws_as | assertType::is_throws_with)) ==
+
2564 0)
+
2565 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << " ) "
+
2566 << Color::None;
+
2567
+
2568 if(rb.m_at & assertType::is_throws) {
+
2569 s << (rb.m_threw ? "threw as expected!" : "did NOT throw at all!") << "\n";
+
2570 } else if((rb.m_at & assertType::is_throws_as) &&
+
2571 (rb.m_at & assertType::is_throws_with)) {
+
2572 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
+
2573 << rb.m_exception_string.c_str()
+
2574 << "\", " << rb.m_exception_type << " ) " << Color::None;
+
2575 if(rb.m_threw) {
+
2576 if(!rb.m_failed) {
+
2577 s << "threw as expected!\n";
+
2578 } else {
+
2579 s << "threw a DIFFERENT exception! (contents: " << rb.m_exception << ")\n";
+
2580 }
+
2581 } else {
+
2582 s << "did NOT throw at all!\n";
+
2583 }
+
2584 } else if(rb.m_at &
+
2585 assertType::is_throws_as) {
+
2586 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", "
+
2587 << rb.m_exception_type << " ) " << Color::None
+
2588 << (rb.m_threw ? (rb.m_threw_as ? "threw as expected!" :
+
2589 "threw a DIFFERENT exception: ") :
+
2590 "did NOT throw at all!")
+
2591 << Color::Cyan << rb.m_exception << "\n";
+
2592 } else if(rb.m_at &
+
2593 assertType::is_throws_with) {
+
2594 s << Color::Cyan << assertString(rb.m_at) << "( " << rb.m_expr << ", \""
+
2595 << rb.m_exception_string.c_str()
+
2596 << "\" ) " << Color::None
+
2597 << (rb.m_threw ? (!rb.m_failed ? "threw as expected!" :
+
2598 "threw a DIFFERENT exception: ") :
+
2599 "did NOT throw at all!")
+
2600 << Color::Cyan << rb.m_exception << "\n";
+
2601 } else if(rb.m_at & assertType::is_nothrow) {
+
2602 s << (rb.m_threw ? "THREW exception: " : "didn't throw!") << Color::Cyan
+
2603 << rb.m_exception << "\n";
+
2604 } else {
+
2605 s << (rb.m_threw ? "THREW exception: " :
+
2606 (!rb.m_failed ? "is correct!\n" : "is NOT correct!\n"));
+
2607 if(rb.m_threw)
+
2608 s << rb.m_exception << "\n";
+
2609 else
+
2610 s << " values: " << assertString(rb.m_at) << "( " << rb.m_decomp << " )\n";
+
2611 }
+
2612 }
+
2613
+
2614 // TODO:
+
2615 // - log_message()
+
2616 // - respond to queries
+
2617 // - honor remaining options
+
2618 // - more attributes in tags
+
2619 struct JUnitReporter : public IReporter
+
2620 {
+
2621 XmlWriter xml;
+
2622 DOCTEST_DECLARE_MUTEX(mutex)
+
2623 Timer timer;
+
2624 std::vector<String> deepestSubcaseStackNames;
+
2625
+
2626 struct JUnitTestCaseData
+
2627 {
+
2628 static std::string getCurrentTimestamp() {
+
2629 // Beware, this is not reentrant because of backward compatibility issues
+
2630 // Also, UTC only, again because of backward compatibility (%z is C++11)
+
2631 time_t rawtime;
+
2632 std::time(&rawtime);
+
2633 auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
+
2634
+
2635 std::tm timeInfo;
+
2636#ifdef DOCTEST_PLATFORM_WINDOWS
+
2637 gmtime_s(&timeInfo, &rawtime);
+
2638#else // DOCTEST_PLATFORM_WINDOWS
+
2639 gmtime_r(&rawtime, &timeInfo);
+
2640#endif // DOCTEST_PLATFORM_WINDOWS
+
2641
+
2642 char timeStamp[timeStampSize];
+
2643 const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";
+
2644
+
2645 std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
+
2646 return std::string(timeStamp);
+
2647 }
+
2648
+
2649 struct JUnitTestMessage
+
2650 {
+
2651 JUnitTestMessage(const std::string& _message, const std::string& _type, const std::string& _details)
+
2652 : message(_message), type(_type), details(_details) {}
+
2653
+
2654 JUnitTestMessage(const std::string& _message, const std::string& _details)
+
2655 : message(_message), type(), details(_details) {}
+
2656
+
2657 std::string message, type, details;
+
2658 };
+
2659
+
2660 struct JUnitTestCase
+
2661 {
+
2662 JUnitTestCase(const std::string& _classname, const std::string& _name)
+
2663 : classname(_classname), name(_name), time(0), failures() {}
+
2664
+
2665 std::string classname, name;
+
2666 double time;
+
2667 std::vector<JUnitTestMessage> failures, errors;
+
2668 };
+
2669
+
2670 void add(const std::string& classname, const std::string& name) {
+
2671 testcases.emplace_back(classname, name);
+
2672 }
+
2673
+
2674 void appendSubcaseNamesToLastTestcase(std::vector<String> nameStack) {
+
2675 for(auto& curr: nameStack)
+
2676 if(curr.size())
+
2677 testcases.back().name += std::string("/") + curr.c_str();
+
2678 }
+
2679
+
2680 void addTime(double time) {
+
2681 if(time < 1e-4)
+
2682 time = 0;
+
2683 testcases.back().time = time;
+
2684 totalSeconds += time;
+
2685 }
+
2686
+
2687 void addFailure(const std::string& message, const std::string& type, const std::string& details) {
+
2688 testcases.back().failures.emplace_back(message, type, details);
+
2689 ++totalFailures;
+
2690 }
+
2691
+
2692 void addError(const std::string& message, const std::string& details) {
+
2693 testcases.back().errors.emplace_back(message, details);
+
2694 ++totalErrors;
+
2695 }
+
2696
+
2697 std::vector<JUnitTestCase> testcases;
+
2698 double totalSeconds = 0;
+
2699 int totalErrors = 0, totalFailures = 0;
+
2700 };
+
2701
+
2702 JUnitTestCaseData testCaseData;
+
2703
+
2704 // caching pointers/references to objects of these types - safe to do
+
2705 const ContextOptions& opt;
+
2706 const TestCaseData* tc = nullptr;
+
2707
+
2708 JUnitReporter(const ContextOptions& co)
+
2709 : xml(*co.cout)
+
2710 , opt(co) {}
+
2711
+
2712 unsigned line(unsigned l) const { return opt.no_line_numbers ? 0 : l; }
+
2713
+
2714 // =========================================================================================
+
2715 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
2716 // =========================================================================================
+
2717
+
2718 void report_query(const QueryData&) override {
+
2719 xml.writeDeclaration();
+
2720 }
+
2721
+
2722 void test_run_start() override {
+
2723 xml.writeDeclaration();
+
2724 }
+
2725
+
2726 void test_run_end(const TestRunStats& p) override {
+
2727 // remove .exe extension - mainly to have the same output on UNIX and Windows
+
2728 std::string binary_name = skipPathFromFilename(opt.binary_name.c_str());
+
2729#ifdef DOCTEST_PLATFORM_WINDOWS
+
2730 if(binary_name.rfind(".exe") != std::string::npos)
+
2731 binary_name = binary_name.substr(0, binary_name.length() - 4);
+
2732#endif // DOCTEST_PLATFORM_WINDOWS
+
2733 xml.startElement("testsuites");
+
2734 xml.startElement("testsuite").writeAttribute("name", binary_name)
+
2735 .writeAttribute("errors", testCaseData.totalErrors)
+
2736 .writeAttribute("failures", testCaseData.totalFailures)
+
2737 .writeAttribute("tests", p.numAsserts);
+
2738 if(opt.no_time_in_output == false) {
+
2739 xml.writeAttribute("time", testCaseData.totalSeconds);
+
2740 xml.writeAttribute("timestamp", JUnitTestCaseData::getCurrentTimestamp());
+
2741 }
+
2742 if(opt.no_version == false)
+
2743 xml.writeAttribute("doctest_version", DOCTEST_VERSION_STR);
+
2744
+
2745 for(const auto& testCase : testCaseData.testcases) {
+
2746 xml.startElement("testcase")
+
2747 .writeAttribute("classname", testCase.classname)
+
2748 .writeAttribute("name", testCase.name);
+
2749 if(opt.no_time_in_output == false)
+
2750 xml.writeAttribute("time", testCase.time);
+
2751 // This is not ideal, but it should be enough to mimic gtest's junit output.
+
2752 xml.writeAttribute("status", "run");
+
2753
+
2754 for(const auto& failure : testCase.failures) {
+
2755 xml.scopedElement("failure")
+
2756 .writeAttribute("message", failure.message)
+
2757 .writeAttribute("type", failure.type)
+
2758 .writeText(failure.details, false);
+
2759 }
+
2760
+
2761 for(const auto& error : testCase.errors) {
+
2762 xml.scopedElement("error")
+
2763 .writeAttribute("message", error.message)
+
2764 .writeText(error.details);
+
2765 }
+
2766
+
2767 xml.endElement();
+
2768 }
+
2769 xml.endElement();
+
2770 xml.endElement();
+
2771 }
+
2772
+
2773 void test_case_start(const TestCaseData& in) override {
+
2774 testCaseData.add(skipPathFromFilename(in.m_file.c_str()), in.m_name);
+
2775 timer.start();
+
2776 }
+
2777
+
2778 void test_case_reenter(const TestCaseData& in) override {
+
2779 testCaseData.addTime(timer.getElapsedSeconds());
+
2780 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
+
2781 deepestSubcaseStackNames.clear();
+
2782
+
2783 timer.start();
+
2784 testCaseData.add(skipPathFromFilename(in.m_file.c_str()), in.m_name);
+
2785 }
+
2786
+
2787 void test_case_end(const CurrentTestCaseStats&) override {
+
2788 testCaseData.addTime(timer.getElapsedSeconds());
+
2789 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
+
2790 deepestSubcaseStackNames.clear();
+
2791 }
+
2792
+
2793 void test_case_exception(const TestCaseException& e) override {
+
2794 DOCTEST_LOCK_MUTEX(mutex)
+
2795 testCaseData.addError("exception", e.error_string.c_str());
+
2796 }
+
2797
+
2798 void subcase_start(const SubcaseSignature& in) override {
+
2799 deepestSubcaseStackNames.push_back(in.m_name);
+
2800 }
+
2801
+
2802 void subcase_end() override {}
+
2803
+
2804 void log_assert(const AssertData& rb) override {
+
2805 if(!rb.m_failed) // report only failures & ignore the `success` option
+
2806 return;
+
2807
+
2808 DOCTEST_LOCK_MUTEX(mutex)
+
2809
+
2810 std::ostringstream os;
+
2811 os << skipPathFromFilename(rb.m_file) << (opt.gnu_file_line ? ":" : "(")
+
2812 << line(rb.m_line) << (opt.gnu_file_line ? ":" : "):") << std::endl;
+
2813
+
2814 fulltext_log_assert_to_stream(os, rb);
+
2815 log_contexts(os);
+
2816 testCaseData.addFailure(rb.m_decomp.c_str(), assertString(rb.m_at), os.str());
+
2817 }
+
2818
+
2819 void log_message(const MessageData& mb) override {
+
2820 if(mb.m_severity & assertType::is_warn) // report only failures
+
2821 return;
+
2822
+
2823 DOCTEST_LOCK_MUTEX(mutex)
+
2824
+
2825 std::ostringstream os;
+
2826 os << skipPathFromFilename(mb.m_file) << (opt.gnu_file_line ? ":" : "(")
+
2827 << line(mb.m_line) << (opt.gnu_file_line ? ":" : "):") << std::endl;
+
2828
+
2829 os << mb.m_string.c_str() << "\n";
+
2830 log_contexts(os);
+
2831
+
2832 testCaseData.addFailure(mb.m_string.c_str(),
+
2833 mb.m_severity & assertType::is_check ? "FAIL_CHECK" : "FAIL", os.str());
+
2834 }
+
2835
+
2836 void test_case_skipped(const TestCaseData&) override {}
+
2837
+
2838 void log_contexts(std::ostringstream& s) {
+
2839 int num_contexts = get_num_active_contexts();
+
2840 if(num_contexts) {
+
2841 auto contexts = get_active_contexts();
+
2842
+
2843 s << " logged: ";
+
2844 for(int i = 0; i < num_contexts; ++i) {
+
2845 s << (i == 0 ? "" : " ");
+
2846 contexts[i]->stringify(&s);
+
2847 s << std::endl;
+
2848 }
+
2849 }
+
2850 }
+
2851 };
+
2852
+
2853 DOCTEST_REGISTER_REPORTER("junit", 0, JUnitReporter);
+
2854
+
2855 struct Whitespace
+
2856 {
+
2857 int nrSpaces;
+
2858 explicit Whitespace(int nr)
+
2859 : nrSpaces(nr) {}
+
2860 };
+
2861
+
2862 std::ostream& operator<<(std::ostream& out, const Whitespace& ws) {
+
2863 if(ws.nrSpaces != 0)
+
2864 out << std::setw(ws.nrSpaces) << ' ';
+
2865 return out;
+
2866 }
+
2867
+
2868 struct ConsoleReporter : public IReporter
+
2869 {
+
2870 std::ostream& s;
+
2871 bool hasLoggedCurrentTestStart;
+
2872 std::vector<SubcaseSignature> subcasesStack;
+
2873 size_t currentSubcaseLevel;
+
2874 DOCTEST_DECLARE_MUTEX(mutex)
+
2875
+
2876 // caching pointers/references to objects of these types - safe to do
+
2877 const ContextOptions& opt;
+
2878 const TestCaseData* tc;
+
2879
+
2880 ConsoleReporter(const ContextOptions& co)
+
2881 : s(*co.cout)
+
2882 , opt(co) {}
+
2883
+
2884 ConsoleReporter(const ContextOptions& co, std::ostream& ostr)
+
2885 : s(ostr)
+
2886 , opt(co) {}
+
2887
+
2888 // =========================================================================================
+
2889 // WHAT FOLLOWS ARE HELPERS USED BY THE OVERRIDES OF THE VIRTUAL METHODS OF THE INTERFACE
+
2890 // =========================================================================================
+
2891
+
2892 void separator_to_stream() {
+
2893 s << Color::Yellow
+
2894 << "==============================================================================="
+
2895 "\n";
+
2896 }
+
2897
+
2898 const char* getSuccessOrFailString(bool success, assertType::Enum at,
+
2899 const char* success_str) {
+
2900 if(success)
+
2901 return success_str;
+
2902 return failureString(at);
+
2903 }
+
2904
+
2905 Color::Enum getSuccessOrFailColor(bool success, assertType::Enum at) {
+
2906 return success ? Color::BrightGreen :
+
2907 (at & assertType::is_warn) ? Color::Yellow : Color::Red;
+
2908 }
+
2909
+
2910 void successOrFailColoredStringToStream(bool success, assertType::Enum at,
+
2911 const char* success_str = "SUCCESS") {
+
2912 s << getSuccessOrFailColor(success, at)
+
2913 << getSuccessOrFailString(success, at, success_str) << ": ";
+
2914 }
+
2915
+
2916 void log_contexts() {
+
2917 int num_contexts = get_num_active_contexts();
+
2918 if(num_contexts) {
+
2919 auto contexts = get_active_contexts();
+
2920
+
2921 s << Color::None << " logged: ";
+
2922 for(int i = 0; i < num_contexts; ++i) {
+
2923 s << (i == 0 ? "" : " ");
+
2924 contexts[i]->stringify(&s);
+
2925 s << "\n";
+
2926 }
+
2927 }
+
2928
+
2929 s << "\n";
+
2930 }
+
2931
+
2932 // this was requested to be made virtual so users could override it
+
2933 virtual void file_line_to_stream(const char* file, int line,
+
2934 const char* tail = "") {
+
2935 s << Color::LightGrey << skipPathFromFilename(file) << (opt.gnu_file_line ? ":" : "(")
+
2936 << (opt.no_line_numbers ? 0 : line) // 0 or the real num depending on the option
+
2937 << (opt.gnu_file_line ? ":" : "):") << tail;
+
2938 }
+
2939
+
2940 void logTestStart() {
+
2941 if(hasLoggedCurrentTestStart)
+
2942 return;
+
2943
+
2944 separator_to_stream();
+
2945 file_line_to_stream(tc->m_file.c_str(), tc->m_line, "\n");
+
2946 if(tc->m_description)
+
2947 s << Color::Yellow << "DESCRIPTION: " << Color::None << tc->m_description << "\n";
+
2948 if(tc->m_test_suite && tc->m_test_suite[0] != '\0')
+
2949 s << Color::Yellow << "TEST SUITE: " << Color::None << tc->m_test_suite << "\n";
+
2950 if(strncmp(tc->m_name, " Scenario:", 11) != 0)
+
2951 s << Color::Yellow << "TEST CASE: ";
+
2952 s << Color::None << tc->m_name << "\n";
+
2953
+
2954 for(size_t i = 0; i < currentSubcaseLevel; ++i) {
+
2955 if(subcasesStack[i].m_name[0] != '\0')
+
2956 s << " " << subcasesStack[i].m_name << "\n";
+
2957 }
+
2958
+
2959 if(currentSubcaseLevel != subcasesStack.size()) {
+
2960 s << Color::Yellow << "\nDEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):\n" << Color::None;
+
2961 for(size_t i = 0; i < subcasesStack.size(); ++i) {
+
2962 if(subcasesStack[i].m_name[0] != '\0')
+
2963 s << " " << subcasesStack[i].m_name << "\n";
+
2964 }
+
2965 }
+
2966
+
2967 s << "\n";
+
2968
+
2969 hasLoggedCurrentTestStart = true;
+
2970 }
+
2971
+
2972 void printVersion() {
+
2973 if(opt.no_version == false)
+
2974 s << Color::Cyan << "[doctest] " << Color::None << "doctest version is \""
+
2975 << DOCTEST_VERSION_STR << "\"\n";
+
2976 }
+
2977
+
2978 void printIntro() {
+
2979 if(opt.no_intro == false) {
+
2980 printVersion();
+
2981 s << Color::Cyan << "[doctest] " << Color::None
+
2982 << "run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY "help\" for options\n";
+
2983 }
+
2984 }
+
2985
+
2986 void printHelp() {
+
2987 int sizePrefixDisplay = static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
+
2988 printVersion();
+
2989 // clang-format off
+
2990 s << Color::Cyan << "[doctest]\n" << Color::None;
+
2991 s << Color::Cyan << "[doctest] " << Color::None;
+
2992 s << "boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
+
2993 s << Color::Cyan << "[doctest] " << Color::None;
+
2994 s << "filter values: \"str1,str2,str3\" (comma separated strings)\n";
+
2995 s << Color::Cyan << "[doctest]\n" << Color::None;
+
2996 s << Color::Cyan << "[doctest] " << Color::None;
+
2997 s << "filters use wildcards for matching strings\n";
+
2998 s << Color::Cyan << "[doctest] " << Color::None;
+
2999 s << "something passes a filter if any of the strings in a filter matches\n";
+
3000#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
3001 s << Color::Cyan << "[doctest]\n" << Color::None;
+
3002 s << Color::Cyan << "[doctest] " << Color::None;
+
3003 s << "ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX "\" PREFIX!!!\n";
+
3004#endif
+
3005 s << Color::Cyan << "[doctest]\n" << Color::None;
+
3006 s << Color::Cyan << "[doctest] " << Color::None;
+
3007 s << "Query flags - the program quits after them. Available:\n\n";
+
3008 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "?, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY "h "
+
3009 << Whitespace(sizePrefixDisplay*0) << "prints this message\n";
+
3010 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "v, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "version "
+
3011 << Whitespace(sizePrefixDisplay*1) << "prints the version\n";
+
3012 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "c, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "count "
+
3013 << Whitespace(sizePrefixDisplay*1) << "prints the number of matching tests\n";
+
3014 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-cases "
+
3015 << Whitespace(sizePrefixDisplay*1) << "lists all matching tests by name\n";
+
3016 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-test-suites "
+
3017 << Whitespace(sizePrefixDisplay*1) << "lists all matching test suites\n";
+
3018 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "lr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "list-reporters "
+
3019 << Whitespace(sizePrefixDisplay*1) << "lists all registered reporters\n\n";
+
3020 // ================================================================================== << 79
+
3021 s << Color::Cyan << "[doctest] " << Color::None;
+
3022 s << "The available <int>/<string> options/filters are:\n\n";
+
3023 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case=<filters> "
+
3024 << Whitespace(sizePrefixDisplay*1) << "filters tests by their name\n";
+
3025 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-case-exclude=<filters> "
+
3026 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their name\n";
+
3027 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file=<filters> "
+
3028 << Whitespace(sizePrefixDisplay*1) << "filters tests by their file\n";
+
3029 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "source-file-exclude=<filters> "
+
3030 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their file\n";
+
3031 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite=<filters> "
+
3032 << Whitespace(sizePrefixDisplay*1) << "filters tests by their test suite\n";
+
3033 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "test-suite-exclude=<filters> "
+
3034 << Whitespace(sizePrefixDisplay*1) << "filters OUT tests by their test suite\n";
+
3035 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase=<filters> "
+
3036 << Whitespace(sizePrefixDisplay*1) << "filters subcases by their name\n";
+
3037 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-exclude=<filters> "
+
3038 << Whitespace(sizePrefixDisplay*1) << "filters OUT subcases by their name\n";
+
3039 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "r, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "reporters=<filters> "
+
3040 << Whitespace(sizePrefixDisplay*1) << "reporters to use (console is default)\n";
+
3041 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "o, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "out=<string> "
+
3042 << Whitespace(sizePrefixDisplay*1) << "output filename\n";
+
3043 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ob, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "order-by=<string> "
+
3044 << Whitespace(sizePrefixDisplay*1) << "how the tests should be ordered\n";
+
3045 s << Whitespace(sizePrefixDisplay*3) << " <string> - [file/suite/name/rand/none]\n";
+
3046 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "rs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "rand-seed=<int> "
+
3047 << Whitespace(sizePrefixDisplay*1) << "seed for random ordering\n";
+
3048 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "f, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "first=<int> "
+
3049 << Whitespace(sizePrefixDisplay*1) << "the first test passing the filters to\n";
+
3050 s << Whitespace(sizePrefixDisplay*3) << " execute - for range-based execution\n";
+
3051 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "l, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "last=<int> "
+
3052 << Whitespace(sizePrefixDisplay*1) << "the last test passing the filters to\n";
+
3053 s << Whitespace(sizePrefixDisplay*3) << " execute - for range-based execution\n";
+
3054 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "aa, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "abort-after=<int> "
+
3055 << Whitespace(sizePrefixDisplay*1) << "stop after <int> failed assertions\n";
+
3056 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY "subcase-filter-levels=<int> "
+
3057 << Whitespace(sizePrefixDisplay*1) << "apply filters for the first <int> levels\n";
+
3058 s << Color::Cyan << "\n[doctest] " << Color::None;
+
3059 s << "Bool options - can be used like flags and true is assumed. Available:\n\n";
+
3060 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "s, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "success=<bool> "
+
3061 << Whitespace(sizePrefixDisplay*1) << "include successful assertions in output\n";
+
3062 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "cs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "case-sensitive=<bool> "
+
3063 << Whitespace(sizePrefixDisplay*1) << "filters being treated as case sensitive\n";
+
3064 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "e, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "exit=<bool> "
+
3065 << Whitespace(sizePrefixDisplay*1) << "exits after the tests finish\n";
+
3066 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "d, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "duration=<bool> "
+
3067 << Whitespace(sizePrefixDisplay*1) << "prints the time duration of each test\n";
+
3068 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "m, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "minimal=<bool> "
+
3069 << Whitespace(sizePrefixDisplay*1) << "minimal console output (only failures)\n";
+
3070 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "q, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "quiet=<bool> "
+
3071 << Whitespace(sizePrefixDisplay*1) << "no console output\n";
+
3072 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nt, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-throw=<bool> "
+
3073 << Whitespace(sizePrefixDisplay*1) << "skips exceptions-related assert checks\n";
+
3074 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ne, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-exitcode=<bool> "
+
3075 << Whitespace(sizePrefixDisplay*1) << "returns (or exits) always with success\n";
+
3076 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-run=<bool> "
+
3077 << Whitespace(sizePrefixDisplay*1) << "skips all runtime doctest operations\n";
+
3078 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ni, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-intro=<bool> "
+
3079 << Whitespace(sizePrefixDisplay*1) << "omit the framework intro in the output\n";
+
3080 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nv, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-version=<bool> "
+
3081 << Whitespace(sizePrefixDisplay*1) << "omit the framework version in the output\n";
+
3082 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-colors=<bool> "
+
3083 << Whitespace(sizePrefixDisplay*1) << "disables colors in output\n";
+
3084 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "fc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "force-colors=<bool> "
+
3085 << Whitespace(sizePrefixDisplay*1) << "use colors even when not in a tty\n";
+
3086 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nb, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-breaks=<bool> "
+
3087 << Whitespace(sizePrefixDisplay*1) << "disables breakpoints in debuggers\n";
+
3088 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "ns, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-skip=<bool> "
+
3089 << Whitespace(sizePrefixDisplay*1) << "don't skip test cases marked as skip\n";
+
3090 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "gnu-file-line=<bool> "
+
3091 << Whitespace(sizePrefixDisplay*1) << ":n: vs (n): for line numbers in output\n";
+
3092 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-path-filenames=<bool> "
+
3093 << Whitespace(sizePrefixDisplay*1) << "only filenames and no paths in output\n";
+
3094 s << " -" DOCTEST_OPTIONS_PREFIX_DISPLAY "nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY "no-line-numbers=<bool> "
+
3095 << Whitespace(sizePrefixDisplay*1) << "0 instead of real line numbers in output\n";
+
3096 // ================================================================================== << 79
+
3097 // clang-format on
+
3098
+
3099 s << Color::Cyan << "\n[doctest] " << Color::None;
+
3100 s << "for more information visit the project documentation\n\n";
+
3101 }
+
3102
+
3103 void printRegisteredReporters() {
+
3104 printVersion();
+
3105 auto printReporters = [this] (const reporterMap& reporters, const char* type) {
+
3106 if(reporters.size()) {
+
3107 s << Color::Cyan << "[doctest] " << Color::None << "listing all registered " << type << "\n";
+
3108 for(auto& curr : reporters)
+
3109 s << "priority: " << std::setw(5) << curr.first.first
+
3110 << " name: " << curr.first.second << "\n";
+
3111 }
+
3112 };
+
3113 printReporters(getListeners(), "listeners");
+
3114 printReporters(getReporters(), "reporters");
+
3115 }
+
3116
+
3117 // =========================================================================================
+
3118 // WHAT FOLLOWS ARE OVERRIDES OF THE VIRTUAL METHODS OF THE REPORTER INTERFACE
+
3119 // =========================================================================================
+
3120
+
3121 void report_query(const QueryData& in) override {
+
3122 if(opt.version) {
+
3123 printVersion();
+
3124 } else if(opt.help) {
+
3125 printHelp();
+
3126 } else if(opt.list_reporters) {
+
3127 printRegisteredReporters();
+
3128 } else if(opt.count || opt.list_test_cases) {
+
3129 if(opt.list_test_cases) {
+
3130 s << Color::Cyan << "[doctest] " << Color::None
+
3131 << "listing all test case names\n";
+
3132 separator_to_stream();
+
3133 }
+
3134
+
3135 for(unsigned i = 0; i < in.num_data; ++i)
+
3136 s << Color::None << in.data[i]->m_name << "\n";
+
3137
+
3138 separator_to_stream();
+
3139
+
3140 s << Color::Cyan << "[doctest] " << Color::None
+
3141 << "unskipped test cases passing the current filters: "
+
3142 << g_cs->numTestCasesPassingFilters << "\n";
+
3143
+
3144 } else if(opt.list_test_suites) {
+
3145 s << Color::Cyan << "[doctest] " << Color::None << "listing all test suites\n";
+
3146 separator_to_stream();
+
3147
+
3148 for(unsigned i = 0; i < in.num_data; ++i)
+
3149 s << Color::None << in.data[i]->m_test_suite << "\n";
+
3150
+
3151 separator_to_stream();
+
3152
+
3153 s << Color::Cyan << "[doctest] " << Color::None
+
3154 << "unskipped test cases passing the current filters: "
+
3155 << g_cs->numTestCasesPassingFilters << "\n";
+
3156 s << Color::Cyan << "[doctest] " << Color::None
+
3157 << "test suites with unskipped test cases passing the current filters: "
+
3158 << g_cs->numTestSuitesPassingFilters << "\n";
+
3159 }
+
3160 }
+
3161
+
3162 void test_run_start() override {
+
3163 if(!opt.minimal)
+
3164 printIntro();
+
3165 }
+
3166
+
3167 void test_run_end(const TestRunStats& p) override {
+
3168 if(opt.minimal && p.numTestCasesFailed == 0)
+
3169 return;
+
3170
+
3171 separator_to_stream();
+
3172 s << std::dec;
+
3173
+
3174 auto totwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters, static_cast<unsigned>(p.numAsserts))) + 1)));
+
3175 auto passwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters - p.numTestCasesFailed, static_cast<unsigned>(p.numAsserts - p.numAssertsFailed))) + 1)));
+
3176 auto failwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesFailed, static_cast<unsigned>(p.numAssertsFailed))) + 1)));
+
3177 const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
+
3178 s << Color::Cyan << "[doctest] " << Color::None << "test cases: " << std::setw(totwidth)
+
3179 << p.numTestCasesPassingFilters << " | "
+
3180 << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ? Color::None :
+
3181 Color::Green)
+
3182 << std::setw(passwidth) << p.numTestCasesPassingFilters - p.numTestCasesFailed << " passed"
+
3183 << Color::None << " | " << (p.numTestCasesFailed > 0 ? Color::Red : Color::None)
+
3184 << std::setw(failwidth) << p.numTestCasesFailed << " failed" << Color::None << " |";
+
3185 if(opt.no_skipped_summary == false) {
+
3186 const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
+
3187 s << " " << (numSkipped == 0 ? Color::None : Color::Yellow) << numSkipped
+
3188 << " skipped" << Color::None;
+
3189 }
+
3190 s << "\n";
+
3191 s << Color::Cyan << "[doctest] " << Color::None << "assertions: " << std::setw(totwidth)
+
3192 << p.numAsserts << " | "
+
3193 << ((p.numAsserts == 0 || anythingFailed) ? Color::None : Color::Green)
+
3194 << std::setw(passwidth) << (p.numAsserts - p.numAssertsFailed) << " passed" << Color::None
+
3195 << " | " << (p.numAssertsFailed > 0 ? Color::Red : Color::None) << std::setw(failwidth)
+
3196 << p.numAssertsFailed << " failed" << Color::None << " |\n";
+
3197 s << Color::Cyan << "[doctest] " << Color::None
+
3198 << "Status: " << (p.numTestCasesFailed > 0 ? Color::Red : Color::Green)
+
3199 << ((p.numTestCasesFailed > 0) ? "FAILURE!" : "SUCCESS!") << Color::None << std::endl;
+
3200 }
+
3201
+
3202 void test_case_start(const TestCaseData& in) override {
+
3203 hasLoggedCurrentTestStart = false;
+
3204 tc = &in;
+
3205 subcasesStack.clear();
+
3206 currentSubcaseLevel = 0;
+
3207 }
+
3208
+
3209 void test_case_reenter(const TestCaseData&) override {
+
3210 subcasesStack.clear();
+
3211 }
+
3212
+
3213 void test_case_end(const CurrentTestCaseStats& st) override {
+
3214 if(tc->m_no_output)
+
3215 return;
+
3216
+
3217 // log the preamble of the test case only if there is something
+
3218 // else to print - something other than that an assert has failed
+
3219 if(opt.duration ||
+
3220 (st.failure_flags && st.failure_flags != static_cast<int>(TestCaseFailureReason::AssertFailure)))
+
3221 logTestStart();
+
3222
+
3223 if(opt.duration)
+
3224 s << Color::None << std::setprecision(6) << std::fixed << st.seconds
+
3225 << " s: " << tc->m_name << "\n";
+
3226
+
3227 if(st.failure_flags & TestCaseFailureReason::Timeout)
+
3228 s << Color::Red << "Test case exceeded time limit of " << std::setprecision(6)
+
3229 << std::fixed << tc->m_timeout << "!\n";
+
3230
+
3231 if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedButDidnt) {
+
3232 s << Color::Red << "Should have failed but didn't! Marking it as failed!\n";
+
3233 } else if(st.failure_flags & TestCaseFailureReason::ShouldHaveFailedAndDid) {
+
3234 s << Color::Yellow << "Failed as expected so marking it as not failed\n";
+
3235 } else if(st.failure_flags & TestCaseFailureReason::CouldHaveFailedAndDid) {
+
3236 s << Color::Yellow << "Allowed to fail so marking it as not failed\n";
+
3237 } else if(st.failure_flags & TestCaseFailureReason::DidntFailExactlyNumTimes) {
+
3238 s << Color::Red << "Didn't fail exactly " << tc->m_expected_failures
+
3239 << " times so marking it as failed!\n";
+
3240 } else if(st.failure_flags & TestCaseFailureReason::FailedExactlyNumTimes) {
+
3241 s << Color::Yellow << "Failed exactly " << tc->m_expected_failures
+
3242 << " times as expected so marking it as not failed!\n";
+
3243 }
+
3244 if(st.failure_flags & TestCaseFailureReason::TooManyFailedAsserts) {
+
3245 s << Color::Red << "Aborting - too many failed asserts!\n";
+
3246 }
+
3247 s << Color::None; // lgtm [cpp/useless-expression]
+
3248 }
+
3249
+
3250 void test_case_exception(const TestCaseException& e) override {
+
3251 DOCTEST_LOCK_MUTEX(mutex)
+
3252 if(tc->m_no_output)
+
3253 return;
+
3254
+
3255 logTestStart();
+
3256
+
3257 file_line_to_stream(tc->m_file.c_str(), tc->m_line, " ");
+
3258 successOrFailColoredStringToStream(false, e.is_crash ? assertType::is_require :
+
3259 assertType::is_check);
+
3260 s << Color::Red << (e.is_crash ? "test case CRASHED: " : "test case THREW exception: ")
+
3261 << Color::Cyan << e.error_string << "\n";
+
3262
+
3263 int num_stringified_contexts = get_num_stringified_contexts();
+
3264 if(num_stringified_contexts) {
+
3265 auto stringified_contexts = get_stringified_contexts();
+
3266 s << Color::None << " logged: ";
+
3267 for(int i = num_stringified_contexts; i > 0; --i) {
+
3268 s << (i == num_stringified_contexts ? "" : " ")
+
3269 << stringified_contexts[i - 1] << "\n";
+
3270 }
+
3271 }
+
3272 s << "\n" << Color::None;
+
3273 }
+
3274
+
3275 void subcase_start(const SubcaseSignature& subc) override {
+
3276 subcasesStack.push_back(subc);
+
3277 ++currentSubcaseLevel;
+
3278 hasLoggedCurrentTestStart = false;
+
3279 }
+
3280
+
3281 void subcase_end() override {
+
3282 --currentSubcaseLevel;
+
3283 hasLoggedCurrentTestStart = false;
+
3284 }
+
3285
+
3286 void log_assert(const AssertData& rb) override {
+
3287 if((!rb.m_failed && !opt.success) || tc->m_no_output)
+
3288 return;
+
3289
+
3290 DOCTEST_LOCK_MUTEX(mutex)
+
3291
+
3292 logTestStart();
+
3293
+
3294 file_line_to_stream(rb.m_file, rb.m_line, " ");
+
3295 successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
+
3296
+
3297 fulltext_log_assert_to_stream(s, rb);
+
3298
+
3299 log_contexts();
+
3300 }
+
3301
+
3302 void log_message(const MessageData& mb) override {
+
3303 if(tc->m_no_output)
+
3304 return;
+
3305
+
3306 DOCTEST_LOCK_MUTEX(mutex)
+
3307
+
3308 logTestStart();
+
3309
+
3310 file_line_to_stream(mb.m_file, mb.m_line, " ");
+
3311 s << getSuccessOrFailColor(false, mb.m_severity)
+
3312 << getSuccessOrFailString(mb.m_severity & assertType::is_warn, mb.m_severity,
+
3313 "MESSAGE") << ": ";
+
3314 s << Color::None << mb.m_string << "\n";
+
3315 log_contexts();
+
3316 }
+
3317
+
3318 void test_case_skipped(const TestCaseData&) override {}
+
3319 };
+
3320
+
3321 DOCTEST_REGISTER_REPORTER("console", 0, ConsoleReporter);
+
3322
+
3323#ifdef DOCTEST_PLATFORM_WINDOWS
+
3324 struct DebugOutputWindowReporter : public ConsoleReporter
+
3325 {
+
3326 DOCTEST_THREAD_LOCAL static std::ostringstream oss;
+
3327
+
3328 DebugOutputWindowReporter(const ContextOptions& co)
+
3329 : ConsoleReporter(co, oss) {}
+
3330
+
3331#define DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(func, type, arg) \
+
3332 void func(type arg) override { \
+
3333 bool with_col = g_no_colors; \
+
3334 g_no_colors = false; \
+
3335 ConsoleReporter::func(arg); \
+
3336 if(oss.tellp() != std::streampos{}) { \
+
3337 DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str()); \
+
3338 oss.str(""); \
+
3339 } \
+
3340 g_no_colors = with_col; \
+
3341 }
+
3342
+
3343 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_start, DOCTEST_EMPTY, DOCTEST_EMPTY)
+
3344 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_end, const TestRunStats&, in)
+
3345 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_start, const TestCaseData&, in)
+
3346 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_reenter, const TestCaseData&, in)
+
3347 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_end, const CurrentTestCaseStats&, in)
+
3348 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_exception, const TestCaseException&, in)
+
3349 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_start, const SubcaseSignature&, in)
+
3350 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_end, DOCTEST_EMPTY, DOCTEST_EMPTY)
+
3351 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_assert, const AssertData&, in)
+
3352 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_message, const MessageData&, in)
+
3353 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_skipped, const TestCaseData&, in)
+
3354 };
+
3355
+
3356 DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
+
3357#endif // DOCTEST_PLATFORM_WINDOWS
+
3358
+
3359 // the implementation of parseOption()
+
3360 bool parseOptionImpl(int argc, const char* const* argv, const char* pattern, String* value) {
+
3361 // going from the end to the beginning and stopping on the first occurrence from the end
+
3362 for(int i = argc; i > 0; --i) {
+
3363 auto index = i - 1;
+
3364 auto temp = std::strstr(argv[index], pattern);
+
3365 if(temp && (value || strlen(temp) == strlen(pattern))) {
+
3366 // eliminate matches in which the chars before the option are not '-'
+
3367 bool noBadCharsFound = true;
+
3368 auto curr = argv[index];
+
3369 while(curr != temp) {
+
3370 if(*curr++ != '-') {
+
3371 noBadCharsFound = false;
+
3372 break;
+
3373 }
+
3374 }
+
3375 if(noBadCharsFound && argv[index][0] == '-') {
+
3376 if(value) {
+
3377 // parsing the value of an option
+
3378 temp += strlen(pattern);
+
3379 const unsigned len = strlen(temp);
+
3380 if(len) {
+
3381 *value = temp;
+
3382 return true;
+
3383 }
+
3384 } else {
+
3385 // just a flag - no value
+
3386 return true;
+
3387 }
+
3388 }
+
3389 }
+
3390 }
+
3391 return false;
+
3392 }
+
3393
+
3394 // parses an option and returns the string after the '=' character
+
3395 bool parseOption(int argc, const char* const* argv, const char* pattern, String* value = nullptr,
+
3396 const String& defaultVal = String()) {
+
3397 if(value)
+
3398 *value = defaultVal;
+
3399#ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
3400 // offset (normally 3 for "dt-") to skip prefix
+
3401 if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), value))
+
3402 return true;
+
3403#endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
+
3404 return parseOptionImpl(argc, argv, pattern, value);
+
3405 }
+
3406
+
3407 // locates a flag on the command line
+
3408 bool parseFlag(int argc, const char* const* argv, const char* pattern) {
+
3409 return parseOption(argc, argv, pattern);
+
3410 }
+
3411
+
3412 // parses a comma separated list of words after a pattern in one of the arguments in argv
+
3413 bool parseCommaSepArgs(int argc, const char* const* argv, const char* pattern,
+
3414 std::vector<String>& res) {
+
3415 String filtersString;
+
3416 if(parseOption(argc, argv, pattern, &filtersString)) {
+
3417 // tokenize with "," as a separator, unless escaped with backslash
+
3418 std::ostringstream s;
+
3419 auto flush = [&s, &res]() {
+
3420 auto string = s.str();
+
3421 if(string.size() > 0) {
+
3422 res.push_back(string.c_str());
+
3423 }
+
3424 s.str("");
+
3425 };
+
3426
+
3427 bool seenBackslash = false;
+
3428 const char* current = filtersString.c_str();
+
3429 const char* end = current + strlen(current);
+
3430 while(current != end) {
+
3431 char character = *current++;
+
3432 if(seenBackslash) {
+
3433 seenBackslash = false;
+
3434 if(character == ',' || character == '\\') {
+
3435 s.put(character);
+
3436 continue;
+
3437 }
+
3438 s.put('\\');
+
3439 }
+
3440 if(character == '\\') {
+
3441 seenBackslash = true;
+
3442 } else if(character == ',') {
+
3443 flush();
+
3444 } else {
+
3445 s.put(character);
+
3446 }
+
3447 }
+
3448
+
3449 if(seenBackslash) {
+
3450 s.put('\\');
+
3451 }
+
3452 flush();
+
3453 return true;
+
3454 }
+
3455 return false;
+
3456 }
+
3457
+
3458 enum optionType
+
3459 {
+
3460 option_bool,
+
3461 option_int
+
3462 };
+
3463
+
3464 // parses an int/bool option from the command line
+
3465 bool parseIntOption(int argc, const char* const* argv, const char* pattern, optionType type,
+
3466 int& res) {
+
3467 String parsedValue;
+
3468 if(!parseOption(argc, argv, pattern, &parsedValue))
+
3469 return false;
+
3470
+
3471 if(type) {
+
3472 // integer
+
3473 // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
+
3474 int theInt = std::atoi(parsedValue.c_str());
+
3475 if (theInt != 0) {
+
3476 res = theInt;
+
3477 return true;
+
3478 }
+
3479 } else {
+
3480 // boolean
+
3481 const char positive[][5] = { "1", "true", "on", "yes" }; // 5 - strlen("true") + 1
+
3482 const char negative[][6] = { "0", "false", "off", "no" }; // 6 - strlen("false") + 1
+
3483
+
3484 // if the value matches any of the positive/negative possibilities
+
3485 for (unsigned i = 0; i < 4; i++) {
+
3486 if (parsedValue.compare(positive[i], true) == 0) {
+
3487 res = 1;
+
3488 return true;
+
3489 }
+
3490 if (parsedValue.compare(negative[i], true) == 0) {
+
3491 res = 0;
+
3492 return true;
+
3493 }
+
3494 }
+
3495 }
+
3496 return false;
+
3497 }
+
3498} // namespace
+
3499
+
3500Context::Context(int argc, const char* const* argv)
+
3501 : p(new detail::ContextState) {
+
3502 parseArgs(argc, argv, true);
+
3503 if(argc)
+
3504 p->binary_name = argv[0];
+
3505}
+
3506
+
3507Context::~Context() {
+
3508 if(g_cs == p)
+
3509 g_cs = nullptr;
+
3510 delete p;
+
3511}
+
3512
+
3513void Context::applyCommandLine(int argc, const char* const* argv) {
+
3514 parseArgs(argc, argv);
+
3515 if(argc)
+
3516 p->binary_name = argv[0];
+
3517}
+
3518
+
3519// parses args
+
3520void Context::parseArgs(int argc, const char* const* argv, bool withDefaults) {
+
3521 using namespace detail;
+
3522
+
3523 // clang-format off
+
3524 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file=", p->filters[0]);
+
3525 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sf=", p->filters[0]);
+
3526 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "source-file-exclude=",p->filters[1]);
+
3527 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sfe=", p->filters[1]);
+
3528 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite=", p->filters[2]);
+
3529 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ts=", p->filters[2]);
+
3530 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-suite-exclude=", p->filters[3]);
+
3531 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tse=", p->filters[3]);
+
3532 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case=", p->filters[4]);
+
3533 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tc=", p->filters[4]);
+
3534 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "test-case-exclude=", p->filters[5]);
+
3535 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "tce=", p->filters[5]);
+
3536 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase=", p->filters[6]);
+
3537 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sc=", p->filters[6]);
+
3538 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "subcase-exclude=", p->filters[7]);
+
3539 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "sce=", p->filters[7]);
+
3540 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "reporters=", p->filters[8]);
+
3541 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "r=", p->filters[8]);
+
3542 // clang-format on
+
3543
+
3544 int intRes = 0;
+
3545 String strRes;
+
3546
+
3547#define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default) \
+
3548 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) || \
+
3549 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes)) \
+
3550 p->var = static_cast<bool>(intRes); \
+
3551 else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) || \
+
3552 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname)) \
+
3553 p->var = true; \
+
3554 else if(withDefaults) \
+
3555 p->var = default
+
3556
+
3557#define DOCTEST_PARSE_INT_OPTION(name, sname, var, default) \
+
3558 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) || \
+
3559 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes)) \
+
3560 p->var = intRes; \
+
3561 else if(withDefaults) \
+
3562 p->var = default
+
3563
+
3564#define DOCTEST_PARSE_STR_OPTION(name, sname, var, default) \
+
3565 if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", &strRes, default) || \
+
3566 parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", &strRes, default) || \
+
3567 withDefaults) \
+
3568 p->var = strRes
+
3569
+
3570 // clang-format off
+
3571 DOCTEST_PARSE_STR_OPTION("out", "o", out, "");
+
3572 DOCTEST_PARSE_STR_OPTION("order-by", "ob", order_by, "file");
+
3573 DOCTEST_PARSE_INT_OPTION("rand-seed", "rs", rand_seed, 0);
+
3574
+
3575 DOCTEST_PARSE_INT_OPTION("first", "f", first, 0);
+
3576 DOCTEST_PARSE_INT_OPTION("last", "l", last, UINT_MAX);
+
3577
+
3578 DOCTEST_PARSE_INT_OPTION("abort-after", "aa", abort_after, 0);
+
3579 DOCTEST_PARSE_INT_OPTION("subcase-filter-levels", "scfl", subcase_filter_levels, INT_MAX);
+
3580
+
3581 DOCTEST_PARSE_AS_BOOL_OR_FLAG("success", "s", success, false);
+
3582 DOCTEST_PARSE_AS_BOOL_OR_FLAG("case-sensitive", "cs", case_sensitive, false);
+
3583 DOCTEST_PARSE_AS_BOOL_OR_FLAG("exit", "e", exit, false);
+
3584 DOCTEST_PARSE_AS_BOOL_OR_FLAG("duration", "d", duration, false);
+
3585 DOCTEST_PARSE_AS_BOOL_OR_FLAG("minimal", "m", minimal, false);
+
3586 DOCTEST_PARSE_AS_BOOL_OR_FLAG("quiet", "q", quiet, false);
+
3587 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-throw", "nt", no_throw, false);
+
3588 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-exitcode", "ne", no_exitcode, false);
+
3589 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-run", "nr", no_run, false);
+
3590 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-intro", "ni", no_intro, false);
+
3591 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-version", "nv", no_version, false);
+
3592 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-colors", "nc", no_colors, false);
+
3593 DOCTEST_PARSE_AS_BOOL_OR_FLAG("force-colors", "fc", force_colors, false);
+
3594 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-breaks", "nb", no_breaks, false);
+
3595 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skip", "ns", no_skip, false);
+
3596 DOCTEST_PARSE_AS_BOOL_OR_FLAG("gnu-file-line", "gfl", gnu_file_line, !bool(DOCTEST_MSVC));
+
3597 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-path-filenames", "npf", no_path_in_filenames, false);
+
3598 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-line-numbers", "nln", no_line_numbers, false);
+
3599 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-debug-output", "ndo", no_debug_output, false);
+
3600 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-skipped-summary", "nss", no_skipped_summary, false);
+
3601 DOCTEST_PARSE_AS_BOOL_OR_FLAG("no-time-in-output", "ntio", no_time_in_output, false);
+
3602 // clang-format on
+
3603
+
3604 if(withDefaults) {
+
3605 p->help = false;
+
3606 p->version = false;
+
3607 p->count = false;
+
3608 p->list_test_cases = false;
+
3609 p->list_test_suites = false;
+
3610 p->list_reporters = false;
+
3611 }
+
3612 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "help") ||
+
3613 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "h") ||
+
3614 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "?")) {
+
3615 p->help = true;
+
3616 p->exit = true;
+
3617 }
+
3618 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "version") ||
+
3619 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "v")) {
+
3620 p->version = true;
+
3621 p->exit = true;
+
3622 }
+
3623 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "count") ||
+
3624 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "c")) {
+
3625 p->count = true;
+
3626 p->exit = true;
+
3627 }
+
3628 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-cases") ||
+
3629 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "ltc")) {
+
3630 p->list_test_cases = true;
+
3631 p->exit = true;
+
3632 }
+
3633 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-test-suites") ||
+
3634 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lts")) {
+
3635 p->list_test_suites = true;
+
3636 p->exit = true;
+
3637 }
+
3638 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "list-reporters") ||
+
3639 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX "lr")) {
+
3640 p->list_reporters = true;
+
3641 p->exit = true;
+
3642 }
+
3643}
+
3644
+
3645// allows the user to add procedurally to the filters from the command line
+
3646void Context::addFilter(const char* filter, const char* value) { setOption(filter, value); }
+
3647
+
3648// allows the user to clear all filters from the command line
+
3649void Context::clearFilters() {
+
3650 for(auto& curr : p->filters)
+
3651 curr.clear();
+
3652}
+
3653
+
3654// allows the user to override procedurally the bool options from the command line
+
3655void Context::setOption(const char* option, bool value) {
+
3656 setOption(option, value ? "true" : "false");
+
3657}
+
3658
+
3659// allows the user to override procedurally the int options from the command line
+
3660void Context::setOption(const char* option, int value) {
+
3661 setOption(option, toString(value).c_str());
+
3662}
+
3663
+
3664// allows the user to override procedurally the string options from the command line
+
3665void Context::setOption(const char* option, const char* value) {
+
3666 auto argv = String("-") + option + "=" + value;
+
3667 auto lvalue = argv.c_str();
+
3668 parseArgs(1, &lvalue);
+
3669}
+
3670
+
3671// users should query this in their main() and exit the program if true
+
3672bool Context::shouldExit() { return p->exit; }
+
3673
+
3674void Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }
+
3675
+
3676void Context::setAssertHandler(detail::assert_handler ah) { p->ah = ah; }
+
3677
+
3678void Context::setCout(std::ostream* out) { p->cout = out; }
+
3679
+
3680static class DiscardOStream : public std::ostream
+
3681{
+
3682private:
+
3683 class : public std::streambuf
+
3684 {
+
3685 private:
+
3686 // allowing some buffering decreases the amount of calls to overflow
+
3687 char buf[1024];
+
3688
+
3689 protected:
+
3690 std::streamsize xsputn(const char_type*, std::streamsize count) override { return count; }
+
3691
+
3692 int_type overflow(int_type ch) override {
+
3693 setp(std::begin(buf), std::end(buf));
+
3694 return traits_type::not_eof(ch);
+
3695 }
+
3696 } discardBuf;
+
3697
+
3698public:
+
3699 DiscardOStream()
+
3700 : std::ostream(&discardBuf) {}
+
3701} discardOut;
+
3702
+
3703// the main function that does all the filtering and test running
+
3704int Context::run() {
+
3705 using namespace detail;
+
3706
+
3707 // save the old context state in case such was setup - for using asserts out of a testing context
+
3708 auto old_cs = g_cs;
+
3709 // this is the current contest
+
3710 g_cs = p;
+
3711 is_running_in_test = true;
+
3712
+
3713 g_no_colors = p->no_colors;
+
3714 p->resetRunData();
+
3715
+
3716 std::fstream fstr;
+
3717 if(p->cout == nullptr) {
+
3718 if(p->quiet) {
+
3719 p->cout = &discardOut;
+
3720 } else if(p->out.size()) {
+
3721 // to a file if specified
+
3722 fstr.open(p->out.c_str(), std::fstream::out);
+
3723 p->cout = &fstr;
+
3724 } else {
+
3725#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3726 // stdout by default
+
3727 p->cout = &std::cout;
+
3728#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3729 return EXIT_FAILURE;
+
3730#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM
+
3731 }
+
3732 }
+
3733
+
3734 FatalConditionHandler::allocateAltStackMem();
+
3735
+
3736 auto cleanup_and_return = [&]() {
+
3737 FatalConditionHandler::freeAltStackMem();
+
3738
+
3739 if(fstr.is_open())
+
3740 fstr.close();
+
3741
+
3742 // restore context
+
3743 g_cs = old_cs;
+
3744 is_running_in_test = false;
+
3745
+
3746 // we have to free the reporters which were allocated when the run started
+
3747 for(auto& curr : p->reporters_currently_used)
+
3748 delete curr;
+
3749 p->reporters_currently_used.clear();
+
3750
+
3751 if(p->numTestCasesFailed && !p->no_exitcode)
+
3752 return EXIT_FAILURE;
+
3753 return EXIT_SUCCESS;
+
3754 };
+
3755
+
3756 // setup default reporter if none is given through the command line
+
3757 if(p->filters[8].empty())
+
3758 p->filters[8].push_back("console");
+
3759
+
3760 // check to see if any of the registered reporters has been selected
+
3761 for(auto& curr : getReporters()) {
+
3762 if(matchesAny(curr.first.second.c_str(), p->filters[8], false, p->case_sensitive))
+
3763 p->reporters_currently_used.push_back(curr.second(*g_cs));
+
3764 }
+
3765
+
3766 // TODO: check if there is nothing in reporters_currently_used
+
3767
+
3768 // prepend all listeners
+
3769 for(auto& curr : getListeners())
+
3770 p->reporters_currently_used.insert(p->reporters_currently_used.begin(), curr.second(*g_cs));
+
3771
+
3772#ifdef DOCTEST_PLATFORM_WINDOWS
+
3773 if(isDebuggerActive() && p->no_debug_output == false)
+
3774 p->reporters_currently_used.push_back(new DebugOutputWindowReporter(*g_cs));
+
3775#endif // DOCTEST_PLATFORM_WINDOWS
+
3776
+
3777 // handle version, help and no_run
+
3778 if(p->no_run || p->version || p->help || p->list_reporters) {
+
3779 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, QueryData());
+
3780
+
3781 return cleanup_and_return();
+
3782 }
+
3783
+
3784 std::vector<const TestCase*> testArray;
+
3785 for(auto& curr : getRegisteredTests())
+
3786 testArray.push_back(&curr);
+
3787 p->numTestCases = testArray.size();
+
3788
+
3789 // sort the collected records
+
3790 if(!testArray.empty()) {
+
3791 if(p->order_by.compare("file", true) == 0) {
+
3792 std::sort(testArray.begin(), testArray.end(), fileOrderComparator);
+
3793 } else if(p->order_by.compare("suite", true) == 0) {
+
3794 std::sort(testArray.begin(), testArray.end(), suiteOrderComparator);
+
3795 } else if(p->order_by.compare("name", true) == 0) {
+
3796 std::sort(testArray.begin(), testArray.end(), nameOrderComparator);
+
3797 } else if(p->order_by.compare("rand", true) == 0) {
+
3798 std::srand(p->rand_seed);
+
3799
+
3800 // random_shuffle implementation
+
3801 const auto first = &testArray[0];
+
3802 for(size_t i = testArray.size() - 1; i > 0; --i) {
+
3803 int idxToSwap = std::rand() % (i + 1);
+
3804
+
3805 const auto temp = first[i];
+
3806
+
3807 first[i] = first[idxToSwap];
+
3808 first[idxToSwap] = temp;
+
3809 }
+
3810 } else if(p->order_by.compare("none", true) == 0) {
+
3811 // means no sorting - beneficial for death tests which call into the executable
+
3812 // with a specific test case in mind - we don't want to slow down the startup times
+
3813 }
+
3814 }
+
3815
+
3816 std::set<String> testSuitesPassingFilt;
+
3817
+
3818 bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
+
3819 std::vector<const TestCaseData*> queryResults;
+
3820
+
3821 if(!query_mode)
+
3822 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start, DOCTEST_EMPTY);
+
3823
+
3824 // invoke the registered functions if they match the filter criteria (or just count them)
+
3825 for(auto& curr : testArray) {
+
3826 const auto& tc = *curr;
+
3827
+
3828 bool skip_me = false;
+
3829 if(tc.m_skip && !p->no_skip)
+
3830 skip_me = true;
+
3831
+
3832 if(!matchesAny(tc.m_file.c_str(), p->filters[0], true, p->case_sensitive))
+
3833 skip_me = true;
+
3834 if(matchesAny(tc.m_file.c_str(), p->filters[1], false, p->case_sensitive))
+
3835 skip_me = true;
+
3836 if(!matchesAny(tc.m_test_suite, p->filters[2], true, p->case_sensitive))
+
3837 skip_me = true;
+
3838 if(matchesAny(tc.m_test_suite, p->filters[3], false, p->case_sensitive))
+
3839 skip_me = true;
+
3840 if(!matchesAny(tc.m_name, p->filters[4], true, p->case_sensitive))
+
3841 skip_me = true;
+
3842 if(matchesAny(tc.m_name, p->filters[5], false, p->case_sensitive))
+
3843 skip_me = true;
+
3844
+
3845 if(!skip_me)
+
3846 p->numTestCasesPassingFilters++;
+
3847
+
3848 // skip the test if it is not in the execution range
+
3849 if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
+
3850 (p->first > p->numTestCasesPassingFilters))
+
3851 skip_me = true;
+
3852
+
3853 if(skip_me) {
+
3854 if(!query_mode)
+
3855 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
+
3856 continue;
+
3857 }
+
3858
+
3859 // do not execute the test if we are to only count the number of filter passing tests
+
3860 if(p->count)
+
3861 continue;
+
3862
+
3863 // print the name of the test and don't execute it
+
3864 if(p->list_test_cases) {
+
3865 queryResults.push_back(&tc);
+
3866 continue;
+
3867 }
+
3868
+
3869 // print the name of the test suite if not done already and don't execute it
+
3870 if(p->list_test_suites) {
+
3871 if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] != '\0') {
+
3872 queryResults.push_back(&tc);
+
3873 testSuitesPassingFilt.insert(tc.m_test_suite);
+
3874 p->numTestSuitesPassingFilters++;
+
3875 }
+
3876 continue;
+
3877 }
+
3878
+
3879 // execute the test if it passes all the filtering
+
3880 {
+
3881 p->currentTest = &tc;
+
3882
+
3883 p->failure_flags = TestCaseFailureReason::None;
+
3884 p->seconds = 0;
+
3885
+
3886 // reset atomic counters
+
3887 p->numAssertsFailedCurrentTest_atomic = 0;
+
3888 p->numAssertsCurrentTest_atomic = 0;
+
3889
+
3890 p->fullyTraversedSubcases.clear();
+
3891
+
3892 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
+
3893
+
3894 p->timer.start();
+
3895
+
3896 bool run_test = true;
+
3897
+
3898 do {
+
3899 // reset some of the fields for subcases (except for the set of fully passed ones)
+
3900 p->reachedLeaf = false;
+
3901 // May not be empty if previous subcase exited via exception.
+
3902 p->subcaseStack.clear();
+
3903 p->currentSubcaseDepth = 0;
+
3904
+
3905 p->shouldLogCurrentException = true;
+
3906
+
3907 // reset stuff for logging with INFO()
+
3908 p->stringifiedContexts.clear();
+
3909
+
3910#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
3911 try {
+
3912#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
3913// MSVC 2015 diagnoses fatalConditionHandler as unused (because reset() is a static method)
+
3914DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4101) // unreferenced local variable
+
3915 FatalConditionHandler fatalConditionHandler; // Handle signals
+
3916 // execute the test
+
3917 tc.m_test();
+
3918 fatalConditionHandler.reset();
+
3919DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
3920#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
3921 } catch(const TestFailureException&) {
+
3922 p->failure_flags |= TestCaseFailureReason::AssertFailure;
+
3923 } catch(...) {
+
3924 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception,
+
3925 {translateActiveException(), false});
+
3926 p->failure_flags |= TestCaseFailureReason::Exception;
+
3927 }
+
3928#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
3929
+
3930 // exit this loop if enough assertions have failed - even if there are more subcases
+
3931 if(p->abort_after > 0 &&
+
3932 p->numAssertsFailed + p->numAssertsFailedCurrentTest_atomic >= p->abort_after) {
+
3933 run_test = false;
+
3934 p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts;
+
3935 }
+
3936
+
3937 if(!p->nextSubcaseStack.empty() && run_test)
+
3938 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc);
+
3939 if(p->nextSubcaseStack.empty())
+
3940 run_test = false;
+
3941 } while(run_test);
+
3942
+
3943 p->finalizeTestCaseData();
+
3944
+
3945 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
+
3946
+
3947 p->currentTest = nullptr;
+
3948
+
3949 // stop executing tests if enough assertions have failed
+
3950 if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
+
3951 break;
+
3952 }
+
3953 }
+
3954
+
3955 if(!query_mode) {
+
3956 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
+
3957 } else {
+
3958 QueryData qdata;
+
3959 qdata.run_stats = g_cs;
+
3960 qdata.data = queryResults.data();
+
3961 qdata.num_data = unsigned(queryResults.size());
+
3962 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);
+
3963 }
+
3964
+
3965 return cleanup_and_return();
+
3966}
+
3967
+
3968DOCTEST_DEFINE_INTERFACE(IReporter)
+
3969
+
3970int IReporter::get_num_active_contexts() { return detail::g_infoContexts.size(); }
+
3971const IContextScope* const* IReporter::get_active_contexts() {
+
3972 return get_num_active_contexts() ? &detail::g_infoContexts[0] : nullptr;
+
3973}
+
3974
+
3975int IReporter::get_num_stringified_contexts() { return detail::g_cs->stringifiedContexts.size(); }
+
3976const String* IReporter::get_stringified_contexts() {
+
3977 return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] : nullptr;
+
3978}
+
3979
+
3980namespace detail {
+
3981 void registerReporterImpl(const char* name, int priority, reporterCreatorFunc c, bool isReporter) {
+
3982 if(isReporter)
+
3983 getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
+
3984 else
+
3985 getListeners().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
+
3986 }
+
3987} // namespace detail
+
3988
+
3989} // namespace doctest
+
3990
+
3991#endif // DOCTEST_CONFIG_DISABLE
+
3992
+
3993#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
3994DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4007) // 'function' : must be 'attribute' - see issue #182
+
3995int main(int argc, char** argv) { return doctest::Context(argc, argv).run(); }
+
3996DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
3997#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
3998
+
3999DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
4000DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
4001DOCTEST_GCC_SUPPRESS_WARNING_POP
+
4002
+
4003DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
+
4004
+
4005#endif // DOCTEST_LIBRARY_IMPLEMENTATION
+
4006#endif // DOCTEST_CONFIG_IMPLEMENT
+
4007
+
4008#ifdef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
4009#undef WIN32_LEAN_AND_MEAN
+
4010#undef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
4011#endif // DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN
+
4012
+
4013#ifdef DOCTEST_UNDEF_NOMINMAX
+
4014#undef NOMINMAX
+
4015#undef DOCTEST_UNDEF_NOMINMAX
+
4016#endif // DOCTEST_UNDEF_NOMINMAX
+
Definition doctest.h:1965
+
Definition doctest.cpp:1428
+
Definition doctest.cpp:350
+
Definition doctest.h:536
+
Definition doctest.h:530
+
Definition how_subcases_work.cpp:32
+
Definition doctest.h:1210
+
Definition doctest.h:825
+
OCLINT too many fields.
Definition doctest.h:894
+
Definition doctest.h:2018
+
Definition doctest.h:2033
+
Definition doctest.cpp:422
+
void react()
Definition doctest.cpp:1931
+
bool log()
Definition doctest.cpp:1842
+
Definition doctest.h:1592
+
Definition doctest.cpp:312
+
+ + + + diff --git a/git-main/doctest__fwd_8h_source.html b/git-main/doctest__fwd_8h_source.html new file mode 100644 index 0000000..b046822 --- /dev/null +++ b/git-main/doctest__fwd_8h_source.html @@ -0,0 +1,3201 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/parts/doctest_fwd.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest_fwd.h
+
+
+
1//
+
2// doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD
+
3//
+
4// Copyright (c) 2016-2023 Viktor Kirilov
+
5//
+
6// Distributed under the MIT Software License
+
7// See accompanying file LICENSE.txt or copy at
+
8// https://opensource.org/licenses/MIT
+
9//
+
10// The documentation can be found at the library's page:
+
11// https://github.com/doctest/doctest/blob/master/doc/markdown/readme.md
+
12//
+
13// =================================================================================================
+
14// =================================================================================================
+
15// =================================================================================================
+
16//
+
17// The library is heavily influenced by Catch - https://github.com/catchorg/Catch2
+
18// which uses the Boost Software License - Version 1.0
+
19// see here - https://github.com/catchorg/Catch2/blob/master/LICENSE.txt
+
20//
+
21// The concept of subcases (sections in Catch) and expression decomposition are from there.
+
22// Some parts of the code are taken directly:
+
23// - stringification - the detection of "ostream& operator<<(ostream&, const T&)" and StringMaker<>
+
24// - the Approx() helper class for floating point comparison
+
25// - colors in the console
+
26// - breaking into a debugger
+
27// - signal / SEH handling
+
28// - timer
+
29// - XmlWriter class - thanks to Phil Nash for allowing the direct reuse (AKA copy/paste)
+
30//
+
31// The expression decomposing templates are taken from lest - https://github.com/martinmoene/lest
+
32// which uses the Boost Software License - Version 1.0
+
33// see here - https://github.com/martinmoene/lest/blob/master/LICENSE.txt
+
34//
+
35// =================================================================================================
+
36// =================================================================================================
+
37// =================================================================================================
+
38
+
39#ifndef DOCTEST_LIBRARY_INCLUDED
+
40#define DOCTEST_LIBRARY_INCLUDED
+
41
+
42// =================================================================================================
+
43// == VERSION ======================================================================================
+
44// =================================================================================================
+
45
+
46#define DOCTEST_VERSION_MAJOR 2
+
47#define DOCTEST_VERSION_MINOR 4
+
48#define DOCTEST_VERSION_PATCH 11
+
49
+
50// util we need here
+
51#define DOCTEST_TOSTR_IMPL(x) #x
+
52#define DOCTEST_TOSTR(x) DOCTEST_TOSTR_IMPL(x)
+
53
+
54#define DOCTEST_VERSION_STR \
+
55 DOCTEST_TOSTR(DOCTEST_VERSION_MAJOR) "." \
+
56 DOCTEST_TOSTR(DOCTEST_VERSION_MINOR) "." \
+
57 DOCTEST_TOSTR(DOCTEST_VERSION_PATCH)
+
58
+
59#define DOCTEST_VERSION \
+
60 (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
+
61
+
62// =================================================================================================
+
63// == COMPILER VERSION =============================================================================
+
64// =================================================================================================
+
65
+
66// ideas for the version stuff are taken from here: https://github.com/cxxstuff/cxx_detect
+
67
+
68#ifdef _MSC_VER
+
69#define DOCTEST_CPLUSPLUS _MSVC_LANG
+
70#else
+
71#define DOCTEST_CPLUSPLUS __cplusplus
+
72#endif
+
73
+
74#define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))
+
75
+
76// GCC/Clang and GCC/MSVC are mutually exclusive, but Clang/MSVC are not because of clang-cl...
+
77#if defined(_MSC_VER) && defined(_MSC_FULL_VER)
+
78#if _MSC_VER == _MSC_FULL_VER / 10000
+
79#define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)
+
80#else // MSVC
+
81#define DOCTEST_MSVC \
+
82 DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)
+
83#endif // MSVC
+
84#endif // MSVC
+
85#if defined(__clang__) && defined(__clang_minor__) && defined(__clang_patchlevel__)
+
86#define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)
+
87#elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && \
+
88 !defined(__INTEL_COMPILER)
+
89#define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+
90#endif // GCC
+
91#if defined(__INTEL_COMPILER)
+
92#define DOCTEST_ICC DOCTEST_COMPILER(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
+
93#endif // ICC
+
94
+
95#ifndef DOCTEST_MSVC
+
96#define DOCTEST_MSVC 0
+
97#endif // DOCTEST_MSVC
+
98#ifndef DOCTEST_CLANG
+
99#define DOCTEST_CLANG 0
+
100#endif // DOCTEST_CLANG
+
101#ifndef DOCTEST_GCC
+
102#define DOCTEST_GCC 0
+
103#endif // DOCTEST_GCC
+
104#ifndef DOCTEST_ICC
+
105#define DOCTEST_ICC 0
+
106#endif // DOCTEST_ICC
+
107
+
108// =================================================================================================
+
109// == COMPILER WARNINGS HELPERS ====================================================================
+
110// =================================================================================================
+
111
+
112#if DOCTEST_CLANG && !DOCTEST_ICC
+
113#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
+
114#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push")
+
115#define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)
+
116#define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop")
+
117#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w) \
+
118 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)
+
119#else // DOCTEST_CLANG
+
120#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
121#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
+
122#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
123#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
+
124#endif // DOCTEST_CLANG
+
125
+
126#if DOCTEST_GCC
+
127#define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
+
128#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push")
+
129#define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)
+
130#define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop")
+
131#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w) \
+
132 DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)
+
133#else // DOCTEST_GCC
+
134#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
135#define DOCTEST_GCC_SUPPRESS_WARNING(w)
+
136#define DOCTEST_GCC_SUPPRESS_WARNING_POP
+
137#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
+
138#endif // DOCTEST_GCC
+
139
+
140#if DOCTEST_MSVC
+
141#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))
+
142#define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))
+
143#define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))
+
144#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w) \
+
145 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)
+
146#else // DOCTEST_MSVC
+
147#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
148#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
+
149#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
150#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
+
151#endif // DOCTEST_MSVC
+
152
+
153// =================================================================================================
+
154// == COMPILER WARNINGS ============================================================================
+
155// =================================================================================================
+
156
+
157// both the header and the implementation suppress all of these,
+
158// so it only makes sense to aggregate them like so
+
159#define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH \
+
160 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH \
+
161 DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas") \
+
162 DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables") \
+
163 DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded") \
+
164 DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes") \
+
165 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat") \
+
166 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic") \
+
167 \
+
168 DOCTEST_GCC_SUPPRESS_WARNING_PUSH \
+
169 DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas") \
+
170 DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas") \
+
171 DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++") \
+
172 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") \
+
173 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing") \
+
174 DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations") \
+
175 DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast") \
+
176 DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") \
+
177 \
+
178 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
+
179 /* these 4 also disabled globally via cmake: */ \
+
180 DOCTEST_MSVC_SUPPRESS_WARNING(4514) /* unreferenced inline function has been removed */ \
+
181 DOCTEST_MSVC_SUPPRESS_WARNING(4571) /* SEH related */ \
+
182 DOCTEST_MSVC_SUPPRESS_WARNING(4710) /* function not inlined */ \
+
183 DOCTEST_MSVC_SUPPRESS_WARNING(4711) /* function selected for inline expansion*/ \
+
184 /* common ones */ \
+
185 DOCTEST_MSVC_SUPPRESS_WARNING(4616) /* invalid compiler warning */ \
+
186 DOCTEST_MSVC_SUPPRESS_WARNING(4619) /* invalid compiler warning */ \
+
187 DOCTEST_MSVC_SUPPRESS_WARNING(4996) /* The compiler encountered a deprecated declaration */ \
+
188 DOCTEST_MSVC_SUPPRESS_WARNING(4706) /* assignment within conditional expression */ \
+
189 DOCTEST_MSVC_SUPPRESS_WARNING(4512) /* 'class' : assignment operator could not be generated */ \
+
190 DOCTEST_MSVC_SUPPRESS_WARNING(4127) /* conditional expression is constant */ \
+
191 DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
+
192 DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
+
193 DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
+
194 DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
+
195 DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
+
196 DOCTEST_MSVC_SUPPRESS_WARNING(4640) /* construction of local static object not thread-safe */ \
+
197 DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
+
198 DOCTEST_MSVC_SUPPRESS_WARNING(5264) /* 'variable-name': 'const' variable is not used */ \
+
199 /* static analysis */ \
+
200 DOCTEST_MSVC_SUPPRESS_WARNING(26439) /* Function may not throw. Declare it 'noexcept' */ \
+
201 DOCTEST_MSVC_SUPPRESS_WARNING(26495) /* Always initialize a member variable */ \
+
202 DOCTEST_MSVC_SUPPRESS_WARNING(26451) /* Arithmetic overflow ... */ \
+
203 DOCTEST_MSVC_SUPPRESS_WARNING(26444) /* Avoid unnamed objects with custom ctor and dtor... */ \
+
204 DOCTEST_MSVC_SUPPRESS_WARNING(26812) /* Prefer 'enum class' over 'enum' */
+
205
+
206#define DOCTEST_SUPPRESS_COMMON_WARNINGS_POP \
+
207 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
+
208 DOCTEST_GCC_SUPPRESS_WARNING_POP \
+
209 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
210
+
211DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
+
212
+
213DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
214DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor")
+
215DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated")
+
216
+
217DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
218DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy")
+
219DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor")
+
220DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-promo")
+
221
+
222DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
223DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted
+
224
+
225#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \
+
226 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
+
227 DOCTEST_MSVC_SUPPRESS_WARNING(4548) /* before comma no effect; expected side - effect */ \
+
228 DOCTEST_MSVC_SUPPRESS_WARNING(4265) /* virtual functions, but destructor is not virtual */ \
+
229 DOCTEST_MSVC_SUPPRESS_WARNING(4986) /* exception specification does not match previous */ \
+
230 DOCTEST_MSVC_SUPPRESS_WARNING(4350) /* 'member1' called instead of 'member2' */ \
+
231 DOCTEST_MSVC_SUPPRESS_WARNING(4668) /* not defined as a preprocessor macro */ \
+
232 DOCTEST_MSVC_SUPPRESS_WARNING(4365) /* signed/unsigned mismatch */ \
+
233 DOCTEST_MSVC_SUPPRESS_WARNING(4774) /* format string not a string literal */ \
+
234 DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
+
235 DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
+
236 DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
+
237 DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
+
238 DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
+
239 DOCTEST_MSVC_SUPPRESS_WARNING(4623) /* default constructor was implicitly deleted */ \
+
240 DOCTEST_MSVC_SUPPRESS_WARNING(5039) /* pointer to pot. throwing function passed to extern C */ \
+
241 DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
+
242 DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */ \
+
243 DOCTEST_MSVC_SUPPRESS_WARNING(4738) /* storing float result in memory, loss of performance */ \
+
244 DOCTEST_MSVC_SUPPRESS_WARNING(5262) /* implicit fall-through */
+
245
+
246#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
247
+
248// =================================================================================================
+
249// == FEATURE DETECTION ============================================================================
+
250// =================================================================================================
+
251
+
252// general compiler feature support table: https://en.cppreference.com/w/cpp/compiler_support
+
253// MSVC C++11 feature support table: https://msdn.microsoft.com/en-us/library/hh567368.aspx
+
254// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html
+
255// MSVC version table:
+
256// https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
+
257// MSVC++ 14.3 (17) _MSC_VER == 1930 (Visual Studio 2022)
+
258// MSVC++ 14.2 (16) _MSC_VER == 1920 (Visual Studio 2019)
+
259// MSVC++ 14.1 (15) _MSC_VER == 1910 (Visual Studio 2017)
+
260// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
+
261// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
+
262// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
+
263// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
+
264// MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
+
265// MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
+
266
+
267// Universal Windows Platform support
+
268#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+
269#define DOCTEST_CONFIG_NO_WINDOWS_SEH
+
270#endif // WINAPI_FAMILY
+
271#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
272#define DOCTEST_CONFIG_WINDOWS_SEH
+
273#endif // MSVC
+
274#if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)
+
275#undef DOCTEST_CONFIG_WINDOWS_SEH
+
276#endif // DOCTEST_CONFIG_NO_WINDOWS_SEH
+
277
+
278#if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && \
+
279 !defined(__EMSCRIPTEN__) && !defined(__wasi__)
+
280#define DOCTEST_CONFIG_POSIX_SIGNALS
+
281#endif // _WIN32
+
282#if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)
+
283#undef DOCTEST_CONFIG_POSIX_SIGNALS
+
284#endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS
+
285
+
286#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
287#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) \
+
288 || defined(__wasi__)
+
289#define DOCTEST_CONFIG_NO_EXCEPTIONS
+
290#endif // no exceptions
+
291#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
292
+
293#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
294#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
295#define DOCTEST_CONFIG_NO_EXCEPTIONS
+
296#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
297#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
298
+
299#if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)
+
300#define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
301#endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
302
+
303#ifdef __wasi__
+
304#define DOCTEST_CONFIG_NO_MULTITHREADING
+
305#endif
+
306
+
307#if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)
+
308#define DOCTEST_CONFIG_IMPLEMENT
+
309#endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
+
310
+
311#if defined(_WIN32) || defined(__CYGWIN__)
+
312#if DOCTEST_MSVC
+
313#define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)
+
314#define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)
+
315#else // MSVC
+
316#define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))
+
317#define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))
+
318#endif // MSVC
+
319#else // _WIN32
+
320#define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default")))
+
321#define DOCTEST_SYMBOL_IMPORT
+
322#endif // _WIN32
+
323
+
324#ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
325#ifdef DOCTEST_CONFIG_IMPLEMENT
+
326#define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT
+
327#else // DOCTEST_CONFIG_IMPLEMENT
+
328#define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT
+
329#endif // DOCTEST_CONFIG_IMPLEMENT
+
330#else // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
331#define DOCTEST_INTERFACE
+
332#endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
+
333
+
334// needed for extern template instantiations
+
335// see https://github.com/fmtlib/fmt/issues/2228
+
336#if DOCTEST_MSVC
+
337#define DOCTEST_INTERFACE_DECL
+
338#define DOCTEST_INTERFACE_DEF DOCTEST_INTERFACE
+
339#else // DOCTEST_MSVC
+
340#define DOCTEST_INTERFACE_DECL DOCTEST_INTERFACE
+
341#define DOCTEST_INTERFACE_DEF
+
342#endif // DOCTEST_MSVC
+
343
+
344#define DOCTEST_EMPTY
+
345
+
346#if DOCTEST_MSVC
+
347#define DOCTEST_NOINLINE __declspec(noinline)
+
348#define DOCTEST_UNUSED
+
349#define DOCTEST_ALIGNMENT(x)
+
350#elif DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 5, 0)
+
351#define DOCTEST_NOINLINE
+
352#define DOCTEST_UNUSED
+
353#define DOCTEST_ALIGNMENT(x)
+
354#else
+
355#define DOCTEST_NOINLINE __attribute__((noinline))
+
356#define DOCTEST_UNUSED __attribute__((unused))
+
357#define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))
+
358#endif
+
359
+
360#ifdef DOCTEST_CONFIG_NO_CONTRADICTING_INLINE
+
361#define DOCTEST_INLINE_NOINLINE inline
+
362#else
+
363#define DOCTEST_INLINE_NOINLINE inline DOCTEST_NOINLINE
+
364#endif
+
365
+
366#ifndef DOCTEST_NORETURN
+
367#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
368#define DOCTEST_NORETURN
+
369#else // DOCTEST_MSVC
+
370#define DOCTEST_NORETURN [[noreturn]]
+
371#endif // DOCTEST_MSVC
+
372#endif // DOCTEST_NORETURN
+
373
+
374#ifndef DOCTEST_NOEXCEPT
+
375#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
376#define DOCTEST_NOEXCEPT
+
377#else // DOCTEST_MSVC
+
378#define DOCTEST_NOEXCEPT noexcept
+
379#endif // DOCTEST_MSVC
+
380#endif // DOCTEST_NOEXCEPT
+
381
+
382#ifndef DOCTEST_CONSTEXPR
+
383#if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
+
384#define DOCTEST_CONSTEXPR const
+
385#define DOCTEST_CONSTEXPR_FUNC inline
+
386#else // DOCTEST_MSVC
+
387#define DOCTEST_CONSTEXPR constexpr
+
388#define DOCTEST_CONSTEXPR_FUNC constexpr
+
389#endif // DOCTEST_MSVC
+
390#endif // DOCTEST_CONSTEXPR
+
391
+
392#ifndef DOCTEST_NO_SANITIZE_INTEGER
+
393#if DOCTEST_CLANG >= DOCTEST_COMPILER(3, 7, 0)
+
394#define DOCTEST_NO_SANITIZE_INTEGER __attribute__((no_sanitize("integer")))
+
395#else
+
396#define DOCTEST_NO_SANITIZE_INTEGER
+
397#endif
+
398#endif // DOCTEST_NO_SANITIZE_INTEGER
+
399
+
400// =================================================================================================
+
401// == FEATURE DETECTION END ========================================================================
+
402// =================================================================================================
+
403
+
404#define DOCTEST_DECLARE_INTERFACE(name) \
+
405 virtual ~name(); \
+
406 name() = default; \
+
407 name(const name&) = delete; \
+
408 name(name&&) = delete; \
+
409 name& operator=(const name&) = delete; \
+
410 name& operator=(name&&) = delete;
+
411
+
412#define DOCTEST_DEFINE_INTERFACE(name) \
+
413 name::~name() = default;
+
414
+
415// internal macros for string concatenation and anonymous variable name generation
+
416#define DOCTEST_CAT_IMPL(s1, s2) s1##s2
+
417#define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)
+
418#ifdef __COUNTER__ // not standard and may be missing for some compilers
+
419#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)
+
420#else // __COUNTER__
+
421#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
+
422#endif // __COUNTER__
+
423
+
424#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
425#define DOCTEST_REF_WRAP(x) x&
+
426#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
427#define DOCTEST_REF_WRAP(x) x
+
428#endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
+
429
+
430// not using __APPLE__ because... this is how Catch does it
+
431#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
+
432#define DOCTEST_PLATFORM_MAC
+
433#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+
434#define DOCTEST_PLATFORM_IPHONE
+
435#elif defined(_WIN32)
+
436#define DOCTEST_PLATFORM_WINDOWS
+
437#elif defined(__wasi__)
+
438#define DOCTEST_PLATFORM_WASI
+
439#else // DOCTEST_PLATFORM
+
440#define DOCTEST_PLATFORM_LINUX
+
441#endif // DOCTEST_PLATFORM
+
442
+
443namespace doctest { namespace detail {
+
444 static DOCTEST_CONSTEXPR int consume(const int*, int) noexcept { return 0; }
+
445}}
+
446
+
447#define DOCTEST_GLOBAL_NO_WARNINGS(var, ...) \
+
448 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \
+
449 static const int var = doctest::detail::consume(&var, __VA_ARGS__); \
+
450 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
451
+
452#ifndef DOCTEST_BREAK_INTO_DEBUGGER
+
453// should probably take a look at https://github.com/scottt/debugbreak
+
454#ifdef DOCTEST_PLATFORM_LINUX
+
455#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
+
456// Break at the location of the failing check if possible
+
457#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
+
458#else
+
459#include <signal.h>
+
460#define DOCTEST_BREAK_INTO_DEBUGGER() raise(SIGTRAP)
+
461#endif
+
462#elif defined(DOCTEST_PLATFORM_MAC)
+
463#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__i386)
+
464#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
+
465#elif defined(__ppc__) || defined(__ppc64__)
+
466// https://www.cocoawithlove.com/2008/03/break-into-debugger.html
+
467#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n": : : "memory","r0","r3","r4") // NOLINT(hicpp-no-assembler)
+
468#else
+
469#define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("brk #0"); // NOLINT(hicpp-no-assembler)
+
470#endif
+
471#elif DOCTEST_MSVC
+
472#define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()
+
473#elif defined(__MINGW32__)
+
474DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wredundant-decls")
+
475extern "C" __declspec(dllimport) void __stdcall DebugBreak();
+
476DOCTEST_GCC_SUPPRESS_WARNING_POP
+
477#define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()
+
478#else // linux
+
479#define DOCTEST_BREAK_INTO_DEBUGGER() (static_cast<void>(0))
+
480#endif // linux
+
481#endif // DOCTEST_BREAK_INTO_DEBUGGER
+
482
+
483// this is kept here for backwards compatibility since the config option was changed
+
484#ifdef DOCTEST_CONFIG_USE_IOSFWD
+
485#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
+
486#define DOCTEST_CONFIG_USE_STD_HEADERS
+
487#endif
+
488#endif // DOCTEST_CONFIG_USE_IOSFWD
+
489
+
490// for clang - always include ciso646 (which drags some std stuff) because
+
491// we want to check if we are using libc++ with the _LIBCPP_VERSION macro in
+
492// which case we don't want to forward declare stuff from std - for reference:
+
493// https://github.com/doctest/doctest/issues/126
+
494// https://github.com/doctest/doctest/issues/356
+
495#if DOCTEST_CLANG
+
496#include <ciso646>
+
497#endif // clang
+
498
+
499#ifdef _LIBCPP_VERSION
+
500#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
+
501#define DOCTEST_CONFIG_USE_STD_HEADERS
+
502#endif
+
503#endif // _LIBCPP_VERSION
+
504
+
505#ifdef DOCTEST_CONFIG_USE_STD_HEADERS
+
506#ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
507#define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
508#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
509DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
+
510#include <cstddef>
+
511#include <ostream>
+
512#include <istream>
+
513DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
+
514#else // DOCTEST_CONFIG_USE_STD_HEADERS
+
515
+
516// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
+
517DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)
+
518
+
519namespace std { // NOLINT(cert-dcl58-cpp)
+
520typedef decltype(nullptr) nullptr_t; // NOLINT(modernize-use-using)
+
521typedef decltype(sizeof(void*)) size_t; // NOLINT(modernize-use-using)
+
522template <class charT>
+
523struct char_traits;
+
524template <>
+
525struct char_traits<char>;
+
526template <class charT, class traits>
+
527class basic_ostream; // NOLINT(fuchsia-virtual-inheritance)
+
528typedef basic_ostream<char, char_traits<char>> ostream; // NOLINT(modernize-use-using)
+
529template<class traits>
+
530// NOLINTNEXTLINE
+
531basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&, const char*);
+
532template <class charT, class traits>
+
533class basic_istream;
+
534typedef basic_istream<char, char_traits<char>> istream; // NOLINT(modernize-use-using)
+
535template <class... Types>
+
536class tuple;
+
537#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
538// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
539template <class Ty>
+
540class allocator;
+
541template <class Elem, class Traits, class Alloc>
+
542class basic_string;
+
543using string = basic_string<char, char_traits<char>, allocator<char>>;
+
544#endif // VS 2019
+
545} // namespace std
+
546
+
547DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
548
+
549#endif // DOCTEST_CONFIG_USE_STD_HEADERS
+
550
+
551#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
552#include <type_traits>
+
553#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
554
+
555namespace doctest {
+
556
+
557using std::size_t;
+
558
+
559DOCTEST_INTERFACE extern bool is_running_in_test;
+
560
+
561#ifndef DOCTEST_CONFIG_STRING_SIZE_TYPE
+
562#define DOCTEST_CONFIG_STRING_SIZE_TYPE unsigned
+
563#endif
+
564
+
565// A 24 byte string class (can be as small as 17 for x64 and 13 for x86) that can hold strings with length
+
566// of up to 23 chars on the stack before going on the heap - the last byte of the buffer is used for:
+
567// - "is small" bit - the highest bit - if "0" then it is small - otherwise its "1" (128)
+
568// - if small - capacity left before going on the heap - using the lowest 5 bits
+
569// - if small - 2 bits are left unused - the second and third highest ones
+
570// - if small - acts as a null terminator if strlen() is 23 (24 including the null terminator)
+
571// and the "is small" bit remains "0" ("as well as the capacity left") so its OK
+
572// Idea taken from this lecture about the string implementation of facebook/folly - fbstring
+
573// https://www.youtube.com/watch?v=kPR8h4-qZdk
+
574// TODO:
+
575// - optimizations - like not deleting memory unnecessarily in operator= and etc.
+
576// - resize/reserve/clear
+
577// - replace
+
578// - back/front
+
579// - iterator stuff
+
580// - find & friends
+
581// - push_back/pop_back
+
582// - assign/insert/erase
+
583// - relational operators as free functions - taking const char* as one of the params
+
584class DOCTEST_INTERFACE String
+
585{
+
586public:
+
587 using size_type = DOCTEST_CONFIG_STRING_SIZE_TYPE;
+
588
+
589private:
+
590 static DOCTEST_CONSTEXPR size_type len = 24;
+
591 static DOCTEST_CONSTEXPR size_type last = len - 1;
+
592
+
593 struct view // len should be more than sizeof(view) - because of the final byte for flags
+
594 {
+
595 char* ptr;
+
596 size_type size;
+
597 size_type capacity;
+
598 };
+
599
+
600 union
+
601 {
+
602 char buf[len]; // NOLINT(*-avoid-c-arrays)
+
603 view data;
+
604 };
+
605
+
606 char* allocate(size_type sz);
+
607
+
608 bool isOnStack() const noexcept { return (buf[last] & 128) == 0; }
+
609 void setOnHeap() noexcept;
+
610 void setLast(size_type in = last) noexcept;
+
611 void setSize(size_type sz) noexcept;
+
612
+
613 void copy(const String& other);
+
614
+
615public:
+
616 static DOCTEST_CONSTEXPR size_type npos = static_cast<size_type>(-1);
+
617
+
618 String() noexcept;
+
619 ~String();
+
620
+
621 // cppcheck-suppress noExplicitConstructor
+
622 String(const char* in);
+
623 String(const char* in, size_type in_size);
+
624
+
625 String(std::istream& in, size_type in_size);
+
626
+
627 String(const String& other);
+
628 String& operator=(const String& other);
+
629
+
630 String& operator+=(const String& other);
+
631
+
632 String(String&& other) noexcept;
+
633 String& operator=(String&& other) noexcept;
+
634
+
635 char operator[](size_type i) const;
+
636 char& operator[](size_type i);
+
637
+
638 // the only functions I'm willing to leave in the interface - available for inlining
+
639 const char* c_str() const { return const_cast<String*>(this)->c_str(); } // NOLINT
+
640 char* c_str() {
+
641 if (isOnStack()) {
+
642 return reinterpret_cast<char*>(buf);
+
643 }
+
644 return data.ptr;
+
645 }
+
646
+
647 size_type size() const;
+
648 size_type capacity() const;
+
649
+
650 String substr(size_type pos, size_type cnt = npos) &&;
+
651 String substr(size_type pos, size_type cnt = npos) const &;
+
652
+
653 size_type find(char ch, size_type pos = 0) const;
+
654 size_type rfind(char ch, size_type pos = npos) const;
+
655
+
656 int compare(const char* other, bool no_case = false) const;
+
657 int compare(const String& other, bool no_case = false) const;
+
658
+
659friend DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, const String& in);
+
660};
+
661
+
662DOCTEST_INTERFACE String operator+(const String& lhs, const String& rhs);
+
663
+
664DOCTEST_INTERFACE bool operator==(const String& lhs, const String& rhs);
+
665DOCTEST_INTERFACE bool operator!=(const String& lhs, const String& rhs);
+
666DOCTEST_INTERFACE bool operator<(const String& lhs, const String& rhs);
+
667DOCTEST_INTERFACE bool operator>(const String& lhs, const String& rhs);
+
668DOCTEST_INTERFACE bool operator<=(const String& lhs, const String& rhs);
+
669DOCTEST_INTERFACE bool operator>=(const String& lhs, const String& rhs);
+
670
+
671class DOCTEST_INTERFACE Contains {
+
672public:
+
673 explicit Contains(const String& string);
+
674
+
675 bool checkWith(const String& other) const;
+
676
+
677 String string;
+
678};
+
679
+
680DOCTEST_INTERFACE String toString(const Contains& in);
+
681
+
682DOCTEST_INTERFACE bool operator==(const String& lhs, const Contains& rhs);
+
683DOCTEST_INTERFACE bool operator==(const Contains& lhs, const String& rhs);
+
684DOCTEST_INTERFACE bool operator!=(const String& lhs, const Contains& rhs);
+
685DOCTEST_INTERFACE bool operator!=(const Contains& lhs, const String& rhs);
+
686
+
687namespace Color {
+
688 enum Enum
+
689 {
+
690 None = 0,
+
691 White,
+
692 Red,
+
693 Green,
+
694 Blue,
+
695 Cyan,
+
696 Yellow,
+
697 Grey,
+
698
+
699 Bright = 0x10,
+
700
+
701 BrightRed = Bright | Red,
+
702 BrightGreen = Bright | Green,
+
703 LightGrey = Bright | Grey,
+
704 BrightWhite = Bright | White
+
705 };
+
706
+
707 DOCTEST_INTERFACE std::ostream& operator<<(std::ostream& s, Color::Enum code);
+
708} // namespace Color
+
709
+
710namespace assertType {
+
711 enum Enum
+
712 {
+
713 // macro traits
+
714
+
715 is_warn = 1,
+
716 is_check = 2 * is_warn,
+
717 is_require = 2 * is_check,
+
718
+
719 is_normal = 2 * is_require,
+
720 is_throws = 2 * is_normal,
+
721 is_throws_as = 2 * is_throws,
+
722 is_throws_with = 2 * is_throws_as,
+
723 is_nothrow = 2 * is_throws_with,
+
724
+
725 is_false = 2 * is_nothrow,
+
726 is_unary = 2 * is_false, // not checked anywhere - used just to distinguish the types
+
727
+
728 is_eq = 2 * is_unary,
+
729 is_ne = 2 * is_eq,
+
730
+
731 is_lt = 2 * is_ne,
+
732 is_gt = 2 * is_lt,
+
733
+
734 is_ge = 2 * is_gt,
+
735 is_le = 2 * is_ge,
+
736
+
737 // macro types
+
738
+
739 DT_WARN = is_normal | is_warn,
+
740 DT_CHECK = is_normal | is_check,
+
741 DT_REQUIRE = is_normal | is_require,
+
742
+
743 DT_WARN_FALSE = is_normal | is_false | is_warn,
+
744 DT_CHECK_FALSE = is_normal | is_false | is_check,
+
745 DT_REQUIRE_FALSE = is_normal | is_false | is_require,
+
746
+
747 DT_WARN_THROWS = is_throws | is_warn,
+
748 DT_CHECK_THROWS = is_throws | is_check,
+
749 DT_REQUIRE_THROWS = is_throws | is_require,
+
750
+
751 DT_WARN_THROWS_AS = is_throws_as | is_warn,
+
752 DT_CHECK_THROWS_AS = is_throws_as | is_check,
+
753 DT_REQUIRE_THROWS_AS = is_throws_as | is_require,
+
754
+
755 DT_WARN_THROWS_WITH = is_throws_with | is_warn,
+
756 DT_CHECK_THROWS_WITH = is_throws_with | is_check,
+
757 DT_REQUIRE_THROWS_WITH = is_throws_with | is_require,
+
758
+
759 DT_WARN_THROWS_WITH_AS = is_throws_with | is_throws_as | is_warn,
+
760 DT_CHECK_THROWS_WITH_AS = is_throws_with | is_throws_as | is_check,
+
761 DT_REQUIRE_THROWS_WITH_AS = is_throws_with | is_throws_as | is_require,
+
762
+
763 DT_WARN_NOTHROW = is_nothrow | is_warn,
+
764 DT_CHECK_NOTHROW = is_nothrow | is_check,
+
765 DT_REQUIRE_NOTHROW = is_nothrow | is_require,
+
766
+
767 DT_WARN_EQ = is_normal | is_eq | is_warn,
+
768 DT_CHECK_EQ = is_normal | is_eq | is_check,
+
769 DT_REQUIRE_EQ = is_normal | is_eq | is_require,
+
770
+
771 DT_WARN_NE = is_normal | is_ne | is_warn,
+
772 DT_CHECK_NE = is_normal | is_ne | is_check,
+
773 DT_REQUIRE_NE = is_normal | is_ne | is_require,
+
774
+
775 DT_WARN_GT = is_normal | is_gt | is_warn,
+
776 DT_CHECK_GT = is_normal | is_gt | is_check,
+
777 DT_REQUIRE_GT = is_normal | is_gt | is_require,
+
778
+
779 DT_WARN_LT = is_normal | is_lt | is_warn,
+
780 DT_CHECK_LT = is_normal | is_lt | is_check,
+
781 DT_REQUIRE_LT = is_normal | is_lt | is_require,
+
782
+
783 DT_WARN_GE = is_normal | is_ge | is_warn,
+
784 DT_CHECK_GE = is_normal | is_ge | is_check,
+
785 DT_REQUIRE_GE = is_normal | is_ge | is_require,
+
786
+
787 DT_WARN_LE = is_normal | is_le | is_warn,
+
788 DT_CHECK_LE = is_normal | is_le | is_check,
+
789 DT_REQUIRE_LE = is_normal | is_le | is_require,
+
790
+
791 DT_WARN_UNARY = is_normal | is_unary | is_warn,
+
792 DT_CHECK_UNARY = is_normal | is_unary | is_check,
+
793 DT_REQUIRE_UNARY = is_normal | is_unary | is_require,
+
794
+
795 DT_WARN_UNARY_FALSE = is_normal | is_false | is_unary | is_warn,
+
796 DT_CHECK_UNARY_FALSE = is_normal | is_false | is_unary | is_check,
+
797 DT_REQUIRE_UNARY_FALSE = is_normal | is_false | is_unary | is_require,
+
798 };
+
799} // namespace assertType
+
800
+
801DOCTEST_INTERFACE const char* assertString(assertType::Enum at);
+
802DOCTEST_INTERFACE const char* failureString(assertType::Enum at);
+
803DOCTEST_INTERFACE const char* skipPathFromFilename(const char* file);
+
804
+
805struct DOCTEST_INTERFACE TestCaseData
+
806{
+
807 String m_file; // the file in which the test was registered (using String - see #350)
+
808 unsigned m_line; // the line where the test was registered
+
809 const char* m_name; // name of the test case
+
810 const char* m_test_suite; // the test suite in which the test was added
+
811 const char* m_description;
+
812 bool m_skip;
+
813 bool m_no_breaks;
+
814 bool m_no_output;
+
815 bool m_may_fail;
+
816 bool m_should_fail;
+
817 int m_expected_failures;
+
818 double m_timeout;
+
819};
+
820
+
821struct DOCTEST_INTERFACE AssertData
+
822{
+
823 // common - for all asserts
+
824 const TestCaseData* m_test_case;
+
825 assertType::Enum m_at;
+
826 const char* m_file;
+
827 int m_line;
+
828 const char* m_expr;
+
829 bool m_failed;
+
830
+
831 // exception-related - for all asserts
+
832 bool m_threw;
+
833 String m_exception;
+
834
+
835 // for normal asserts
+
836 String m_decomp;
+
837
+
838 // for specific exception-related asserts
+
839 bool m_threw_as;
+
840 const char* m_exception_type;
+
841
+
842 class DOCTEST_INTERFACE StringContains {
+
843 private:
+
844 Contains content;
+
845 bool isContains;
+
846
+
847 public:
+
848 StringContains(const String& str) : content(str), isContains(false) { }
+
849 StringContains(Contains cntn) : content(static_cast<Contains&&>(cntn)), isContains(true) { }
+
850
+
851 bool check(const String& str) { return isContains ? (content == str) : (content.string == str); }
+
852
+
853 operator const String&() const { return content.string; }
+
854
+
855 const char* c_str() const { return content.string.c_str(); }
+
856 } m_exception_string;
+
857
+
858 AssertData(assertType::Enum at, const char* file, int line, const char* expr,
+
859 const char* exception_type, const StringContains& exception_string);
+
860};
+
861
+
862struct DOCTEST_INTERFACE MessageData
+
863{
+
864 String m_string;
+
865 const char* m_file;
+
866 int m_line;
+
867 assertType::Enum m_severity;
+
868};
+
869
+
870struct DOCTEST_INTERFACE SubcaseSignature
+
871{
+
872 String m_name;
+
873 const char* m_file;
+
874 int m_line;
+
875
+
876 bool operator==(const SubcaseSignature& other) const;
+
877 bool operator<(const SubcaseSignature& other) const;
+
878};
+
879
+
880struct DOCTEST_INTERFACE IContextScope
+
881{
+
882 DOCTEST_DECLARE_INTERFACE(IContextScope)
+
883 virtual void stringify(std::ostream*) const = 0;
+
884};
+
885
+
886namespace detail {
+
887 struct DOCTEST_INTERFACE TestCase;
+
888} // namespace detail
+
889
+
890struct ContextOptions
+
891{
+
892 std::ostream* cout = nullptr; // stdout stream
+
893 String binary_name; // the test binary name
+
894
+
895 const detail::TestCase* currentTest = nullptr;
+
896
+
897 // == parameters from the command line
+
898 String out; // output filename
+
899 String order_by; // how tests should be ordered
+
900 unsigned rand_seed; // the seed for rand ordering
+
901
+
902 unsigned first; // the first (matching) test to be executed
+
903 unsigned last; // the last (matching) test to be executed
+
904
+
905 int abort_after; // stop tests after this many failed assertions
+
906 int subcase_filter_levels; // apply the subcase filters for the first N levels
+
907
+
908 bool success; // include successful assertions in output
+
909 bool case_sensitive; // if filtering should be case sensitive
+
910 bool exit; // if the program should be exited after the tests are ran/whatever
+
911 bool duration; // print the time duration of each test case
+
912 bool minimal; // minimal console output (only test failures)
+
913 bool quiet; // no console output
+
914 bool no_throw; // to skip exceptions-related assertion macros
+
915 bool no_exitcode; // if the framework should return 0 as the exitcode
+
916 bool no_run; // to not run the tests at all (can be done with an "*" exclude)
+
917 bool no_intro; // to not print the intro of the framework
+
918 bool no_version; // to not print the version of the framework
+
919 bool no_colors; // if output to the console should be colorized
+
920 bool force_colors; // forces the use of colors even when a tty cannot be detected
+
921 bool no_breaks; // to not break into the debugger
+
922 bool no_skip; // don't skip test cases which are marked to be skipped
+
923 bool gnu_file_line; // if line numbers should be surrounded with :x: and not (x):
+
924 bool no_path_in_filenames; // if the path to files should be removed from the output
+
925 bool no_line_numbers; // if source code line numbers should be omitted from the output
+
926 bool no_debug_output; // no output in the debug console when a debugger is attached
+
927 bool no_skipped_summary; // don't print "skipped" in the summary !!! UNDOCUMENTED !!!
+
928 bool no_time_in_output; // omit any time/timestamps from output !!! UNDOCUMENTED !!!
+
929
+
930 bool help; // to print the help
+
931 bool version; // to print the version
+
932 bool count; // if only the count of matching tests is to be retrieved
+
933 bool list_test_cases; // to list all tests matching the filters
+
934 bool list_test_suites; // to list all suites matching the filters
+
935 bool list_reporters; // lists all registered reporters
+
936};
+
937
+
938namespace detail {
+
939 namespace types {
+
940#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
941 using namespace std;
+
942#else
+
943 template <bool COND, typename T = void>
+
944 struct enable_if { };
+
945
+
946 template <typename T>
+
947 struct enable_if<true, T> { using type = T; };
+
948
+
949 struct true_type { static DOCTEST_CONSTEXPR bool value = true; };
+
950 struct false_type { static DOCTEST_CONSTEXPR bool value = false; };
+
951
+
952 template <typename T> struct remove_reference { using type = T; };
+
953 template <typename T> struct remove_reference<T&> { using type = T; };
+
954 template <typename T> struct remove_reference<T&&> { using type = T; };
+
955
+
956 template <typename T> struct is_rvalue_reference : false_type { };
+
957 template <typename T> struct is_rvalue_reference<T&&> : true_type { };
+
958
+
959 template<typename T> struct remove_const { using type = T; };
+
960 template <typename T> struct remove_const<const T> { using type = T; };
+
961
+
962 // Compiler intrinsics
+
963 template <typename T> struct is_enum { static DOCTEST_CONSTEXPR bool value = __is_enum(T); };
+
964 template <typename T> struct underlying_type { using type = __underlying_type(T); };
+
965
+
966 template <typename T> struct is_pointer : false_type { };
+
967 template <typename T> struct is_pointer<T*> : true_type { };
+
968
+
969 template <typename T> struct is_array : false_type { };
+
970 // NOLINTNEXTLINE(*-avoid-c-arrays)
+
971 template <typename T, size_t SIZE> struct is_array<T[SIZE]> : true_type { };
+
972#endif
+
973 }
+
974
+
975 // <utility>
+
976 template <typename T>
+
977 T&& declval();
+
978
+
979 template <class T>
+
980 DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type& t) DOCTEST_NOEXCEPT {
+
981 return static_cast<T&&>(t);
+
982 }
+
983
+
984 template <class T>
+
985 DOCTEST_CONSTEXPR_FUNC T&& forward(typename types::remove_reference<T>::type&& t) DOCTEST_NOEXCEPT {
+
986 return static_cast<T&&>(t);
+
987 }
+
988
+
989 template <typename T>
+
990 struct deferred_false : types::false_type { };
+
991
+
992// MSVS 2015 :(
+
993#if !DOCTEST_CLANG && defined(_MSC_VER) && _MSC_VER <= 1900
+
994 template <typename T, typename = void>
+
995 struct has_global_insertion_operator : types::false_type { };
+
996
+
997 template <typename T>
+
998 struct has_global_insertion_operator<T, decltype(::operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { };
+
999
+
1000 template <typename T, typename = void>
+
1001 struct has_insertion_operator { static DOCTEST_CONSTEXPR bool value = has_global_insertion_operator<T>::value; };
+
1002
+
1003 template <typename T, bool global>
+
1004 struct insert_hack;
+
1005
+
1006 template <typename T>
+
1007 struct insert_hack<T, true> {
+
1008 static void insert(std::ostream& os, const T& t) { ::operator<<(os, t); }
+
1009 };
+
1010
+
1011 template <typename T>
+
1012 struct insert_hack<T, false> {
+
1013 static void insert(std::ostream& os, const T& t) { operator<<(os, t); }
+
1014 };
+
1015
+
1016 template <typename T>
+
1017 using insert_hack_t = insert_hack<T, has_global_insertion_operator<T>::value>;
+
1018#else
+
1019 template <typename T, typename = void>
+
1020 struct has_insertion_operator : types::false_type { };
+
1021#endif
+
1022
+
1023 template <typename T>
+
1024 struct has_insertion_operator<T, decltype(operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { };
+
1025
+
1026 template <typename T>
+
1027 struct should_stringify_as_underlying_type {
+
1028 static DOCTEST_CONSTEXPR bool value = detail::types::is_enum<T>::value && !doctest::detail::has_insertion_operator<T>::value;
+
1029 };
+
1030
+
1031 DOCTEST_INTERFACE std::ostream* tlssPush();
+
1032 DOCTEST_INTERFACE String tlssPop();
+
1033
+
1034 template <bool C>
+
1035 struct StringMakerBase {
+
1036 template <typename T>
+
1037 static String convert(const DOCTEST_REF_WRAP(T)) {
+
1038#ifdef DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES
+
1039 static_assert(deferred_false<T>::value, "No stringification detected for type T. See string conversion manual");
+
1040#endif
+
1041 return "{?}";
+
1042 }
+
1043 };
+
1044
+
1045 template <typename T>
+
1046 struct filldata;
+
1047
+
1048 template <typename T>
+
1049 void filloss(std::ostream* stream, const T& in) {
+
1050 filldata<T>::fill(stream, in);
+
1051 }
+
1052
+
1053 template <typename T, size_t N>
+
1054 void filloss(std::ostream* stream, const T (&in)[N]) { // NOLINT(*-avoid-c-arrays)
+
1055 // T[N], T(&)[N], T(&&)[N] have same behaviour.
+
1056 // Hence remove reference.
+
1057 filloss<typename types::remove_reference<decltype(in)>::type>(stream, in);
+
1058 }
+
1059
+
1060 template <typename T>
+
1061 String toStream(const T& in) {
+
1062 std::ostream* stream = tlssPush();
+
1063 filloss(stream, in);
+
1064 return tlssPop();
+
1065 }
+
1066
+
1067 template <>
+
1068 struct StringMakerBase<true> {
+
1069 template <typename T>
+
1070 static String convert(const DOCTEST_REF_WRAP(T) in) {
+
1071 return toStream(in);
+
1072 }
+
1073 };
+
1074} // namespace detail
+
1075
+
1076template <typename T>
+
1077struct StringMaker : public detail::StringMakerBase<
+
1078 detail::has_insertion_operator<T>::value || detail::types::is_pointer<T>::value || detail::types::is_array<T>::value>
+
1079{};
+
1080
+
1081#ifndef DOCTEST_STRINGIFY
+
1082#ifdef DOCTEST_CONFIG_DOUBLE_STRINGIFY
+
1083#define DOCTEST_STRINGIFY(...) toString(toString(__VA_ARGS__))
+
1084#else
+
1085#define DOCTEST_STRINGIFY(...) toString(__VA_ARGS__)
+
1086#endif
+
1087#endif
+
1088
+
1089template <typename T>
+
1090String toString() {
+
1091#if DOCTEST_CLANG == 0 && DOCTEST_GCC == 0 && DOCTEST_ICC == 0
+
1092 String ret = __FUNCSIG__; // class doctest::String __cdecl doctest::toString<TYPE>(void)
+
1093 String::size_type beginPos = ret.find('<');
+
1094 return ret.substr(beginPos + 1, ret.size() - beginPos - static_cast<String::size_type>(sizeof(">(void)")));
+
1095#else
+
1096 String ret = __PRETTY_FUNCTION__; // doctest::String toString() [with T = TYPE]
+
1097 String::size_type begin = ret.find('=') + 2;
+
1098 return ret.substr(begin, ret.size() - begin - 1);
+
1099#endif
+
1100}
+
1101
+
1102template <typename T, typename detail::types::enable_if<!detail::should_stringify_as_underlying_type<T>::value, bool>::type = true>
+
1103String toString(const DOCTEST_REF_WRAP(T) value) {
+
1104 return StringMaker<T>::convert(value);
+
1105}
+
1106
+
1107#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1108DOCTEST_INTERFACE String toString(const char* in);
+
1109#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1110
+
1111#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
+
1112// see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
+
1113DOCTEST_INTERFACE String toString(const std::string& in);
+
1114#endif // VS 2019
+
1115
+
1116DOCTEST_INTERFACE String toString(String in);
+
1117
+
1118DOCTEST_INTERFACE String toString(std::nullptr_t);
+
1119
+
1120DOCTEST_INTERFACE String toString(bool in);
+
1121
+
1122DOCTEST_INTERFACE String toString(float in);
+
1123DOCTEST_INTERFACE String toString(double in);
+
1124DOCTEST_INTERFACE String toString(double long in);
+
1125
+
1126DOCTEST_INTERFACE String toString(char in);
+
1127DOCTEST_INTERFACE String toString(char signed in);
+
1128DOCTEST_INTERFACE String toString(char unsigned in);
+
1129DOCTEST_INTERFACE String toString(short in);
+
1130DOCTEST_INTERFACE String toString(short unsigned in);
+
1131DOCTEST_INTERFACE String toString(signed in);
+
1132DOCTEST_INTERFACE String toString(unsigned in);
+
1133DOCTEST_INTERFACE String toString(long in);
+
1134DOCTEST_INTERFACE String toString(long unsigned in);
+
1135DOCTEST_INTERFACE String toString(long long in);
+
1136DOCTEST_INTERFACE String toString(long long unsigned in);
+
1137
+
1138template <typename T, typename detail::types::enable_if<detail::should_stringify_as_underlying_type<T>::value, bool>::type = true>
+
1139String toString(const DOCTEST_REF_WRAP(T) value) {
+
1140 using UT = typename detail::types::underlying_type<T>::type;
+
1141 return (DOCTEST_STRINGIFY(static_cast<UT>(value)));
+
1142}
+
1143
+
1144namespace detail {
+
1145 template <typename T>
+
+ +
1147 {
+
1148 static void fill(std::ostream* stream, const T& in) {
+
1149#if defined(_MSC_VER) && _MSC_VER <= 1900
+
1150 insert_hack_t<T>::insert(*stream, in);
+
1151#else
+
1152 operator<<(*stream, in);
+
1153#endif
+
1154 }
+
1155 };
+
+
1156
+
1157DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866)
+
1158// NOLINTBEGIN(*-avoid-c-arrays)
+
1159 template <typename T, size_t N>
+
1160 struct filldata<T[N]> {
+
1161 static void fill(std::ostream* stream, const T(&in)[N]) {
+
1162 *stream << "[";
+
1163 for (size_t i = 0; i < N; i++) {
+
1164 if (i != 0) { *stream << ", "; }
+
1165 *stream << (DOCTEST_STRINGIFY(in[i]));
+
1166 }
+
1167 *stream << "]";
+
1168 }
+
1169 };
+
1170// NOLINTEND(*-avoid-c-arrays)
+
1171DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1172
+
1173 // Specialized since we don't want the terminating null byte!
+
1174// NOLINTBEGIN(*-avoid-c-arrays)
+
1175 template <size_t N>
+
1176 struct filldata<const char[N]> {
+
1177 static void fill(std::ostream* stream, const char (&in)[N]) {
+
1178 *stream << String(in, in[N - 1] ? N : N - 1);
+
1179 } // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
1180 };
+
1181// NOLINTEND(*-avoid-c-arrays)
+
1182
+
1183 template <>
+
1184 struct filldata<const void*> {
+
1185 static void fill(std::ostream* stream, const void* in);
+
1186 };
+
1187
+
1188 template <typename T>
+
1189 struct filldata<T*> {
+
1190DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4180)
+
1191 static void fill(std::ostream* stream, const T* in) {
+
1192DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1193DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wmicrosoft-cast")
+
1194 filldata<const void*>::fill(stream,
+
1195#if DOCTEST_GCC == 0 || DOCTEST_GCC >= DOCTEST_COMPILER(4, 9, 0)
+
1196 reinterpret_cast<const void*>(in)
+
1197#else
+
1198 *reinterpret_cast<const void* const*>(&in)
+
1199#endif
+
1200 );
+
1201DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1202 }
+
1203 };
+
1204}
+
1205
+
1206struct DOCTEST_INTERFACE Approx
+
1207{
+
1208 Approx(double value);
+
1209
+
1210 Approx operator()(double value) const;
+
1211
+
1212#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1213 template <typename T>
+
1214 explicit Approx(const T& value,
+
1215 typename detail::types::enable_if<std::is_constructible<double, T>::value>::type* =
+
1216 static_cast<T*>(nullptr)) {
+
1217 *this = static_cast<double>(value);
+
1218 }
+
1219#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1220
+
1221 Approx& epsilon(double newEpsilon);
+
1222
+
1223#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1224 template <typename T>
+
1225 typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type epsilon(
+
1226 const T& newEpsilon) {
+
1227 m_epsilon = static_cast<double>(newEpsilon);
+
1228 return *this;
+
1229 }
+
1230#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1231
+
1232 Approx& scale(double newScale);
+
1233
+
1234#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1235 template <typename T>
+
1236 typename std::enable_if<std::is_constructible<double, T>::value, Approx&>::type scale(
+
1237 const T& newScale) {
+
1238 m_scale = static_cast<double>(newScale);
+
1239 return *this;
+
1240 }
+
1241#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1242
+
1243 // clang-format off
+
1244 DOCTEST_INTERFACE friend bool operator==(double lhs, const Approx & rhs);
+
1245 DOCTEST_INTERFACE friend bool operator==(const Approx & lhs, double rhs);
+
1246 DOCTEST_INTERFACE friend bool operator!=(double lhs, const Approx & rhs);
+
1247 DOCTEST_INTERFACE friend bool operator!=(const Approx & lhs, double rhs);
+
1248 DOCTEST_INTERFACE friend bool operator<=(double lhs, const Approx & rhs);
+
1249 DOCTEST_INTERFACE friend bool operator<=(const Approx & lhs, double rhs);
+
1250 DOCTEST_INTERFACE friend bool operator>=(double lhs, const Approx & rhs);
+
1251 DOCTEST_INTERFACE friend bool operator>=(const Approx & lhs, double rhs);
+
1252 DOCTEST_INTERFACE friend bool operator< (double lhs, const Approx & rhs);
+
1253 DOCTEST_INTERFACE friend bool operator< (const Approx & lhs, double rhs);
+
1254 DOCTEST_INTERFACE friend bool operator> (double lhs, const Approx & rhs);
+
1255 DOCTEST_INTERFACE friend bool operator> (const Approx & lhs, double rhs);
+
1256
+
1257#ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1258#define DOCTEST_APPROX_PREFIX \
+
1259 template <typename T> friend typename std::enable_if<std::is_constructible<double, T>::value, bool>::type
+
1260
+
1261 DOCTEST_APPROX_PREFIX operator==(const T& lhs, const Approx& rhs) { return operator==(static_cast<double>(lhs), rhs); }
+
1262 DOCTEST_APPROX_PREFIX operator==(const Approx& lhs, const T& rhs) { return operator==(rhs, lhs); }
+
1263 DOCTEST_APPROX_PREFIX operator!=(const T& lhs, const Approx& rhs) { return !operator==(lhs, rhs); }
+
1264 DOCTEST_APPROX_PREFIX operator!=(const Approx& lhs, const T& rhs) { return !operator==(rhs, lhs); }
+
1265 DOCTEST_APPROX_PREFIX operator<=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; }
+
1266 DOCTEST_APPROX_PREFIX operator<=(const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; }
+
1267 DOCTEST_APPROX_PREFIX operator>=(const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; }
+
1268 DOCTEST_APPROX_PREFIX operator>=(const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) || lhs == rhs; }
+
1269 DOCTEST_APPROX_PREFIX operator< (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) < rhs.m_value && lhs != rhs; }
+
1270 DOCTEST_APPROX_PREFIX operator< (const Approx& lhs, const T& rhs) { return lhs.m_value < static_cast<double>(rhs) && lhs != rhs; }
+
1271 DOCTEST_APPROX_PREFIX operator> (const T& lhs, const Approx& rhs) { return static_cast<double>(lhs) > rhs.m_value && lhs != rhs; }
+
1272 DOCTEST_APPROX_PREFIX operator> (const Approx& lhs, const T& rhs) { return lhs.m_value > static_cast<double>(rhs) && lhs != rhs; }
+
1273#undef DOCTEST_APPROX_PREFIX
+
1274#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+
1275
+
1276 // clang-format on
+
1277
+
1278 double m_epsilon;
+
1279 double m_scale;
+
1280 double m_value;
+
1281};
+
1282
+
1283DOCTEST_INTERFACE String toString(const Approx& in);
+
1284
+
1285DOCTEST_INTERFACE const ContextOptions* getContextOptions();
+
1286
+
1287template <typename F>
+
1288struct DOCTEST_INTERFACE_DECL IsNaN
+
1289{
+
1290 F value; bool flipped;
+
1291 IsNaN(F f, bool flip = false) : value(f), flipped(flip) { }
+
1292 IsNaN<F> operator!() const { return { value, !flipped }; }
+
1293 operator bool() const;
+
1294};
+
1295#ifndef __MINGW32__
+
1296extern template struct DOCTEST_INTERFACE_DECL IsNaN<float>;
+
1297extern template struct DOCTEST_INTERFACE_DECL IsNaN<double>;
+
1298extern template struct DOCTEST_INTERFACE_DECL IsNaN<long double>;
+
1299#endif
+
1300DOCTEST_INTERFACE String toString(IsNaN<float> in);
+
1301DOCTEST_INTERFACE String toString(IsNaN<double> in);
+
1302DOCTEST_INTERFACE String toString(IsNaN<double long> in);
+
1303
+
1304#ifndef DOCTEST_CONFIG_DISABLE
+
1305
+
1306namespace detail {
+
1307 // clang-format off
+
1308#ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1309 template<class T> struct decay_array { using type = T; };
+
1310 template<class T, unsigned N> struct decay_array<T[N]> { using type = T*; };
+
1311 template<class T> struct decay_array<T[]> { using type = T*; };
+
1312
+
1313 template<class T> struct not_char_pointer { static DOCTEST_CONSTEXPR int value = 1; };
+
1314 template<> struct not_char_pointer<char*> { static DOCTEST_CONSTEXPR int value = 0; };
+
1315 template<> struct not_char_pointer<const char*> { static DOCTEST_CONSTEXPR int value = 0; };
+
1316
+
1317 template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {};
+
1318#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1319 // clang-format on
+
1320
+
1321 struct DOCTEST_INTERFACE TestFailureException
+
1322 {
+
1323 };
+
1324
+
1325 DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at);
+
1326
+
1327#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1328 DOCTEST_NORETURN
+
1329#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1330 DOCTEST_INTERFACE void throwException();
+
1331
+
1332 struct DOCTEST_INTERFACE Subcase
+
1333 {
+
1334 SubcaseSignature m_signature;
+
1335 bool m_entered = false;
+
1336
+
1337 Subcase(const String& name, const char* file, int line);
+
1338 Subcase(const Subcase&) = delete;
+
1339 Subcase(Subcase&&) = delete;
+
1340 Subcase& operator=(const Subcase&) = delete;
+
1341 Subcase& operator=(Subcase&&) = delete;
+
1342 ~Subcase();
+
1343
+
1344 operator bool() const;
+
1345
+
1346 private:
+
1347 bool checkFilters();
+
1348 };
+
1349
+
1350 template <typename L, typename R>
+
1351 String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char* op,
+
1352 const DOCTEST_REF_WRAP(R) rhs) {
+
1353 return (DOCTEST_STRINGIFY(lhs)) + op + (DOCTEST_STRINGIFY(rhs));
+
1354 }
+
1355
+
1356#if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
+
1357DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison")
+
1358#endif
+
1359
+
1360// This will check if there is any way it could find a operator like member or friend and uses it.
+
1361// If not it doesn't find the operator or if the operator at global scope is defined after
+
1362// this template, the template won't be instantiated due to SFINAE. Once the template is not
+
1363// instantiated it can look for global operator using normal conversions.
+
1364#ifdef __NVCC__
+
1365#define SFINAE_OP(ret,op) ret
+
1366#else
+
1367#define SFINAE_OP(ret,op) decltype((void)(doctest::detail::declval<L>() op doctest::detail::declval<R>()),ret{})
+
1368#endif
+
1369
+
1370#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \
+
1371 template <typename R> \
+
1372 DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(R&& rhs) { \
+
1373 bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<R>(rhs)); \
+
1374 if(m_at & assertType::is_false) \
+
1375 res = !res; \
+
1376 if(!res || doctest::getContextOptions()->success) \
+
1377 return Result(res, stringifyBinaryExpr(lhs, op_str, rhs)); \
+
1378 return Result(res); \
+
1379 }
+
1380
+
1381 // more checks could be added - like in Catch:
+
1382 // https://github.com/catchorg/Catch2/pull/1480/files
+
1383 // https://github.com/catchorg/Catch2/pull/1481/files
+
1384#define DOCTEST_FORBIT_EXPRESSION(rt, op) \
+
1385 template <typename R> \
+
1386 rt& operator op(const R&) { \
+
1387 static_assert(deferred_false<R>::value, \
+
1388 "Expression Too Complex Please Rewrite As Binary Comparison!"); \
+
1389 return *this; \
+
1390 }
+
1391
+
1392 struct DOCTEST_INTERFACE Result // NOLINT(*-member-init)
+
1393 {
+
1394 bool m_passed;
+
1395 String m_decomp;
+
1396
+
1397 Result() = default; // TODO: Why do we need this? (To remove NOLINT)
+
1398 Result(bool passed, const String& decomposition = String());
+
1399
+
1400 // forbidding some expressions based on this table: https://en.cppreference.com/w/cpp/language/operator_precedence
+
1401 DOCTEST_FORBIT_EXPRESSION(Result, &)
+
1402 DOCTEST_FORBIT_EXPRESSION(Result, ^)
+
1403 DOCTEST_FORBIT_EXPRESSION(Result, |)
+
1404 DOCTEST_FORBIT_EXPRESSION(Result, &&)
+
1405 DOCTEST_FORBIT_EXPRESSION(Result, ||)
+
1406 DOCTEST_FORBIT_EXPRESSION(Result, ==)
+
1407 DOCTEST_FORBIT_EXPRESSION(Result, !=)
+
1408 DOCTEST_FORBIT_EXPRESSION(Result, <)
+
1409 DOCTEST_FORBIT_EXPRESSION(Result, >)
+
1410 DOCTEST_FORBIT_EXPRESSION(Result, <=)
+
1411 DOCTEST_FORBIT_EXPRESSION(Result, >=)
+
1412 DOCTEST_FORBIT_EXPRESSION(Result, =)
+
1413 DOCTEST_FORBIT_EXPRESSION(Result, +=)
+
1414 DOCTEST_FORBIT_EXPRESSION(Result, -=)
+
1415 DOCTEST_FORBIT_EXPRESSION(Result, *=)
+
1416 DOCTEST_FORBIT_EXPRESSION(Result, /=)
+
1417 DOCTEST_FORBIT_EXPRESSION(Result, %=)
+
1418 DOCTEST_FORBIT_EXPRESSION(Result, <<=)
+
1419 DOCTEST_FORBIT_EXPRESSION(Result, >>=)
+
1420 DOCTEST_FORBIT_EXPRESSION(Result, &=)
+
1421 DOCTEST_FORBIT_EXPRESSION(Result, ^=)
+
1422 DOCTEST_FORBIT_EXPRESSION(Result, |=)
+
1423 };
+
1424
+
1425#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1426
+
1427 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
+
1428 DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
+
1429 DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-compare")
+
1430 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wdouble-promotion")
+
1431 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wconversion")
+
1432 //DOCTEST_CLANG_SUPPRESS_WARNING("-Wfloat-equal")
+
1433
+
1434 DOCTEST_GCC_SUPPRESS_WARNING_PUSH
+
1435 DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
+
1436 DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-compare")
+
1437 //DOCTEST_GCC_SUPPRESS_WARNING("-Wdouble-promotion")
+
1438 //DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
+
1439 //DOCTEST_GCC_SUPPRESS_WARNING("-Wfloat-equal")
+
1440
+
1441 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
+
1442 // https://stackoverflow.com/questions/39479163 what's the difference between 4018 and 4389
+
1443 DOCTEST_MSVC_SUPPRESS_WARNING(4388) // signed/unsigned mismatch
+
1444 DOCTEST_MSVC_SUPPRESS_WARNING(4389) // 'operator' : signed/unsigned mismatch
+
1445 DOCTEST_MSVC_SUPPRESS_WARNING(4018) // 'expression' : signed/unsigned mismatch
+
1446 //DOCTEST_MSVC_SUPPRESS_WARNING(4805) // 'operation' : unsafe mix of type 'type' and type 'type' in operation
+
1447
+
1448#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1449
+
1450 // clang-format off
+
1451#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1452#define DOCTEST_COMPARISON_RETURN_TYPE bool
+
1453#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1454#define DOCTEST_COMPARISON_RETURN_TYPE typename types::enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type
+
1455 inline bool eq(const char* lhs, const char* rhs) { return String(lhs) == String(rhs); }
+
1456 inline bool ne(const char* lhs, const char* rhs) { return String(lhs) != String(rhs); }
+
1457 inline bool lt(const char* lhs, const char* rhs) { return String(lhs) < String(rhs); }
+
1458 inline bool gt(const char* lhs, const char* rhs) { return String(lhs) > String(rhs); }
+
1459 inline bool le(const char* lhs, const char* rhs) { return String(lhs) <= String(rhs); }
+
1460 inline bool ge(const char* lhs, const char* rhs) { return String(lhs) >= String(rhs); }
+
1461#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1462 // clang-format on
+
1463
+
1464#define DOCTEST_RELATIONAL_OP(name, op) \
+
1465 template <typename L, typename R> \
+
1466 DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs, \
+
1467 const DOCTEST_REF_WRAP(R) rhs) { \
+
1468 return lhs op rhs; \
+
1469 }
+
1470
+
1471 DOCTEST_RELATIONAL_OP(eq, ==)
+
1472 DOCTEST_RELATIONAL_OP(ne, !=)
+
1473 DOCTEST_RELATIONAL_OP(lt, <)
+
1474 DOCTEST_RELATIONAL_OP(gt, >)
+
1475 DOCTEST_RELATIONAL_OP(le, <=)
+
1476 DOCTEST_RELATIONAL_OP(ge, >=)
+
1477
+
1478#ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1479#define DOCTEST_CMP_EQ(l, r) l == r
+
1480#define DOCTEST_CMP_NE(l, r) l != r
+
1481#define DOCTEST_CMP_GT(l, r) l > r
+
1482#define DOCTEST_CMP_LT(l, r) l < r
+
1483#define DOCTEST_CMP_GE(l, r) l >= r
+
1484#define DOCTEST_CMP_LE(l, r) l <= r
+
1485#else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1486#define DOCTEST_CMP_EQ(l, r) eq(l, r)
+
1487#define DOCTEST_CMP_NE(l, r) ne(l, r)
+
1488#define DOCTEST_CMP_GT(l, r) gt(l, r)
+
1489#define DOCTEST_CMP_LT(l, r) lt(l, r)
+
1490#define DOCTEST_CMP_GE(l, r) ge(l, r)
+
1491#define DOCTEST_CMP_LE(l, r) le(l, r)
+
1492#endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
+
1493
+
1494 template <typename L>
+
1495 // cppcheck-suppress copyCtorAndEqOperator
+
1496 struct Expression_lhs
+
1497 {
+
1498 L lhs;
+
1499 assertType::Enum m_at;
+
1500
+
1501 explicit Expression_lhs(L&& in, assertType::Enum at)
+
1502 : lhs(static_cast<L&&>(in))
+
1503 , m_at(at) {}
+
1504
+
+
1505 DOCTEST_NOINLINE operator Result() {
+
1506// this is needed only for MSVC 2015
+
1507DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4800) // 'int': forcing value to bool
+
1508 bool res = static_cast<bool>(lhs);
+
1509DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1510 if(m_at & assertType::is_false) {
+
1511 res = !res;
+
1512 }
+
1513
+
1514 if(!res || getContextOptions()->success) {
+
1515 return { res, (DOCTEST_STRINGIFY(lhs)) };
+
1516 }
+
1517 return { res };
+
1518 }
+
+
1519
+
1520 /* This is required for user-defined conversions from Expression_lhs to L */
+
1521 operator L() const { return lhs; }
+
1522
+
1523 // clang-format off
+
1524 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(==, " == ", DOCTEST_CMP_EQ)
+
1525 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(!=, " != ", DOCTEST_CMP_NE)
+
1526 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>, " > ", DOCTEST_CMP_GT)
+
1527 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<, " < ", DOCTEST_CMP_LT)
+
1528 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(>=, " >= ", DOCTEST_CMP_GE)
+
1529 DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(<=, " <= ", DOCTEST_CMP_LE)
+
1530 // clang-format on
+
1531
+
1532 // forbidding some expressions based on this table: https://en.cppreference.com/w/cpp/language/operator_precedence
+
1533 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &)
+
1534 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^)
+
1535 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |)
+
1536 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &&)
+
1537 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ||)
+
1538 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, =)
+
1539 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, +=)
+
1540 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, -=)
+
1541 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, *=)
+
1542 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, /=)
+
1543 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, %=)
+
1544 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<=)
+
1545 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>=)
+
1546 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, &=)
+
1547 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, ^=)
+
1548 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, |=)
+
1549 // these 2 are unfortunate because they should be allowed - they have higher precedence over the comparisons, but the
+
1550 // ExpressionDecomposer class uses the left shift operator to capture the left operand of the binary expression...
+
1551 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, <<)
+
1552 DOCTEST_FORBIT_EXPRESSION(Expression_lhs, >>)
+
1553 };
+
1554
+
1555#ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1556
+
1557 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1558 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1559 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
1560
+
1561#endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
+
1562
+
1563#if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
+
1564DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1565#endif
+
1566
+
1567 struct DOCTEST_INTERFACE ExpressionDecomposer
+
1568 {
+
1569 assertType::Enum m_at;
+
1570
+
1571 ExpressionDecomposer(assertType::Enum at);
+
1572
+
1573 // The right operator for capturing expressions is "<=" instead of "<<" (based on the operator precedence table)
+
1574 // but then there will be warnings from GCC about "-Wparentheses" and since "_Pragma()" is problematic this will stay for now...
+
1575 // https://github.com/catchorg/Catch2/issues/870
+
1576 // https://github.com/catchorg/Catch2/issues/565
+
1577 template <typename L>
+
1578 Expression_lhs<L> operator<<(L&& operand) {
+
1579 return Expression_lhs<L>(static_cast<L&&>(operand), m_at);
+
1580 }
+
1581
+
1582 template <typename L,typename types::enable_if<!doctest::detail::types::is_rvalue_reference<L>::value,void >::type* = nullptr>
+
1583 Expression_lhs<const L&> operator<<(const L &operand) {
+
1584 return Expression_lhs<const L&>(operand, m_at);
+
1585 }
+
1586 };
+
1587
+
1588 struct DOCTEST_INTERFACE TestSuite
+
1589 {
+
1590 const char* m_test_suite = nullptr;
+
1591 const char* m_description = nullptr;
+
1592 bool m_skip = false;
+
1593 bool m_no_breaks = false;
+
1594 bool m_no_output = false;
+
1595 bool m_may_fail = false;
+
1596 bool m_should_fail = false;
+
1597 int m_expected_failures = 0;
+
1598 double m_timeout = 0;
+
1599
+
1600 TestSuite& operator*(const char* in);
+
1601
+
1602 template <typename T>
+
1603 TestSuite& operator*(const T& in) {
+
1604 in.fill(*this);
+
1605 return *this;
+
1606 }
+
1607 };
+
1608
+
1609 using funcType = void (*)();
+
1610
+
1611 struct DOCTEST_INTERFACE TestCase : public TestCaseData
+
1612 {
+
1613 funcType m_test; // a function pointer to the test case
+
1614
+
1615 String m_type; // for templated test cases - gets appended to the real name
+
1616 int m_template_id; // an ID used to distinguish between the different versions of a templated test case
+
1617 String m_full_name; // contains the name (only for templated test cases!) + the template type
+
1618
+
1619 TestCase(funcType test, const char* file, unsigned line, const TestSuite& test_suite,
+
1620 const String& type = String(), int template_id = -1);
+
1621
+
1622 TestCase(const TestCase& other);
+
1623 TestCase(TestCase&&) = delete;
+
1624
+
1625 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(26434) // hides a non-virtual function
+
1626 TestCase& operator=(const TestCase& other);
+
1627 DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1628
+
1629 TestCase& operator=(TestCase&&) = delete;
+
1630
+
1631 TestCase& operator*(const char* in);
+
1632
+
1633 template <typename T>
+
1634 TestCase& operator*(const T& in) {
+
1635 in.fill(*this);
+
1636 return *this;
+
1637 }
+
1638
+
1639 bool operator<(const TestCase& other) const;
+
1640
+
1641 ~TestCase() = default;
+
1642 };
+
1643
+
1644 // forward declarations of functions used by the macros
+
1645 DOCTEST_INTERFACE int regTest(const TestCase& tc);
+
1646 DOCTEST_INTERFACE int setTestSuite(const TestSuite& ts);
+
1647 DOCTEST_INTERFACE bool isDebuggerActive();
+
1648
+
1649 template<typename T>
+
1650 int instantiationHelper(const T&) { return 0; }
+
1651
+
1652 namespace binaryAssertComparison {
+
1653 enum Enum
+
1654 {
+
1655 eq = 0,
+
1656 ne,
+
1657 gt,
+
1658 lt,
+
1659 ge,
+
1660 le
+
1661 };
+
1662 } // namespace binaryAssertComparison
+
1663
+
1664 // clang-format off
+
1665 template <int, class L, class R> struct RelationalComparator { bool operator()(const DOCTEST_REF_WRAP(L), const DOCTEST_REF_WRAP(R) ) const { return false; } };
+
1666
+
1667#define DOCTEST_BINARY_RELATIONAL_OP(n, op) \
+
1668 template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };
+
1669 // clang-format on
+
1670
+
1671 DOCTEST_BINARY_RELATIONAL_OP(0, doctest::detail::eq)
+
1672 DOCTEST_BINARY_RELATIONAL_OP(1, doctest::detail::ne)
+
1673 DOCTEST_BINARY_RELATIONAL_OP(2, doctest::detail::gt)
+
1674 DOCTEST_BINARY_RELATIONAL_OP(3, doctest::detail::lt)
+
1675 DOCTEST_BINARY_RELATIONAL_OP(4, doctest::detail::ge)
+
1676 DOCTEST_BINARY_RELATIONAL_OP(5, doctest::detail::le)
+
1677
+
1678 struct DOCTEST_INTERFACE ResultBuilder : public AssertData
+
1679 {
+
1680 ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1681 const char* exception_type = "", const String& exception_string = "");
+
1682
+
1683 ResultBuilder(assertType::Enum at, const char* file, int line, const char* expr,
+
1684 const char* exception_type, const Contains& exception_string);
+
1685
+
1686 void setResult(const Result& res);
+
1687
+
1688 template <int comparison, typename L, typename R>
+
1689 DOCTEST_NOINLINE bool binary_assert(const DOCTEST_REF_WRAP(L) lhs,
+
1690 const DOCTEST_REF_WRAP(R) rhs) {
+
1691 m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
+
1692 if (m_failed || getContextOptions()->success) {
+
1693 m_decomp = stringifyBinaryExpr(lhs, ", ", rhs);
+
1694 }
+
1695 return !m_failed;
+
1696 }
+
1697
+
1698 template <typename L>
+
+
1699 DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val) {
+
1700 m_failed = !val;
+
1701
+
1702 if (m_at & assertType::is_false) {
+
1703 m_failed = !m_failed;
+
1704 }
+
1705
+
1706 if (m_failed || getContextOptions()->success) {
+
1707 m_decomp = (DOCTEST_STRINGIFY(val));
+
1708 }
+
1709
+
1710 return !m_failed;
+
1711 }
+
+
1712
+
1713 void translateException();
+
1714
+
1715 bool log();
+
1716 void react() const;
+
1717 };
+
1718
+
1719 namespace assertAction {
+
1720 enum Enum
+
1721 {
+
1722 nothing = 0,
+
1723 dbgbreak = 1,
+
1724 shouldthrow = 2
+
1725 };
+
1726 } // namespace assertAction
+
1727
+
1728 DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);
+
1729
+
1730 DOCTEST_INTERFACE bool decomp_assert(assertType::Enum at, const char* file, int line,
+
1731 const char* expr, const Result& result);
+
1732
+
1733#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \
+
1734 do { \
+
1735 if(!is_running_in_test) { \
+
1736 if(failed) { \
+
1737 ResultBuilder rb(at, file, line, expr); \
+
1738 rb.m_failed = failed; \
+
1739 rb.m_decomp = decomp; \
+
1740 failed_out_of_a_testing_context(rb); \
+
1741 if(isDebuggerActive() && !getContextOptions()->no_breaks) \
+
1742 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
1743 if(checkIfShouldThrow(at)) \
+
1744 throwException(); \
+
1745 } \
+
1746 return !failed; \
+
1747 } \
+
1748 } while(false)
+
1749
+
1750#define DOCTEST_ASSERT_IN_TESTS(decomp) \
+
1751 ResultBuilder rb(at, file, line, expr); \
+
1752 rb.m_failed = failed; \
+
1753 if(rb.m_failed || getContextOptions()->success) \
+
1754 rb.m_decomp = decomp; \
+
1755 if(rb.log()) \
+
1756 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
1757 if(rb.m_failed && checkIfShouldThrow(at)) \
+
1758 throwException()
+
1759
+
1760 template <int comparison, typename L, typename R>
+
1761 DOCTEST_NOINLINE bool binary_assert(assertType::Enum at, const char* file, int line,
+
1762 const char* expr, const DOCTEST_REF_WRAP(L) lhs,
+
1763 const DOCTEST_REF_WRAP(R) rhs) {
+
1764 bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
+
1765
+
1766 // ###################################################################################
+
1767 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
1768 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
1769 // ###################################################################################
+
1770 DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
+
1771 DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
+
1772 return !failed;
+
1773 }
+
1774
+
1775 template <typename L>
+
1776 DOCTEST_NOINLINE bool unary_assert(assertType::Enum at, const char* file, int line,
+
1777 const char* expr, const DOCTEST_REF_WRAP(L) val) {
+
1778 bool failed = !val;
+
1779
+
1780 if(at & assertType::is_false)
+
1781 failed = !failed;
+
1782
+
1783 // ###################################################################################
+
1784 // IF THE DEBUGGER BREAKS HERE - GO 1 LEVEL UP IN THE CALLSTACK FOR THE FAILING ASSERT
+
1785 // THIS IS THE EFFECT OF HAVING 'DOCTEST_CONFIG_SUPER_FAST_ASSERTS' DEFINED
+
1786 // ###################################################################################
+
1787 DOCTEST_ASSERT_OUT_OF_TESTS((DOCTEST_STRINGIFY(val)));
+
1788 DOCTEST_ASSERT_IN_TESTS((DOCTEST_STRINGIFY(val)));
+
1789 return !failed;
+
1790 }
+
1791
+
1792 struct DOCTEST_INTERFACE IExceptionTranslator
+
1793 {
+
1794 DOCTEST_DECLARE_INTERFACE(IExceptionTranslator)
+
1795 virtual bool translate(String&) const = 0;
+
1796 };
+
1797
+
1798 template <typename T>
+
1799 class ExceptionTranslator : public IExceptionTranslator
+
1800 {
+
1801 public:
+
1802 explicit ExceptionTranslator(String (*translateFunction)(T))
+
1803 : m_translateFunction(translateFunction) {}
+
1804
+
1805 bool translate(String& res) const override {
+
1806#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
1807 try {
+
1808 throw; // lgtm [cpp/rethrow-no-exception]
+
1809 // cppcheck-suppress catchExceptionByValue
+
1810 } catch(const T& ex) {
+
1811 res = m_translateFunction(ex);
+
1812 return true;
+
1813 } catch(...) {}
+
1814#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
1815 static_cast<void>(res); // to silence -Wunused-parameter
+
1816 return false;
+
1817 }
+
1818
+
1819 private:
+
1820 String (*m_translateFunction)(T);
+
1821 };
+
1822
+
1823 DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator* et);
+
1824
+
1825 // ContextScope base class used to allow implementing methods of ContextScope
+
1826 // that don't depend on the template parameter in doctest.cpp.
+
1827 struct DOCTEST_INTERFACE ContextScopeBase : public IContextScope {
+
1828 ContextScopeBase(const ContextScopeBase&) = delete;
+
1829
+
1830 ContextScopeBase& operator=(const ContextScopeBase&) = delete;
+
1831 ContextScopeBase& operator=(ContextScopeBase&&) = delete;
+
1832
+
1833 ~ContextScopeBase() override = default;
+
1834
+
1835 protected:
+
1836 ContextScopeBase();
+
1837 ContextScopeBase(ContextScopeBase&& other) noexcept;
+
1838
+
1839 void destroy();
+
1840 bool need_to_destroy{true};
+
1841 };
+
1842
+
1843 template <typename L> class ContextScope : public ContextScopeBase
+
1844 {
+
1845 L lambda_;
+
1846
+
1847 public:
+
1848 explicit ContextScope(const L &lambda) : lambda_(lambda) {}
+
1849 explicit ContextScope(L&& lambda) : lambda_(static_cast<L&&>(lambda)) { }
+
1850
+
1851 ContextScope(const ContextScope&) = delete;
+
1852 ContextScope(ContextScope&&) noexcept = default;
+
1853
+
1854 ContextScope& operator=(const ContextScope&) = delete;
+
1855 ContextScope& operator=(ContextScope&&) = delete;
+
1856
+
1857 void stringify(std::ostream* s) const override { lambda_(s); }
+
1858
+
1859 ~ContextScope() override {
+
1860 if (need_to_destroy) {
+
1861 destroy();
+
1862 }
+
1863 }
+
1864 };
+
1865
+
1866 struct DOCTEST_INTERFACE MessageBuilder : public MessageData
+
1867 {
+
1868 std::ostream* m_stream;
+
1869 bool logged = false;
+
1870
+
1871 MessageBuilder(const char* file, int line, assertType::Enum severity);
+
1872
+
1873 MessageBuilder(const MessageBuilder&) = delete;
+
1874 MessageBuilder(MessageBuilder&&) = delete;
+
1875
+
1876 MessageBuilder& operator=(const MessageBuilder&) = delete;
+
1877 MessageBuilder& operator=(MessageBuilder&&) = delete;
+
1878
+
1879 ~MessageBuilder();
+
1880
+
1881 // the preferred way of chaining parameters for stringification
+
1882DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4866)
+
1883 template <typename T>
+
1884 MessageBuilder& operator,(const T& in) {
+
1885 *m_stream << (DOCTEST_STRINGIFY(in));
+
1886 return *this;
+
1887 }
+
1888DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
1889
+
1890 // kept here just for backwards-compatibility - the comma operator should be preferred now
+
1891 template <typename T>
+
1892 MessageBuilder& operator<<(const T& in) { return this->operator,(in); }
+
1893
+
1894 // the `,` operator has the lowest operator precedence - if `<<` is used by the user then
+
1895 // the `,` operator will be called last which is not what we want and thus the `*` operator
+
1896 // is used first (has higher operator precedence compared to `<<`) so that we guarantee that
+
1897 // an operator of the MessageBuilder class is called first before the rest of the parameters
+
1898 template <typename T>
+
1899 MessageBuilder& operator*(const T& in) { return this->operator,(in); }
+
1900
+
1901 bool log();
+
1902 void react();
+
1903 };
+
1904
+
1905 template <typename L>
+
1906 ContextScope<L> MakeContextScope(const L &lambda) {
+
1907 return ContextScope<L>(lambda);
+
1908 }
+
1909} // namespace detail
+
1910
+
1911#define DOCTEST_DEFINE_DECORATOR(name, type, def) \
+
1912 struct name \
+
1913 { \
+
1914 type data; \
+
1915 name(type in = def) \
+
1916 : data(in) {} \
+
1917 void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; } \
+
1918 void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; } \
+
1919 }
+
1920
+
1921DOCTEST_DEFINE_DECORATOR(test_suite, const char*, "");
+
1922DOCTEST_DEFINE_DECORATOR(description, const char*, "");
+
1923DOCTEST_DEFINE_DECORATOR(skip, bool, true);
+
1924DOCTEST_DEFINE_DECORATOR(no_breaks, bool, true);
+
1925DOCTEST_DEFINE_DECORATOR(no_output, bool, true);
+
1926DOCTEST_DEFINE_DECORATOR(timeout, double, 0);
+
1927DOCTEST_DEFINE_DECORATOR(may_fail, bool, true);
+
1928DOCTEST_DEFINE_DECORATOR(should_fail, bool, true);
+
1929DOCTEST_DEFINE_DECORATOR(expected_failures, int, 0);
+
1930
+
1931template <typename T>
+
1932int registerExceptionTranslator(String (*translateFunction)(T)) {
+
1933 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors")
+
1934 static detail::ExceptionTranslator<T> exceptionTranslator(translateFunction);
+
1935 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
1936 detail::registerExceptionTranslatorImpl(&exceptionTranslator);
+
1937 return 0;
+
1938}
+
1939
+
1940} // namespace doctest
+
1941
+
1942// in a separate namespace outside of doctest because the DOCTEST_TEST_SUITE macro
+
1943// introduces an anonymous namespace in which getCurrentTestSuite gets overridden
+
1944namespace doctest_detail_test_suite_ns {
+
1945DOCTEST_INTERFACE doctest::detail::TestSuite& getCurrentTestSuite();
+
1946} // namespace doctest_detail_test_suite_ns
+
1947
+
1948namespace doctest {
+
1949#else // DOCTEST_CONFIG_DISABLE
+
1950template <typename T>
+
1951int registerExceptionTranslator(String (*)(T)) {
+
1952 return 0;
+
1953}
+
1954#endif // DOCTEST_CONFIG_DISABLE
+
1955
+
1956namespace detail {
+
1957 using assert_handler = void (*)(const AssertData&);
+
1958 struct ContextState;
+
1959} // namespace detail
+
1960
+
1961class DOCTEST_INTERFACE Context
+
1962{
+
1963 detail::ContextState* p;
+
1964
+
1965 void parseArgs(int argc, const char* const* argv, bool withDefaults = false);
+
1966
+
1967public:
+
1968 explicit Context(int argc = 0, const char* const* argv = nullptr);
+
1969
+
1970 Context(const Context&) = delete;
+
1971 Context(Context&&) = delete;
+
1972
+
1973 Context& operator=(const Context&) = delete;
+
1974 Context& operator=(Context&&) = delete;
+
1975
+
1976 ~Context(); // NOLINT(performance-trivially-destructible)
+
1977
+
1978 void applyCommandLine(int argc, const char* const* argv);
+
1979
+
1980 void addFilter(const char* filter, const char* value);
+
1981 void clearFilters();
+
1982 void setOption(const char* option, bool value);
+
1983 void setOption(const char* option, int value);
+
1984 void setOption(const char* option, const char* value);
+
1985
+
1986 bool shouldExit();
+
1987
+
1988 void setAsDefaultForAssertsOutOfTestCases();
+
1989
+
1990 void setAssertHandler(detail::assert_handler ah);
+
1991
+
1992 void setCout(std::ostream* out);
+
1993
+
1994 int run();
+
1995};
+
1996
+
1997namespace TestCaseFailureReason {
+
1998 enum Enum
+
1999 {
+
2000 None = 0,
+
2001 AssertFailure = 1, // an assertion has failed in the test case
+
2002 Exception = 2, // test case threw an exception
+
2003 Crash = 4, // a crash...
+
2004 TooManyFailedAsserts = 8, // the abort-after option
+
2005 Timeout = 16, // see the timeout decorator
+
2006 ShouldHaveFailedButDidnt = 32, // see the should_fail decorator
+
2007 ShouldHaveFailedAndDid = 64, // see the should_fail decorator
+
2008 DidntFailExactlyNumTimes = 128, // see the expected_failures decorator
+
2009 FailedExactlyNumTimes = 256, // see the expected_failures decorator
+
2010 CouldHaveFailedAndDid = 512 // see the may_fail decorator
+
2011 };
+
2012} // namespace TestCaseFailureReason
+
2013
+
2014struct DOCTEST_INTERFACE CurrentTestCaseStats
+
2015{
+
2016 int numAssertsCurrentTest;
+
2017 int numAssertsFailedCurrentTest;
+
2018 double seconds;
+
2019 int failure_flags; // use TestCaseFailureReason::Enum
+
2020 bool testCaseSuccess;
+
2021};
+
2022
+
2023struct DOCTEST_INTERFACE TestCaseException
+
2024{
+
2025 String error_string;
+
2026 bool is_crash;
+
2027};
+
2028
+
2029struct DOCTEST_INTERFACE TestRunStats
+
2030{
+
2031 unsigned numTestCases;
+
2032 unsigned numTestCasesPassingFilters;
+
2033 unsigned numTestSuitesPassingFilters;
+
2034 unsigned numTestCasesFailed;
+
2035 int numAsserts;
+
2036 int numAssertsFailed;
+
2037};
+
2038
+
2039struct QueryData
+
2040{
+
2041 const TestRunStats* run_stats = nullptr;
+
2042 const TestCaseData** data = nullptr;
+
2043 unsigned num_data = 0;
+
2044};
+
2045
+
2046struct DOCTEST_INTERFACE IReporter
+
2047{
+
2048 // The constructor has to accept "const ContextOptions&" as a single argument
+
2049 // which has most of the options for the run + a pointer to the stdout stream
+
2050 // Reporter(const ContextOptions& in)
+
2051
+
2052 // called when a query should be reported (listing test cases, printing the version, etc.)
+
2053 virtual void report_query(const QueryData&) = 0;
+
2054
+
2055 // called when the whole test run starts
+
2056 virtual void test_run_start() = 0;
+
2057 // called when the whole test run ends (caching a pointer to the input doesn't make sense here)
+
2058 virtual void test_run_end(const TestRunStats&) = 0;
+
2059
+
2060 // called when a test case is started (safe to cache a pointer to the input)
+
2061 virtual void test_case_start(const TestCaseData&) = 0;
+
2062 // called when a test case is reentered because of unfinished subcases (safe to cache a pointer to the input)
+
2063 virtual void test_case_reenter(const TestCaseData&) = 0;
+
2064 // called when a test case has ended
+
2065 virtual void test_case_end(const CurrentTestCaseStats&) = 0;
+
2066
+
2067 // called when an exception is thrown from the test case (or it crashes)
+
2068 virtual void test_case_exception(const TestCaseException&) = 0;
+
2069
+
2070 // called whenever a subcase is entered (don't cache pointers to the input)
+
2071 virtual void subcase_start(const SubcaseSignature&) = 0;
+
2072 // called whenever a subcase is exited (don't cache pointers to the input)
+
2073 virtual void subcase_end() = 0;
+
2074
+
2075 // called for each assert (don't cache pointers to the input)
+
2076 virtual void log_assert(const AssertData&) = 0;
+
2077 // called for each message (don't cache pointers to the input)
+
2078 virtual void log_message(const MessageData&) = 0;
+
2079
+
2080 // called when a test case is skipped either because it doesn't pass the filters, has a skip decorator
+
2081 // or isn't in the execution range (between first and last) (safe to cache a pointer to the input)
+
2082 virtual void test_case_skipped(const TestCaseData&) = 0;
+
2083
+
2084 DOCTEST_DECLARE_INTERFACE(IReporter)
+
2085
+
2086 // can obtain all currently active contexts and stringify them if one wishes to do so
+
2087 static int get_num_active_contexts();
+
2088 static const IContextScope* const* get_active_contexts();
+
2089
+
2090 // can iterate through contexts which have been stringified automatically in their destructors when an exception has been thrown
+
2091 static int get_num_stringified_contexts();
+
2092 static const String* get_stringified_contexts();
+
2093};
+
2094
+
2095namespace detail {
+
2096 using reporterCreatorFunc = IReporter* (*)(const ContextOptions&);
+
2097
+
2098 DOCTEST_INTERFACE void registerReporterImpl(const char* name, int prio, reporterCreatorFunc c, bool isReporter);
+
2099
+
2100 template <typename Reporter>
+
2101 IReporter* reporterCreator(const ContextOptions& o) {
+
2102 return new Reporter(o);
+
2103 }
+
2104} // namespace detail
+
2105
+
2106template <typename Reporter>
+
2107int registerReporter(const char* name, int priority, bool isReporter) {
+
2108 detail::registerReporterImpl(name, priority, detail::reporterCreator<Reporter>, isReporter);
+
2109 return 0;
+
2110}
+
2111} // namespace doctest
+
2112
+
2113#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
+
2114#define DOCTEST_FUNC_EMPTY [] { return false; }()
+
2115#else
+
2116#define DOCTEST_FUNC_EMPTY (void)0
+
2117#endif
+
2118
+
2119// if registering is not disabled
+
2120#ifndef DOCTEST_CONFIG_DISABLE
+
2121
+
2122#ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
+
2123#define DOCTEST_FUNC_SCOPE_BEGIN [&]
+
2124#define DOCTEST_FUNC_SCOPE_END ()
+
2125#define DOCTEST_FUNC_SCOPE_RET(v) return v
+
2126#else
+
2127#define DOCTEST_FUNC_SCOPE_BEGIN do
+
2128#define DOCTEST_FUNC_SCOPE_END while(false)
+
2129#define DOCTEST_FUNC_SCOPE_RET(v) (void)0
+
2130#endif
+
2131
+
2132// common code in asserts - for convenience
+
2133#define DOCTEST_ASSERT_LOG_REACT_RETURN(b) \
+
2134 if(b.log()) DOCTEST_BREAK_INTO_DEBUGGER(); \
+
2135 b.react(); \
+
2136 DOCTEST_FUNC_SCOPE_RET(!b.m_failed)
+
2137
+
2138#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2139#define DOCTEST_WRAP_IN_TRY(x) x;
+
2140#else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2141#define DOCTEST_WRAP_IN_TRY(x) \
+
2142 try { \
+
2143 x; \
+
2144 } catch(...) { DOCTEST_RB.translateException(); }
+
2145#endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
+
2146
+
2147#ifdef DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2148#define DOCTEST_CAST_TO_VOID(...) \
+
2149 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wuseless-cast") \
+
2150 static_cast<void>(__VA_ARGS__); \
+
2151 DOCTEST_GCC_SUPPRESS_WARNING_POP
+
2152#else // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2153#define DOCTEST_CAST_TO_VOID(...) __VA_ARGS__;
+
2154#endif // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
+
2155
+
2156// registers the test by initializing a dummy var with a function
+
2157#define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators) \
+
2158 global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT */ \
+
2159 doctest::detail::regTest( \
+
2160 doctest::detail::TestCase( \
+
2161 f, __FILE__, __LINE__, \
+
2162 doctest_detail_test_suite_ns::getCurrentTestSuite()) * \
+
2163 decorators))
+
2164
+
2165#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators) \
+
2166 namespace { /* NOLINT */ \
+
2167 struct der : public base \
+
2168 { \
+
2169 void f(); \
+
2170 }; \
+
2171 static DOCTEST_INLINE_NOINLINE void func() { \
+
2172 der v; \
+
2173 v.f(); \
+
2174 } \
+
2175 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \
+
2176 } \
+
2177 DOCTEST_INLINE_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers)
+
2178
+
2179#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \
+
2180 static void f(); \
+
2181 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, f, decorators) \
+
2182 static void f()
+
2183
+
2184#define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators) \
+
2185 static doctest::detail::funcType proxy() { return f; } \
+
2186 DOCTEST_REGISTER_FUNCTION(inline, proxy(), decorators) \
+
2187 static void f()
+
2188
+
2189// for registering tests
+
2190#define DOCTEST_TEST_CASE(decorators) \
+
2191 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
+
2192
+
2193// for registering tests in classes - requires C++17 for inline variables!
+
2194#if DOCTEST_CPLUSPLUS >= 201703L
+
2195#define DOCTEST_TEST_CASE_CLASS(decorators) \
+
2196 DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), \
+
2197 DOCTEST_ANONYMOUS(DOCTEST_ANON_PROXY_), \
+
2198 decorators)
+
2199#else // DOCTEST_TEST_CASE_CLASS
+
2200#define DOCTEST_TEST_CASE_CLASS(...) \
+
2201 TEST_CASES_CAN_BE_REGISTERED_IN_CLASSES_ONLY_IN_CPP17_MODE_OR_WITH_VS_2017_OR_NEWER
+
2202#endif // DOCTEST_TEST_CASE_CLASS
+
2203
+
2204// for registering tests with a fixture
+
2205#define DOCTEST_TEST_CASE_FIXTURE(c, decorators) \
+
2206 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), c, \
+
2207 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
+
2208
+
2209// for converting types to strings without the <typeinfo> header and demangling
+
2210#define DOCTEST_TYPE_TO_STRING_AS(str, ...) \
+
2211 namespace doctest { \
+
2212 template <> \
+
2213 inline String toString<__VA_ARGS__>() { \
+
2214 return str; \
+
2215 } \
+
2216 } \
+
2217 static_assert(true, "")
+
2218
+
2219#define DOCTEST_TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING_AS(#__VA_ARGS__, __VA_ARGS__)
+
2220
+
2221#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func) \
+
2222 template <typename T> \
+
2223 static void func(); \
+
2224 namespace { /* NOLINT */ \
+
2225 template <typename Tuple> \
+
2226 struct iter; \
+
2227 template <typename Type, typename... Rest> \
+
2228 struct iter<std::tuple<Type, Rest...>> \
+
2229 { \
+
2230 iter(const char* file, unsigned line, int index) { \
+
2231 doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line, \
+
2232 doctest_detail_test_suite_ns::getCurrentTestSuite(), \
+
2233 doctest::toString<Type>(), \
+
2234 int(line) * 1000 + index) \
+
2235 * dec); \
+
2236 iter<std::tuple<Rest...>>(file, line, index + 1); \
+
2237 } \
+
2238 }; \
+
2239 template <> \
+
2240 struct iter<std::tuple<>> \
+
2241 { \
+
2242 iter(const char*, unsigned, int) {} \
+
2243 }; \
+
2244 } \
+
2245 template <typename T> \
+
2246 static void func()
+
2247
+
2248#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id) \
+
2249 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(id, ITERATOR), \
+
2250 DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_))
+
2251
+
2252#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...) \
+
2253 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY), /* NOLINT(cert-err58-cpp, fuchsia-statically-constructed-objects) */ \
+
2254 doctest::detail::instantiationHelper( \
+
2255 DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0)))
+
2256
+
2257#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) \
+
2258 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), std::tuple<__VA_ARGS__>) \
+
2259 static_assert(true, "")
+
2260
+
2261#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) \
+
2262 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__) \
+
2263 static_assert(true, "")
+
2264
+
2265#define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...) \
+
2266 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(anon, ITERATOR), anon); \
+
2267 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, std::tuple<__VA_ARGS__>) \
+
2268 template <typename T> \
+
2269 static void anon()
+
2270
+
2271#define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...) \
+
2272 DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__)
+
2273
+
2274// for subcases
+
2275#define DOCTEST_SUBCASE(name) \
+
2276 if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \
+
2277 doctest::detail::Subcase(name, __FILE__, __LINE__))
+
2278
+
2279// for grouping tests in test suites by using code blocks
+
2280#define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name) \
+
2281 namespace ns_name { namespace doctest_detail_test_suite_ns { \
+
2282 static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() noexcept { \
+
2283 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640) \
+
2284 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors") \
+
2285 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmissing-field-initializers") \
+
2286 static doctest::detail::TestSuite data{}; \
+
2287 static bool inited = false; \
+
2288 DOCTEST_MSVC_SUPPRESS_WARNING_POP \
+
2289 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
+
2290 DOCTEST_GCC_SUPPRESS_WARNING_POP \
+
2291 if(!inited) { \
+
2292 data* decorators; \
+
2293 inited = true; \
+
2294 } \
+
2295 return data; \
+
2296 } \
+
2297 } \
+
2298 } \
+
2299 namespace ns_name
+
2300
+
2301#define DOCTEST_TEST_SUITE(decorators) \
+
2302 DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(DOCTEST_ANON_SUITE_))
+
2303
+
2304// for starting a testsuite block
+
2305#define DOCTEST_TEST_SUITE_BEGIN(decorators) \
+
2306 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \
+
2307 doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators)) \
+
2308 static_assert(true, "")
+
2309
+
2310// for ending a testsuite block
+
2311#define DOCTEST_TEST_SUITE_END \
+
2312 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), /* NOLINT(cert-err58-cpp) */ \
+
2313 doctest::detail::setTestSuite(doctest::detail::TestSuite() * "")) \
+
2314 using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
+
2315
+
2316// for registering exception translators
+
2317#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature) \
+
2318 inline doctest::String translatorName(signature); \
+
2319 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), /* NOLINT(cert-err58-cpp) */ \
+
2320 doctest::registerExceptionTranslator(translatorName)) \
+
2321 doctest::String translatorName(signature)
+
2322
+
2323#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
+
2324 DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), \
+
2325 signature)
+
2326
+
2327// for registering reporters
+
2328#define DOCTEST_REGISTER_REPORTER(name, priority, reporter) \
+
2329 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \
+
2330 doctest::registerReporter<reporter>(name, priority, true)) \
+
2331 static_assert(true, "")
+
2332
+
2333// for registering listeners
+
2334#define DOCTEST_REGISTER_LISTENER(name, priority, reporter) \
+
2335 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), /* NOLINT(cert-err58-cpp) */ \
+
2336 doctest::registerReporter<reporter>(name, priority, false)) \
+
2337 static_assert(true, "")
+
2338
+
2339// clang-format off
+
2340// for logging - disabling formatting because it's important to have these on 2 separate lines - see PR #557
+
2341#define DOCTEST_INFO(...) \
+
2342 DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_), \
+
2343 DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_OTHER_), \
+
2344 __VA_ARGS__)
+
2345// clang-format on
+
2346
+
2347#define DOCTEST_INFO_IMPL(mb_name, s_name, ...) \
+
2348 auto DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_) = doctest::detail::MakeContextScope( \
+
2349 [&](std::ostream* s_name) { \
+
2350 doctest::detail::MessageBuilder mb_name(__FILE__, __LINE__, doctest::assertType::is_warn); \
+
2351 mb_name.m_stream = s_name; \
+
2352 mb_name * __VA_ARGS__; \
+
2353 })
+
2354
+
2355#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x)
+
2356
+
2357#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \
+
2358 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2359 doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \
+
2360 mb * __VA_ARGS__; \
+
2361 if(mb.log()) \
+
2362 DOCTEST_BREAK_INTO_DEBUGGER(); \
+
2363 mb.react(); \
+
2364 } DOCTEST_FUNC_SCOPE_END
+
2365
+
2366// clang-format off
+
2367#define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2368#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2369#define DOCTEST_ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
+
2370// clang-format on
+
2371
+
2372#define DOCTEST_MESSAGE(...) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2373#define DOCTEST_FAIL_CHECK(...) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2374#define DOCTEST_FAIL(...) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, __VA_ARGS__)
+
2375
+
2376#define DOCTEST_TO_LVALUE(...) __VA_ARGS__ // Not removed to keep backwards compatibility.
+
2377
+
2378#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2379
+
2380#define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...) \
+
2381 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
+
2382 /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \
+
2383 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2384 __LINE__, #__VA_ARGS__); \
+
2385 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \
+
2386 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
+
2387 << __VA_ARGS__)) /* NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) */ \
+
2388 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB) \
+
2389 DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
2390
+
2391#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
+
2392 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2393 DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \
+
2394 } DOCTEST_FUNC_SCOPE_END // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
+
2395
+
2396#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \
+
2397 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2398 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2399 __LINE__, #__VA_ARGS__); \
+
2400 DOCTEST_WRAP_IN_TRY( \
+
2401 DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \
+
2402 __VA_ARGS__)) \
+
2403 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2404 } DOCTEST_FUNC_SCOPE_END
+
2405
+
2406#define DOCTEST_UNARY_ASSERT(assert_type, ...) \
+
2407 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2408 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2409 __LINE__, #__VA_ARGS__); \
+
2410 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \
+
2411 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2412 } DOCTEST_FUNC_SCOPE_END
+
2413
+
2414#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2415
+
2416// necessary for <ASSERT>_MESSAGE
+
2417#define DOCTEST_ASSERT_IMPLEMENT_2 DOCTEST_ASSERT_IMPLEMENT_1
+
2418
+
2419#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
+
2420 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
+
2421 doctest::detail::decomp_assert( \
+
2422 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, \
+
2423 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
+
2424 << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
2425
+
2426#define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \
+
2427 doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \
+
2428 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)
+
2429
+
2430#define DOCTEST_UNARY_ASSERT(assert_type, ...) \
+
2431 doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \
+
2432 #__VA_ARGS__, __VA_ARGS__)
+
2433
+
2434#endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
+
2435
+
2436#define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)
+
2437#define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)
+
2438#define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)
+
2439#define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)
+
2440#define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)
+
2441#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
+
2442
+
2443// clang-format off
+
2444#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } DOCTEST_FUNC_SCOPE_END
+
2445#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } DOCTEST_FUNC_SCOPE_END
+
2446#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } DOCTEST_FUNC_SCOPE_END
+
2447#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2448#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2449#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
+
2450// clang-format on
+
2451
+
2452#define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)
+
2453#define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)
+
2454#define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)
+
2455#define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)
+
2456#define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)
+
2457#define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)
+
2458#define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)
+
2459#define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)
+
2460#define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)
+
2461#define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)
+
2462#define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)
+
2463#define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)
+
2464#define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)
+
2465#define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)
+
2466#define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)
+
2467#define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)
+
2468#define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)
+
2469#define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)
+
2470
+
2471#define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)
+
2472#define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)
+
2473#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)
+
2474#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)
+
2475#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)
+
2476#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)
+
2477
+
2478#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2479
+
2480#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \
+
2481 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2482 if(!doctest::getContextOptions()->no_throw) { \
+
2483 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2484 __LINE__, #expr, #__VA_ARGS__, message); \
+
2485 try { \
+
2486 DOCTEST_CAST_TO_VOID(expr) \
+
2487 } catch(const typename doctest::detail::types::remove_const< \
+
2488 typename doctest::detail::types::remove_reference<__VA_ARGS__>::type>::type&) {\
+
2489 DOCTEST_RB.translateException(); \
+
2490 DOCTEST_RB.m_threw_as = true; \
+
2491 } catch(...) { DOCTEST_RB.translateException(); } \
+
2492 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2493 } else { /* NOLINT(*-else-after-return) */ \
+
2494 DOCTEST_FUNC_SCOPE_RET(false); \
+
2495 } \
+
2496 } DOCTEST_FUNC_SCOPE_END
+
2497
+
2498#define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \
+
2499 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2500 if(!doctest::getContextOptions()->no_throw) { \
+
2501 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2502 __LINE__, expr_str, "", __VA_ARGS__); \
+
2503 try { \
+
2504 DOCTEST_CAST_TO_VOID(expr) \
+
2505 } catch(...) { DOCTEST_RB.translateException(); } \
+
2506 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2507 } else { /* NOLINT(*-else-after-return) */ \
+
2508 DOCTEST_FUNC_SCOPE_RET(false); \
+
2509 } \
+
2510 } DOCTEST_FUNC_SCOPE_END
+
2511
+
2512#define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \
+
2513 DOCTEST_FUNC_SCOPE_BEGIN { \
+
2514 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
+
2515 __LINE__, #__VA_ARGS__); \
+
2516 try { \
+
2517 DOCTEST_CAST_TO_VOID(__VA_ARGS__) \
+
2518 } catch(...) { DOCTEST_RB.translateException(); } \
+
2519 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
+
2520 } DOCTEST_FUNC_SCOPE_END
+
2521
+
2522// clang-format off
+
2523#define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "")
+
2524#define DOCTEST_CHECK_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_CHECK_THROWS, "")
+
2525#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_REQUIRE_THROWS, "")
+
2526
+
2527#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, "", __VA_ARGS__)
+
2528#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, "", __VA_ARGS__)
+
2529#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, "", __VA_ARGS__)
+
2530
+
2531#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_WARN_THROWS_WITH, __VA_ARGS__)
+
2532#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)
+
2533#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)
+
2534
+
2535#define DOCTEST_WARN_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_WITH_AS, message, __VA_ARGS__)
+
2536#define DOCTEST_CHECK_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_WITH_AS, message, __VA_ARGS__)
+
2537#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_WITH_AS, message, __VA_ARGS__)
+
2538
+
2539#define DOCTEST_WARN_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_WARN_NOTHROW, __VA_ARGS__)
+
2540#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__)
+
2541#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__)
+
2542
+
2543#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2544#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2545#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
+
2546#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2547#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2548#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
+
2549#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2550#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2551#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
+
2552#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2553#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2554#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
+
2555#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2556#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2557#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
+
2558// clang-format on
+
2559
+
2560#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2561
+
2562// =================================================================================================
+
2563// == WHAT FOLLOWS IS VERSIONS OF THE MACROS THAT DO NOT DO ANY REGISTERING! ==
+
2564// == THIS CAN BE ENABLED BY DEFINING DOCTEST_CONFIG_DISABLE GLOBALLY! ==
+
2565// =================================================================================================
+
2566#else // DOCTEST_CONFIG_DISABLE
+
2567
+
2568#define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name) \
+
2569 namespace /* NOLINT */ { \
+
2570 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2571 struct der : public base \
+
2572 { void f(); }; \
+
2573 } \
+
2574 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2575 inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()
+
2576
+
2577#define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name) \
+
2578 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2579 static inline void f()
+
2580
+
2581// for registering tests
+
2582#define DOCTEST_TEST_CASE(name) \
+
2583 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2584
+
2585// for registering tests in classes
+
2586#define DOCTEST_TEST_CASE_CLASS(name) \
+
2587 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2588
+
2589// for registering tests with a fixture
+
2590#define DOCTEST_TEST_CASE_FIXTURE(x, name) \
+
2591 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), x, \
+
2592 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
+
2593
+
2594// for converting types to strings without the <typeinfo> header and demangling
+
2595#define DOCTEST_TYPE_TO_STRING_AS(str, ...) static_assert(true, "")
+
2596#define DOCTEST_TYPE_TO_STRING(...) static_assert(true, "")
+
2597
+
2598// for typed tests
+
2599#define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...) \
+
2600 template <typename type> \
+
2601 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
+
2602
+
2603#define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id) \
+
2604 template <typename type> \
+
2605 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
+
2606
+
2607#define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) static_assert(true, "")
+
2608#define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) static_assert(true, "")
+
2609
+
2610// for subcases
+
2611#define DOCTEST_SUBCASE(name)
+
2612
+
2613// for a testsuite block
+
2614#define DOCTEST_TEST_SUITE(name) namespace // NOLINT
+
2615
+
2616// for starting a testsuite block
+
2617#define DOCTEST_TEST_SUITE_BEGIN(name) static_assert(true, "")
+
2618
+
2619// for ending a testsuite block
+
2620#define DOCTEST_TEST_SUITE_END using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
+
2621
+
2622#define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
+
2623 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
+
2624 static inline doctest::String DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_)(signature)
+
2625
+
2626#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
+
2627#define DOCTEST_REGISTER_LISTENER(name, priority, reporter)
+
2628
+
2629#define DOCTEST_INFO(...) (static_cast<void>(0))
+
2630#define DOCTEST_CAPTURE(x) (static_cast<void>(0))
+
2631#define DOCTEST_ADD_MESSAGE_AT(file, line, ...) (static_cast<void>(0))
+
2632#define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) (static_cast<void>(0))
+
2633#define DOCTEST_ADD_FAIL_AT(file, line, ...) (static_cast<void>(0))
+
2634#define DOCTEST_MESSAGE(...) (static_cast<void>(0))
+
2635#define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0))
+
2636#define DOCTEST_FAIL(...) (static_cast<void>(0))
+
2637
+
2638#if defined(DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED) \
+
2639 && defined(DOCTEST_CONFIG_ASSERTS_RETURN_VALUES)
+
2640
+
2641#define DOCTEST_WARN(...) [&] { return __VA_ARGS__; }()
+
2642#define DOCTEST_CHECK(...) [&] { return __VA_ARGS__; }()
+
2643#define DOCTEST_REQUIRE(...) [&] { return __VA_ARGS__; }()
+
2644#define DOCTEST_WARN_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2645#define DOCTEST_CHECK_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2646#define DOCTEST_REQUIRE_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2647
+
2648#define DOCTEST_WARN_MESSAGE(cond, ...) [&] { return cond; }()
+
2649#define DOCTEST_CHECK_MESSAGE(cond, ...) [&] { return cond; }()
+
2650#define DOCTEST_REQUIRE_MESSAGE(cond, ...) [&] { return cond; }()
+
2651#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2652#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2653#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
+
2654
+
2655namespace doctest {
+
2656namespace detail {
+
2657#define DOCTEST_RELATIONAL_OP(name, op) \
+
2658 template <typename L, typename R> \
+
2659 bool name(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) { return lhs op rhs; }
+
2660
+
2661 DOCTEST_RELATIONAL_OP(eq, ==)
+
2662 DOCTEST_RELATIONAL_OP(ne, !=)
+
2663 DOCTEST_RELATIONAL_OP(lt, <)
+
2664 DOCTEST_RELATIONAL_OP(gt, >)
+
2665 DOCTEST_RELATIONAL_OP(le, <=)
+
2666 DOCTEST_RELATIONAL_OP(ge, >=)
+
2667} // namespace detail
+
2668} // namespace doctest
+
2669
+
2670#define DOCTEST_WARN_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2671#define DOCTEST_CHECK_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2672#define DOCTEST_REQUIRE_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
+
2673#define DOCTEST_WARN_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2674#define DOCTEST_CHECK_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2675#define DOCTEST_REQUIRE_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
+
2676#define DOCTEST_WARN_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2677#define DOCTEST_CHECK_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2678#define DOCTEST_REQUIRE_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
+
2679#define DOCTEST_WARN_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2680#define DOCTEST_CHECK_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2681#define DOCTEST_REQUIRE_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
+
2682#define DOCTEST_WARN_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2683#define DOCTEST_CHECK_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2684#define DOCTEST_REQUIRE_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
+
2685#define DOCTEST_WARN_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2686#define DOCTEST_CHECK_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2687#define DOCTEST_REQUIRE_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
+
2688#define DOCTEST_WARN_UNARY(...) [&] { return __VA_ARGS__; }()
+
2689#define DOCTEST_CHECK_UNARY(...) [&] { return __VA_ARGS__; }()
+
2690#define DOCTEST_REQUIRE_UNARY(...) [&] { return __VA_ARGS__; }()
+
2691#define DOCTEST_WARN_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2692#define DOCTEST_CHECK_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2693#define DOCTEST_REQUIRE_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
+
2694
+
2695#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2696
+
2697#define DOCTEST_WARN_THROWS_WITH(expr, with, ...) [] { static_assert(false, "Exception translation is not available when doctest is disabled."); return false; }()
+
2698#define DOCTEST_CHECK_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2699#define DOCTEST_REQUIRE_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2700#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2701#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2702#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2703
+
2704#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2705#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2706#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2707#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2708#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2709#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
+
2710
+
2711#define DOCTEST_WARN_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2712#define DOCTEST_CHECK_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2713#define DOCTEST_REQUIRE_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2714#define DOCTEST_WARN_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2715#define DOCTEST_CHECK_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2716#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2717#define DOCTEST_WARN_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2718#define DOCTEST_CHECK_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2719#define DOCTEST_REQUIRE_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2720
+
2721#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2722#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2723#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
+
2724#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2725#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2726#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
+
2727#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2728#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2729#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
+
2730
+
2731#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2732
+
2733#else // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
+
2734
+
2735#define DOCTEST_WARN(...) DOCTEST_FUNC_EMPTY
+
2736#define DOCTEST_CHECK(...) DOCTEST_FUNC_EMPTY
+
2737#define DOCTEST_REQUIRE(...) DOCTEST_FUNC_EMPTY
+
2738#define DOCTEST_WARN_FALSE(...) DOCTEST_FUNC_EMPTY
+
2739#define DOCTEST_CHECK_FALSE(...) DOCTEST_FUNC_EMPTY
+
2740#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_FUNC_EMPTY
+
2741
+
2742#define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2743#define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2744#define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2745#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2746#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2747#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
+
2748
+
2749#define DOCTEST_WARN_EQ(...) DOCTEST_FUNC_EMPTY
+
2750#define DOCTEST_CHECK_EQ(...) DOCTEST_FUNC_EMPTY
+
2751#define DOCTEST_REQUIRE_EQ(...) DOCTEST_FUNC_EMPTY
+
2752#define DOCTEST_WARN_NE(...) DOCTEST_FUNC_EMPTY
+
2753#define DOCTEST_CHECK_NE(...) DOCTEST_FUNC_EMPTY
+
2754#define DOCTEST_REQUIRE_NE(...) DOCTEST_FUNC_EMPTY
+
2755#define DOCTEST_WARN_GT(...) DOCTEST_FUNC_EMPTY
+
2756#define DOCTEST_CHECK_GT(...) DOCTEST_FUNC_EMPTY
+
2757#define DOCTEST_REQUIRE_GT(...) DOCTEST_FUNC_EMPTY
+
2758#define DOCTEST_WARN_LT(...) DOCTEST_FUNC_EMPTY
+
2759#define DOCTEST_CHECK_LT(...) DOCTEST_FUNC_EMPTY
+
2760#define DOCTEST_REQUIRE_LT(...) DOCTEST_FUNC_EMPTY
+
2761#define DOCTEST_WARN_GE(...) DOCTEST_FUNC_EMPTY
+
2762#define DOCTEST_CHECK_GE(...) DOCTEST_FUNC_EMPTY
+
2763#define DOCTEST_REQUIRE_GE(...) DOCTEST_FUNC_EMPTY
+
2764#define DOCTEST_WARN_LE(...) DOCTEST_FUNC_EMPTY
+
2765#define DOCTEST_CHECK_LE(...) DOCTEST_FUNC_EMPTY
+
2766#define DOCTEST_REQUIRE_LE(...) DOCTEST_FUNC_EMPTY
+
2767
+
2768#define DOCTEST_WARN_UNARY(...) DOCTEST_FUNC_EMPTY
+
2769#define DOCTEST_CHECK_UNARY(...) DOCTEST_FUNC_EMPTY
+
2770#define DOCTEST_REQUIRE_UNARY(...) DOCTEST_FUNC_EMPTY
+
2771#define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2772#define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2773#define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
+
2774
+
2775#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2776
+
2777#define DOCTEST_WARN_THROWS(...) DOCTEST_FUNC_EMPTY
+
2778#define DOCTEST_CHECK_THROWS(...) DOCTEST_FUNC_EMPTY
+
2779#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_FUNC_EMPTY
+
2780#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2781#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2782#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
+
2783#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2784#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2785#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
+
2786#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2787#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2788#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2789#define DOCTEST_WARN_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2790#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2791#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_FUNC_EMPTY
+
2792
+
2793#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2794#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2795#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2796#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2797#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2798#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
+
2799#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2800#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2801#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
+
2802#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2803#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2804#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
+
2805#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2806#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2807#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
+
2808
+
2809#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2810
+
2811#endif // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
+
2812
+
2813#endif // DOCTEST_CONFIG_DISABLE
+
2814
+
2815#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS
+
2816
+
2817#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2818#define DOCTEST_EXCEPTION_EMPTY_FUNC DOCTEST_FUNC_EMPTY
+
2819#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2820#define DOCTEST_EXCEPTION_EMPTY_FUNC [] { static_assert(false, "Exceptions are disabled! " \
+
2821 "Use DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS if you want to compile with exceptions disabled."); return false; }()
+
2822
+
2823#undef DOCTEST_REQUIRE
+
2824#undef DOCTEST_REQUIRE_FALSE
+
2825#undef DOCTEST_REQUIRE_MESSAGE
+
2826#undef DOCTEST_REQUIRE_FALSE_MESSAGE
+
2827#undef DOCTEST_REQUIRE_EQ
+
2828#undef DOCTEST_REQUIRE_NE
+
2829#undef DOCTEST_REQUIRE_GT
+
2830#undef DOCTEST_REQUIRE_LT
+
2831#undef DOCTEST_REQUIRE_GE
+
2832#undef DOCTEST_REQUIRE_LE
+
2833#undef DOCTEST_REQUIRE_UNARY
+
2834#undef DOCTEST_REQUIRE_UNARY_FALSE
+
2835
+
2836#define DOCTEST_REQUIRE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2837#define DOCTEST_REQUIRE_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2838#define DOCTEST_REQUIRE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2839#define DOCTEST_REQUIRE_FALSE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2840#define DOCTEST_REQUIRE_EQ DOCTEST_EXCEPTION_EMPTY_FUNC
+
2841#define DOCTEST_REQUIRE_NE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2842#define DOCTEST_REQUIRE_GT DOCTEST_EXCEPTION_EMPTY_FUNC
+
2843#define DOCTEST_REQUIRE_LT DOCTEST_EXCEPTION_EMPTY_FUNC
+
2844#define DOCTEST_REQUIRE_GE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2845#define DOCTEST_REQUIRE_LE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2846#define DOCTEST_REQUIRE_UNARY DOCTEST_EXCEPTION_EMPTY_FUNC
+
2847#define DOCTEST_REQUIRE_UNARY_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
+
2848
+
2849#endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
+
2850
+
2851#define DOCTEST_WARN_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2852#define DOCTEST_CHECK_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2853#define DOCTEST_REQUIRE_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2854#define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2855#define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2856#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2857#define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2858#define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2859#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2860#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2861#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2862#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2863#define DOCTEST_WARN_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2864#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2865#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2866
+
2867#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2868#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2869#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2870#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2871#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2872#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2873#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2874#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2875#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2876#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2877#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2878#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2879#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2880#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2881#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
+
2882
+
2883#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
+
2884
+
2885// clang-format off
+
2886// KEPT FOR BACKWARDS COMPATIBILITY - FORWARDING TO THE RIGHT MACROS
+
2887#define DOCTEST_FAST_WARN_EQ DOCTEST_WARN_EQ
+
2888#define DOCTEST_FAST_CHECK_EQ DOCTEST_CHECK_EQ
+
2889#define DOCTEST_FAST_REQUIRE_EQ DOCTEST_REQUIRE_EQ
+
2890#define DOCTEST_FAST_WARN_NE DOCTEST_WARN_NE
+
2891#define DOCTEST_FAST_CHECK_NE DOCTEST_CHECK_NE
+
2892#define DOCTEST_FAST_REQUIRE_NE DOCTEST_REQUIRE_NE
+
2893#define DOCTEST_FAST_WARN_GT DOCTEST_WARN_GT
+
2894#define DOCTEST_FAST_CHECK_GT DOCTEST_CHECK_GT
+
2895#define DOCTEST_FAST_REQUIRE_GT DOCTEST_REQUIRE_GT
+
2896#define DOCTEST_FAST_WARN_LT DOCTEST_WARN_LT
+
2897#define DOCTEST_FAST_CHECK_LT DOCTEST_CHECK_LT
+
2898#define DOCTEST_FAST_REQUIRE_LT DOCTEST_REQUIRE_LT
+
2899#define DOCTEST_FAST_WARN_GE DOCTEST_WARN_GE
+
2900#define DOCTEST_FAST_CHECK_GE DOCTEST_CHECK_GE
+
2901#define DOCTEST_FAST_REQUIRE_GE DOCTEST_REQUIRE_GE
+
2902#define DOCTEST_FAST_WARN_LE DOCTEST_WARN_LE
+
2903#define DOCTEST_FAST_CHECK_LE DOCTEST_CHECK_LE
+
2904#define DOCTEST_FAST_REQUIRE_LE DOCTEST_REQUIRE_LE
+
2905
+
2906#define DOCTEST_FAST_WARN_UNARY DOCTEST_WARN_UNARY
+
2907#define DOCTEST_FAST_CHECK_UNARY DOCTEST_CHECK_UNARY
+
2908#define DOCTEST_FAST_REQUIRE_UNARY DOCTEST_REQUIRE_UNARY
+
2909#define DOCTEST_FAST_WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE
+
2910#define DOCTEST_FAST_CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE
+
2911#define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
+
2912
+
2913#define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id,__VA_ARGS__)
+
2914// clang-format on
+
2915
+
2916// BDD style macros
+
2917// clang-format off
+
2918#define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE(" Scenario: " name)
+
2919#define DOCTEST_SCENARIO_CLASS(name) DOCTEST_TEST_CASE_CLASS(" Scenario: " name)
+
2920#define DOCTEST_SCENARIO_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(" Scenario: " name, T, __VA_ARGS__)
+
2921#define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(" Scenario: " name, T, id)
+
2922
+
2923#define DOCTEST_GIVEN(name) DOCTEST_SUBCASE(" Given: " name)
+
2924#define DOCTEST_WHEN(name) DOCTEST_SUBCASE(" When: " name)
+
2925#define DOCTEST_AND_WHEN(name) DOCTEST_SUBCASE("And when: " name)
+
2926#define DOCTEST_THEN(name) DOCTEST_SUBCASE(" Then: " name)
+
2927#define DOCTEST_AND_THEN(name) DOCTEST_SUBCASE(" And: " name)
+
2928// clang-format on
+
2929
+
2930// == SHORT VERSIONS OF THE MACROS
+
2931#ifndef DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
2932
+
2933#define TEST_CASE(name) DOCTEST_TEST_CASE(name)
+
2934#define TEST_CASE_CLASS(name) DOCTEST_TEST_CASE_CLASS(name)
+
2935#define TEST_CASE_FIXTURE(x, name) DOCTEST_TEST_CASE_FIXTURE(x, name)
+
2936#define TYPE_TO_STRING_AS(str, ...) DOCTEST_TYPE_TO_STRING_AS(str, __VA_ARGS__)
+
2937#define TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING(__VA_ARGS__)
+
2938#define TEST_CASE_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(name, T, __VA_ARGS__)
+
2939#define TEST_CASE_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, T, id)
+
2940#define TEST_CASE_TEMPLATE_INVOKE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, __VA_ARGS__)
+
2941#define TEST_CASE_TEMPLATE_APPLY(id, ...) DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, __VA_ARGS__)
+
2942#define SUBCASE(name) DOCTEST_SUBCASE(name)
+
2943#define TEST_SUITE(decorators) DOCTEST_TEST_SUITE(decorators)
+
2944#define TEST_SUITE_BEGIN(name) DOCTEST_TEST_SUITE_BEGIN(name)
+
2945#define TEST_SUITE_END DOCTEST_TEST_SUITE_END
+
2946#define REGISTER_EXCEPTION_TRANSLATOR(signature) DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)
+
2947#define REGISTER_REPORTER(name, priority, reporter) DOCTEST_REGISTER_REPORTER(name, priority, reporter)
+
2948#define REGISTER_LISTENER(name, priority, reporter) DOCTEST_REGISTER_LISTENER(name, priority, reporter)
+
2949#define INFO(...) DOCTEST_INFO(__VA_ARGS__)
+
2950#define CAPTURE(x) DOCTEST_CAPTURE(x)
+
2951#define ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_MESSAGE_AT(file, line, __VA_ARGS__)
+
2952#define ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_FAIL_CHECK_AT(file, line, __VA_ARGS__)
+
2953#define ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_FAIL_AT(file, line, __VA_ARGS__)
+
2954#define MESSAGE(...) DOCTEST_MESSAGE(__VA_ARGS__)
+
2955#define FAIL_CHECK(...) DOCTEST_FAIL_CHECK(__VA_ARGS__)
+
2956#define FAIL(...) DOCTEST_FAIL(__VA_ARGS__)
+
2957#define TO_LVALUE(...) DOCTEST_TO_LVALUE(__VA_ARGS__)
+
2958
+
2959#define WARN(...) DOCTEST_WARN(__VA_ARGS__)
+
2960#define WARN_FALSE(...) DOCTEST_WARN_FALSE(__VA_ARGS__)
+
2961#define WARN_THROWS(...) DOCTEST_WARN_THROWS(__VA_ARGS__)
+
2962#define WARN_THROWS_AS(expr, ...) DOCTEST_WARN_THROWS_AS(expr, __VA_ARGS__)
+
2963#define WARN_THROWS_WITH(expr, ...) DOCTEST_WARN_THROWS_WITH(expr, __VA_ARGS__)
+
2964#define WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_WARN_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2965#define WARN_NOTHROW(...) DOCTEST_WARN_NOTHROW(__VA_ARGS__)
+
2966#define CHECK(...) DOCTEST_CHECK(__VA_ARGS__)
+
2967#define CHECK_FALSE(...) DOCTEST_CHECK_FALSE(__VA_ARGS__)
+
2968#define CHECK_THROWS(...) DOCTEST_CHECK_THROWS(__VA_ARGS__)
+
2969#define CHECK_THROWS_AS(expr, ...) DOCTEST_CHECK_THROWS_AS(expr, __VA_ARGS__)
+
2970#define CHECK_THROWS_WITH(expr, ...) DOCTEST_CHECK_THROWS_WITH(expr, __VA_ARGS__)
+
2971#define CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2972#define CHECK_NOTHROW(...) DOCTEST_CHECK_NOTHROW(__VA_ARGS__)
+
2973#define REQUIRE(...) DOCTEST_REQUIRE(__VA_ARGS__)
+
2974#define REQUIRE_FALSE(...) DOCTEST_REQUIRE_FALSE(__VA_ARGS__)
+
2975#define REQUIRE_THROWS(...) DOCTEST_REQUIRE_THROWS(__VA_ARGS__)
+
2976#define REQUIRE_THROWS_AS(expr, ...) DOCTEST_REQUIRE_THROWS_AS(expr, __VA_ARGS__)
+
2977#define REQUIRE_THROWS_WITH(expr, ...) DOCTEST_REQUIRE_THROWS_WITH(expr, __VA_ARGS__)
+
2978#define REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, __VA_ARGS__)
+
2979#define REQUIRE_NOTHROW(...) DOCTEST_REQUIRE_NOTHROW(__VA_ARGS__)
+
2980
+
2981#define WARN_MESSAGE(cond, ...) DOCTEST_WARN_MESSAGE(cond, __VA_ARGS__)
+
2982#define WARN_FALSE_MESSAGE(cond, ...) DOCTEST_WARN_FALSE_MESSAGE(cond, __VA_ARGS__)
+
2983#define WARN_THROWS_MESSAGE(expr, ...) DOCTEST_WARN_THROWS_MESSAGE(expr, __VA_ARGS__)
+
2984#define WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
2985#define WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
2986#define WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
2987#define WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_WARN_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
2988#define CHECK_MESSAGE(cond, ...) DOCTEST_CHECK_MESSAGE(cond, __VA_ARGS__)
+
2989#define CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_CHECK_FALSE_MESSAGE(cond, __VA_ARGS__)
+
2990#define CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_CHECK_THROWS_MESSAGE(expr, __VA_ARGS__)
+
2991#define CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
2992#define CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
2993#define CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
2994#define CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_CHECK_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
2995#define REQUIRE_MESSAGE(cond, ...) DOCTEST_REQUIRE_MESSAGE(cond, __VA_ARGS__)
+
2996#define REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_REQUIRE_FALSE_MESSAGE(cond, __VA_ARGS__)
+
2997#define REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_REQUIRE_THROWS_MESSAGE(expr, __VA_ARGS__)
+
2998#define REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
+
2999#define REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
+
3000#define REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
+
3001#define REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, __VA_ARGS__)
+
3002
+
3003#define SCENARIO(name) DOCTEST_SCENARIO(name)
+
3004#define SCENARIO_CLASS(name) DOCTEST_SCENARIO_CLASS(name)
+
3005#define SCENARIO_TEMPLATE(name, T, ...) DOCTEST_SCENARIO_TEMPLATE(name, T, __VA_ARGS__)
+
3006#define SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id)
+
3007#define GIVEN(name) DOCTEST_GIVEN(name)
+
3008#define WHEN(name) DOCTEST_WHEN(name)
+
3009#define AND_WHEN(name) DOCTEST_AND_WHEN(name)
+
3010#define THEN(name) DOCTEST_THEN(name)
+
3011#define AND_THEN(name) DOCTEST_AND_THEN(name)
+
3012
+
3013#define WARN_EQ(...) DOCTEST_WARN_EQ(__VA_ARGS__)
+
3014#define CHECK_EQ(...) DOCTEST_CHECK_EQ(__VA_ARGS__)
+
3015#define REQUIRE_EQ(...) DOCTEST_REQUIRE_EQ(__VA_ARGS__)
+
3016#define WARN_NE(...) DOCTEST_WARN_NE(__VA_ARGS__)
+
3017#define CHECK_NE(...) DOCTEST_CHECK_NE(__VA_ARGS__)
+
3018#define REQUIRE_NE(...) DOCTEST_REQUIRE_NE(__VA_ARGS__)
+
3019#define WARN_GT(...) DOCTEST_WARN_GT(__VA_ARGS__)
+
3020#define CHECK_GT(...) DOCTEST_CHECK_GT(__VA_ARGS__)
+
3021#define REQUIRE_GT(...) DOCTEST_REQUIRE_GT(__VA_ARGS__)
+
3022#define WARN_LT(...) DOCTEST_WARN_LT(__VA_ARGS__)
+
3023#define CHECK_LT(...) DOCTEST_CHECK_LT(__VA_ARGS__)
+
3024#define REQUIRE_LT(...) DOCTEST_REQUIRE_LT(__VA_ARGS__)
+
3025#define WARN_GE(...) DOCTEST_WARN_GE(__VA_ARGS__)
+
3026#define CHECK_GE(...) DOCTEST_CHECK_GE(__VA_ARGS__)
+
3027#define REQUIRE_GE(...) DOCTEST_REQUIRE_GE(__VA_ARGS__)
+
3028#define WARN_LE(...) DOCTEST_WARN_LE(__VA_ARGS__)
+
3029#define CHECK_LE(...) DOCTEST_CHECK_LE(__VA_ARGS__)
+
3030#define REQUIRE_LE(...) DOCTEST_REQUIRE_LE(__VA_ARGS__)
+
3031#define WARN_UNARY(...) DOCTEST_WARN_UNARY(__VA_ARGS__)
+
3032#define CHECK_UNARY(...) DOCTEST_CHECK_UNARY(__VA_ARGS__)
+
3033#define REQUIRE_UNARY(...) DOCTEST_REQUIRE_UNARY(__VA_ARGS__)
+
3034#define WARN_UNARY_FALSE(...) DOCTEST_WARN_UNARY_FALSE(__VA_ARGS__)
+
3035#define CHECK_UNARY_FALSE(...) DOCTEST_CHECK_UNARY_FALSE(__VA_ARGS__)
+
3036#define REQUIRE_UNARY_FALSE(...) DOCTEST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
+
3037
+
3038// KEPT FOR BACKWARDS COMPATIBILITY
+
3039#define FAST_WARN_EQ(...) DOCTEST_FAST_WARN_EQ(__VA_ARGS__)
+
3040#define FAST_CHECK_EQ(...) DOCTEST_FAST_CHECK_EQ(__VA_ARGS__)
+
3041#define FAST_REQUIRE_EQ(...) DOCTEST_FAST_REQUIRE_EQ(__VA_ARGS__)
+
3042#define FAST_WARN_NE(...) DOCTEST_FAST_WARN_NE(__VA_ARGS__)
+
3043#define FAST_CHECK_NE(...) DOCTEST_FAST_CHECK_NE(__VA_ARGS__)
+
3044#define FAST_REQUIRE_NE(...) DOCTEST_FAST_REQUIRE_NE(__VA_ARGS__)
+
3045#define FAST_WARN_GT(...) DOCTEST_FAST_WARN_GT(__VA_ARGS__)
+
3046#define FAST_CHECK_GT(...) DOCTEST_FAST_CHECK_GT(__VA_ARGS__)
+
3047#define FAST_REQUIRE_GT(...) DOCTEST_FAST_REQUIRE_GT(__VA_ARGS__)
+
3048#define FAST_WARN_LT(...) DOCTEST_FAST_WARN_LT(__VA_ARGS__)
+
3049#define FAST_CHECK_LT(...) DOCTEST_FAST_CHECK_LT(__VA_ARGS__)
+
3050#define FAST_REQUIRE_LT(...) DOCTEST_FAST_REQUIRE_LT(__VA_ARGS__)
+
3051#define FAST_WARN_GE(...) DOCTEST_FAST_WARN_GE(__VA_ARGS__)
+
3052#define FAST_CHECK_GE(...) DOCTEST_FAST_CHECK_GE(__VA_ARGS__)
+
3053#define FAST_REQUIRE_GE(...) DOCTEST_FAST_REQUIRE_GE(__VA_ARGS__)
+
3054#define FAST_WARN_LE(...) DOCTEST_FAST_WARN_LE(__VA_ARGS__)
+
3055#define FAST_CHECK_LE(...) DOCTEST_FAST_CHECK_LE(__VA_ARGS__)
+
3056#define FAST_REQUIRE_LE(...) DOCTEST_FAST_REQUIRE_LE(__VA_ARGS__)
+
3057
+
3058#define FAST_WARN_UNARY(...) DOCTEST_FAST_WARN_UNARY(__VA_ARGS__)
+
3059#define FAST_CHECK_UNARY(...) DOCTEST_FAST_CHECK_UNARY(__VA_ARGS__)
+
3060#define FAST_REQUIRE_UNARY(...) DOCTEST_FAST_REQUIRE_UNARY(__VA_ARGS__)
+
3061#define FAST_WARN_UNARY_FALSE(...) DOCTEST_FAST_WARN_UNARY_FALSE(__VA_ARGS__)
+
3062#define FAST_CHECK_UNARY_FALSE(...) DOCTEST_FAST_CHECK_UNARY_FALSE(__VA_ARGS__)
+
3063#define FAST_REQUIRE_UNARY_FALSE(...) DOCTEST_FAST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
+
3064
+
3065#define TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, __VA_ARGS__)
+
3066
+
3067#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
3068
+
3069#ifndef DOCTEST_CONFIG_DISABLE
+
3070
+
3071// this is here to clear the 'current test suite' for the current translation unit - at the top
+
3072DOCTEST_TEST_SUITE_END();
+
3073
+
3074#endif // DOCTEST_CONFIG_DISABLE
+
3075
+
3076DOCTEST_CLANG_SUPPRESS_WARNING_POP
+
3077DOCTEST_MSVC_SUPPRESS_WARNING_POP
+
3078DOCTEST_GCC_SUPPRESS_WARNING_POP
+
3079
+
3080DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
+
3081
+
3082#endif // DOCTEST_LIBRARY_INCLUDED
+
Definition doctest.h:530
+
Definition how_subcases_work.cpp:32
+
Definition doctest.h:1571
+
Definition doctest.h:1500
+
DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val)
Definition doctest_fwd.h:1699
+
Definition doctest.h:1396
+
Definition doctest.h:1592
+
Definition doctest_fwd.h:1147
+ +
+ + + + diff --git a/git-main/doctest__mpi_8h_source.html b/git-main/doctest__mpi_8h_source.html new file mode 100644 index 0000000..7f2120e --- /dev/null +++ b/git-main/doctest__mpi_8h_source.html @@ -0,0 +1,273 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/extensions/doctest_mpi.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest_mpi.h
+
+
+
1#ifndef DOCTEST_MPI_H
+
2#define DOCTEST_MPI_H
+
3
+
4#ifdef DOCTEST_CONFIG_IMPLEMENT
+
5
+
6#include "doctest/extensions/mpi_sub_comm.h"
+
7#include "mpi_reporter.h"
+
8#include <unordered_map>
+
9
+
10namespace doctest {
+
11
+
12// Each time a MPI_TEST_CASE is executed on N procs,
+
13// we need a sub-communicator of N procs to execute it.
+
14// It is then registered here and can be re-used
+
15// by other tests that requires a sub-comm of the same size
+
16std::unordered_map<int,mpi_sub_comm> sub_comms_by_size;
+
17
+
18// Record if at least one MPI_TEST_CASE was registered "skipped"
+
19// because there is not enought procs to execute it
+
20int nb_test_cases_skipped_insufficient_procs = 0;
+
21
+
22
+
23std::string thread_level_to_string(int thread_lvl);
+
24int mpi_init_thread(int argc, char *argv[], int required_thread_support);
+
25void mpi_finalize();
+
26
+
27
+
28// Can be safely called before MPI_Init()
+
29// This is needed for MPI_TEST_CASE because we use doctest::skip()
+
30// to prevent execution of tests where there is not enough procs,
+
31// but doctest::skip() is called during test registration, that is, before main(), and hence before MPI_Init()
+
32int mpi_comm_world_size() {
+
33 #if defined(OPEN_MPI)
+
34 const char* size_str = std::getenv("OMPI_COMM_WORLD_SIZE");
+
35 #elif defined(I_MPI_VERSION) || defined(MPI_VERSION) // Intel MPI + MPICH (at least)
+
36 const char* size_str = std::getenv("PMI_SIZE"); // see https://community.intel.com/t5/Intel-oneAPI-HPC-Toolkit/Environment-variables-defined-by-intel-mpirun/td-p/1096703
+
37 #else
+
38 #error "Unknown MPI implementation: please submit an issue or a PR to doctest. Meanwhile, you can look at the output of e.g. `mpirun -np 3 env` to search for an environnement variable that contains the size of MPI_COMM_WORLD and extend this code accordingly"
+
39 #endif
+
40 if (size_str==nullptr) return 1; // not launched with mpirun/mpiexec, so assume only one process
+
41 return std::stoi(size_str);
+
42}
+
43
+
44// Record size of MPI_COMM_WORLD with mpi_comm_world_size()
+
45int world_size_before_init = mpi_comm_world_size();
+
46
+
47
+
48std::string thread_level_to_string(int thread_lvl) {
+
49 switch (thread_lvl) {
+
50 case MPI_THREAD_SINGLE: return "MPI_THREAD_SINGLE";
+
51 case MPI_THREAD_FUNNELED: return "MPI_THREAD_FUNNELED";
+
52 case MPI_THREAD_SERIALIZED: return "MPI_THREAD_SERIALIZED";
+
53 case MPI_THREAD_MULTIPLE: return "MPI_THREAD_MULTIPLE";
+
54 default: return "Invalid MPI thread level";
+
55 }
+
56}
+
57int mpi_init_thread(int argc, char *argv[], int required_thread_support) {
+
58 int provided_thread_support;
+
59 MPI_Init_thread(&argc, &argv, required_thread_support, &provided_thread_support);
+
60
+
61 int world_size;
+
62 MPI_Comm_size(MPI_COMM_WORLD,&world_size);
+
63 if (world_size_before_init != world_size) {
+
64 DOCTEST_INTERNAL_ERROR(
+
65 "doctest found "+std::to_string(world_size_before_init)+" MPI processes before `MPI_Init_thread`,"
+
66 " but MPI_COMM_WORLD is actually of size "+std::to_string(world_size)+".\n"
+
67 "This is most likely due to your MPI implementation not being well supported by doctest. Please report this issue on GitHub"
+
68 );
+
69 }
+
70
+
71 if (provided_thread_support!=required_thread_support) {
+
72 std::cout <<
+
73 "WARNING: " + thread_level_to_string(required_thread_support) + " was asked, "
+
74 + "but only " + thread_level_to_string(provided_thread_support) + " is provided by the MPI library\n";
+
75 }
+
76 return provided_thread_support;
+
77}
+
78void mpi_finalize() {
+
79 // We need to destroy all created sub-communicators before calling MPI_Finalize()
+
80 doctest::sub_comms_by_size.clear();
+
81 MPI_Finalize();
+
82}
+
83
+
84} // doctest
+
85
+
86#else // DOCTEST_CONFIG_IMPLEMENT
+
87
+
88#include "doctest/extensions/mpi_sub_comm.h"
+
89#include <unordered_map>
+
90#include <exception>
+
91
+
92namespace doctest {
+
93
+
94extern std::unordered_map<int,mpi_sub_comm> sub_comms_by_size;
+
95extern int nb_test_cases_skipped_insufficient_procs;
+
96extern int world_size_before_init;
+
97int mpi_comm_world_size();
+
98
+
99int mpi_init_thread(int argc, char *argv[], int required_thread_support);
+
100void mpi_finalize();
+
101
+
102template<int nb_procs, class F>
+
103void execute_mpi_test_case(F func) {
+
104 auto it = sub_comms_by_size.find(nb_procs);
+
105 if (it==end(sub_comms_by_size)) {
+
106 bool was_emplaced = false;
+
107 std::tie(it,was_emplaced) = sub_comms_by_size.emplace(std::make_pair(nb_procs,mpi_sub_comm(nb_procs)));
+
108 assert(was_emplaced);
+
109 }
+
110 const mpi_sub_comm& sub = it->second;
+
111 if (sub.comm != MPI_COMM_NULL) {
+
112 func(sub.rank,nb_procs,sub.comm,std::integral_constant<int,nb_procs>{});
+
113 };
+
114}
+
115
+
116inline bool
+
117insufficient_procs(int test_nb_procs) {
+
118 static const int world_size = mpi_comm_world_size();
+
119 bool insufficient = test_nb_procs>world_size;
+
120 if (insufficient) {
+
121 ++nb_test_cases_skipped_insufficient_procs;
+
122 }
+
123 return insufficient;
+
124}
+
125
+
126} // doctest
+
127
+
128
+
129#define DOCTEST_MPI_GEN_ASSERTION(rank_to_test, assertion, ...) \
+
130 static_assert(rank_to_test<test_nb_procs_as_int_constant.value,"Trying to assert on a rank greater than the number of procs of the test!"); \
+
131 if(rank_to_test == test_rank) assertion(__VA_ARGS__)
+
132
+
133#define DOCTEST_MPI_WARN(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_WARN,__VA_ARGS__)
+
134#define DOCTEST_MPI_CHECK(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_CHECK,__VA_ARGS__)
+
135#define DOCTEST_MPI_REQUIRE(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_REQUIRE,__VA_ARGS__)
+
136#define DOCTEST_MPI_WARN_FALSE(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_WARN_FALSE,__VA_ARGS__)
+
137#define DOCTEST_MPI_CHECK_FALSE(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_CHECK_FALSE,__VA_ARGS__)
+
138#define DOCTEST_MPI_REQUIRE_FALSE(rank_to_test, ...) DOCTEST_MPI_GEN_ASSERTION(rank_to_test,DOCTEST_REQUIRE_FALSE,__VA_ARGS__)
+
139
+
140#define DOCTEST_CREATE_MPI_TEST_CASE(name,nb_procs,func) \
+
141 static void func(DOCTEST_UNUSED int test_rank, DOCTEST_UNUSED int test_nb_procs, DOCTEST_UNUSED MPI_Comm test_comm, DOCTEST_UNUSED std::integral_constant<int,nb_procs>); \
+
142 TEST_CASE(name * doctest::description("MPI_TEST_CASE") * doctest::skip(doctest::insufficient_procs(nb_procs))) { \
+
143 doctest::execute_mpi_test_case<nb_procs>(func); \
+
144 } \
+
145 static void func(DOCTEST_UNUSED int test_rank, DOCTEST_UNUSED int test_nb_procs, DOCTEST_UNUSED MPI_Comm test_comm, DOCTEST_UNUSED std::integral_constant<int,nb_procs> test_nb_procs_as_int_constant)
+
146 // DOC: test_rank, test_nb_procs, and test_comm are available UNDER THESE SPECIFIC NAMES in the body of the unit test
+
147 // DOC: test_nb_procs_as_int_constant is equal to test_nb_procs, but as a compile time value
+
148 // (used in CHECK-like macros to assert the checked rank exists)
+
149
+
150#define DOCTEST_MPI_TEST_CASE(name,nb_procs) \
+
151 DOCTEST_CREATE_MPI_TEST_CASE(name,nb_procs,DOCTEST_ANONYMOUS(DOCTEST_MPI_FUNC))
+
152
+
153
+
154// == SHORT VERSIONS OF THE MACROS
+
155#if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES)
+
156#define MPI_WARN DOCTEST_MPI_WARN
+
157#define MPI_CHECK DOCTEST_MPI_CHECK
+
158#define MPI_REQUIRE DOCTEST_MPI_REQUIRE
+
159#define MPI_WARN_FALSE DOCTEST_MPI_WARN_FALSE
+
160#define MPI_CHECK_FALSE DOCTEST_MPI_CHECK_FALSE
+
161#define MPI_REQUIRE_FALSE DOCTEST_MPI_REQUIRE_FALSE
+
162
+
163#define MPI_TEST_CASE DOCTEST_MPI_TEST_CASE
+
164#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
165
+
166
+
167#endif // DOCTEST_CONFIG_IMPLEMENT
+
168
+
169#endif // DOCTEST_MPI_H
+
+ + + + diff --git a/git-main/doctest__proxy_8h_source.html b/git-main/doctest__proxy_8h_source.html new file mode 100644 index 0000000..f0b7466 --- /dev/null +++ b/git-main/doctest__proxy_8h_source.html @@ -0,0 +1,175 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/doctest_proxy.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest_proxy.h
+
+
+
1#ifndef DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
2#define DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
3#endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
+
4
+
5// no guard for including the doctest header itself because it should support multiple inclusion
+
6#include <doctest/doctest.h>
+
7
+
8#ifndef MY_PROXY_MACROS
+
9#define MY_PROXY_MACROS
+
10
+
11#define my_testcase DOCTEST_TEST_CASE
+
12#define my_testcase_class DOCTEST_TEST_CASE_CLASS
+
13#define my_testcase_fixture DOCTEST_TEST_CASE_FIXTURE
+
14#define my_subcase DOCTEST_SUBCASE
+
15#define my_testsuite DOCTEST_TEST_SUITE
+
16#define my_testsuite_begin DOCTEST_TEST_SUITE_BEGIN
+
17#define my_testsuite_end DOCTEST_TEST_SUITE_END
+
18#define my_warn DOCTEST_WARN
+
19#define my_warn_false DOCTEST_WARN_FALSE
+
20#define my_warn_throws DOCTEST_WARN_THROWS
+
21#define my_warn_throws_as DOCTEST_WARN_THROWS_AS
+
22#define my_warn_throws_with DOCTEST_WARN_THROWS_WITH
+
23#define my_warn_throws_with_as DOCTEST_WARN_THROWS_WITH_AS
+
24#define my_warn_nothrow DOCTEST_WARN_NOTHROW
+
25#define my_check DOCTEST_CHECK
+
26#define my_check_false DOCTEST_CHECK_FALSE
+
27#define my_check_throws DOCTEST_CHECK_THROWS
+
28#define my_check_throws_as DOCTEST_CHECK_THROWS_AS
+
29#define my_check_throws_with DOCTEST_CHECK_THROWS_WITH
+
30#define my_check_throws_with_as DOCTEST_CHECK_THROWS_WITH_AS
+
31#define my_check_nothrow DOCTEST_CHECK_NOTHROW
+
32#define my_require DOCTEST_REQUIRE
+
33#define my_require_false DOCTEST_REQUIRE_FALSE
+
34#define my_require_throws DOCTEST_REQUIRE_THROWS
+
35#define my_require_throws_as DOCTEST_REQUIRE_THROWS_AS
+
36#define my_require_throws_with_as DOCTEST_REQUIRE_THROWS_WITH_AS
+
37#define my_require_nothrow DOCTEST_REQUIRE_NOTHROW
+
38
+
39#define my_scenario DOCTEST_SCENARIO
+
40#define my_given DOCTEST_GIVEN
+
41#define my_when DOCTEST_WHEN
+
42#define my_and_when DOCTEST_AND_WHEN
+
43#define my_then DOCTEST_THEN
+
44#define my_and_then DOCTEST_AND_THEN
+
45
+
46#define my_warn_eq DOCTEST_WARN_EQ
+
47#define my_check_eq DOCTEST_CHECK_EQ
+
48#define my_require_eq DOCTEST_REQUIRE_EQ
+
49#define my_warn_ne DOCTEST_WARN_NE
+
50#define my_check_ne DOCTEST_CHECK_NE
+
51#define my_require_ne DOCTEST_REQUIRE_NE
+
52#define my_warn_gt DOCTEST_WARN_GT
+
53#define my_check_gt DOCTEST_CHECK_GT
+
54#define my_require_gt DOCTEST_REQUIRE_GT
+
55#define my_warn_lt DOCTEST_WARN_LT
+
56#define my_check_lt DOCTEST_CHECK_LT
+
57#define my_require_lt DOCTEST_REQUIRE_LT
+
58#define my_warn_ge DOCTEST_WARN_GE
+
59#define my_check_ge DOCTEST_CHECK_GE
+
60#define my_require_ge DOCTEST_REQUIRE_GE
+
61#define my_warn_le DOCTEST_WARN_LE
+
62#define my_check_le DOCTEST_CHECK_LE
+
63#define my_require_le DOCTEST_REQUIRE_LE
+
64#define my_warn_unary DOCTEST_WARN_UNARY
+
65#define my_check_unary DOCTEST_CHECK_UNARY
+
66#define my_require_unary DOCTEST_REQUIRE_UNARY
+
67#define my_warn_unary_false DOCTEST_WARN_UNARY_FALSE
+
68#define my_check_unary_false DOCTEST_CHECK_UNARY_FALSE
+
69#define my_require_unary_false DOCTEST_REQUIRE_UNARY_FALSE
+
70
+
71#endif // MY_PROXY_MACROS
+
+ + + + diff --git a/git-main/doctest__util_8h_source.html b/git-main/doctest__util_8h_source.html new file mode 100644 index 0000000..6ddf06b --- /dev/null +++ b/git-main/doctest__util_8h_source.html @@ -0,0 +1,142 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/extensions/doctest_util.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest_util.h
+
+
+
1//
+
2// doctest_util.h - an accompanying extensions header to the main doctest.h header
+
3//
+
4// Copyright (c) 2016-2023 Viktor Kirilov
+
5//
+
6// Distributed under the MIT Software License
+
7// See accompanying file LICENSE.txt or copy at
+
8// https://opensource.org/licenses/MIT
+
9//
+
10// The documentation can be found at the library's page:
+
11// https://github.com/doctest/doctest/blob/master/doc/markdown/readme.md
+
12//
+
13
+
14#ifndef DOCTEST_UTIL_H
+
15#define DOCTEST_UTIL_H
+
16
+
17#ifndef DOCTEST_LIBRARY_INCLUDED
+
18#include "../doctest.h"
+
19#endif
+
20
+
21#include <memory>
+
22#include <vector>
+
23#include <string>
+
24
+
25namespace doctest {
+
26
+
27 inline void applyCommandLine(doctest::Context& ctx, const std::vector<std::string>& args) {
+
28 auto doctest_args = std::make_unique<const char*[]>(args.size());
+
29 for (size_t i = 0; i < args.size(); ++i) {
+
30 doctest_args[i] = args[i].c_str();
+
31 }
+
32 ctx.applyCommandLine(args.size(), doctest_args.get());
+
33 }
+
34
+
35} // namespace doctest
+
36
+
37#endif // DOCTEST_UTIL_H
+
Definition doctest.h:1965
+
+ + + + diff --git a/git-main/doxygen_crawl.html b/git-main/doxygen_crawl.html index 2662586..9239242 100644 --- a/git-main/doxygen_crawl.html +++ b/git-main/doxygen_crawl.html @@ -8,6 +8,20 @@ + + + + + + + + + + + + + + @@ -16,7 +30,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -50,14 +242,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -86,6 +328,10 @@ + + + + diff --git a/git-main/enum__for__each_8hpp_source.html b/git-main/enum__for__each_8hpp_source.html index 1f45acf..252ff44 100644 --- a/git-main/enum__for__each_8hpp_source.html +++ b/git-main/enum__for__each_8hpp_source.html @@ -168,12 +168,12 @@
111 return *this;
112 }
113
-
120 auto operator!=(const enum_iter &other) const -> bool {
-
121 return m_pos != other.m_pos;
+
120 auto operator!=(const enum_iter &other) const -> bool {
+
121 return m_pos != other.m_pos;
122 }
123
-
130 auto operator==(const enum_iter &other) const -> bool {
-
131 return m_pos == other.m_pos;
+
130 auto operator==(const enum_iter &other) const -> bool {
+
131 return m_pos == other.m_pos;
132 }
133
139 auto operator*() const -> value_type;
@@ -212,7 +212,6 @@
auto end() -> enum_iter &
Returns an iterator to the end of the enum range.
Definition enum_for_each.hpp:163
Checks for MSVC compiler version.
Definition enum_for_each.hpp:34
Provides the range for an enumeration type.
Definition meta.hpp:156
-
Definition meta.hpp:161

Typedefs

-template<typename T >
using flat_map = pair<T, const char *>[]
using flat_map = pair<T, const char *>[]
 
-using string_view = basic_string_view<char>
string_view = basic_string_view<char>
 
- - + + - - + + - - + + - - + +

Functions

template<typename Enum >
constexpr auto enum_to_underlying (Enum e) noexcept -> detail::underlying_type_t< Enum >
template<typename Enum >
constexpr auto enum_to_underlying (Enum e) noexcept -> detail::underlying_type_t< Enum >
 Converts an enum value to its underlying integer value.
 
template<int Min, int Max, typename Enum >
MGUTILITY_CNSTXPR auto enum_name (Enum e) noexcept -> detail::string_or_view_t< Enum >
template<int Min, int Max, typename Enum >
MGUTILITY_CNSTXPR auto enum_name (Enum e) noexcept -> detail::string_or_view_t< Enum >
 Gets the name of an enum value.
 
template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max, detail::enable_if_t<!detail::has_bit_or< Enum >::value, bool > = true>
MGUTILITY_CNSTXPR auto to_enum (mgutility::string_view str) noexcept -> mgutility::optional< Enum >
template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max, detail::enable_if_t<!detail::has_bit_or< Enum >::value, bool > = true>
MGUTILITY_CNSTXPR auto to_enum (mgutility::string_view str) noexcept -> mgutility::optional< Enum >
 Converts a string to an enum value.
 
template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max>
MGUTILITY_CNSTXPR auto enum_cast (int value) noexcept -> mgutility::optional< Enum >
template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max>
MGUTILITY_CNSTXPR auto enum_cast (int value) noexcept -> mgutility::optional< Enum >
 Casts an integer value to an enum value.
 
+auto 

Variables

-auto nullopt = nullopt_t{}
nullopt = nullopt_t{}
 A global instance of nullopt_t to represent null optional.
 
@@ -175,16 +175,16 @@

-template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max>
+template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max>
@@ -219,16 +219,16 @@

+template<int Min, int Max, typename Enum >

- + - - + +
MGUTILITY_CNSTXPR auto mgutility::enum_cast MGUTILITY_CNSTXPR auto mgutility::enum_cast (int value) -> mgutility::optional<Enum> int value) -> mgutility::optional<Enum>
@@ -278,16 +278,16 @@

+template<typename Enum >

- + - - + +
MGUTILITY_CNSTXPR auto mgutility::enum_name MGUTILITY_CNSTXPR auto mgutility::enum_name (Enum e) -> detail::string_or_view_t<Enum> Enum e) -> detail::string_or_view_t<Enum>
@@ -320,16 +320,16 @@

-template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max, detail::enable_if_t<!detail::has_bit_or< Enum >::value, bool > = true>
+template<typename Enum , int Min = enum_range<Enum>::min, int Max = enum_range<Enum>::max, detail::enable_if_t<!detail::has_bit_or< Enum >::value, bool > = true>

- + - - + +
constexpr auto mgutility::enum_to_underlying constexpr auto mgutility::enum_to_underlying (Enum e) -> detail::underlying_type_t<Enum> Enum e) -> detail::underlying_type_t<Enum>
diff --git a/git-main/optional_8hpp_source.html b/git-main/optional_8hpp_source.html index dd78386..3f5d13f 100644 --- a/git-main/optional_8hpp_source.html +++ b/git-main/optional_8hpp_source.html @@ -137,7 +137,7 @@
40
44struct bad_optional_access : public std::exception {
-
50 const char *what() const noexcept { return "optional has no value"; }
+
50 const char *what() const noexcept { return "optional has no value"; }
51};
52
@@ -147,72 +147,72 @@
60template <typename T> class optional {
61public:
- -
66 : dummy_{0}, has_value_{false} {}
+
65 MGUTILITY_CNSTXPR inline optional(nullopt_t &)
+
66 : dummy_{0}, has_value_{false} {}
67
-
71 MGUTILITY_CNSTXPR inline optional() : dummy_{0}, has_value_{false} {}
+
71 MGUTILITY_CNSTXPR inline optional() : dummy_{0}, has_value_{false} {}
72
-
79 template <typename... Args>
+
79 template <typename... Args>
- -
81 : value_{T{std::forward<Args>(args)...}}, has_value_{true} {}
+
80 MGUTILITY_CNSTXPR inline optional(Args &&...args)
+
81 : value_{T{std::forward<Args>(args)...}}, has_value_{true} {}
82
- -
89 : value_{value}, has_value_{true} {}
+
88 MGUTILITY_CNSTXPR inline optional(T &&value)
+
89 : value_{value}, has_value_{true} {}
90
- -
97 : value_{other.value_}, has_value_{other.has_value_} {}
+
96 MGUTILITY_CNSTXPR inline optional(const optional &other)
+
97 : value_{other.value_}, has_value_{other.has_value_} {}
98
- -
105 : value_{other.value_}, has_value_{other.has_value_} {
-
106 other.reset();
+
104 MGUTILITY_CNSTXPR inline optional(optional &&other)
+
105 : value_{other.value_}, has_value_{other.has_value_} {
+
106 other.reset();
107 }
108
112 inline ~optional() { has_value_ = false; }
113
- -
121 value_ = other.value_;
-
122 has_value_ = other.has_value_;
+
120 MGUTILITY_CNSTXPR inline optional &operator=(const optional &other) {
+
121 value_ = other.value_;
+
122 has_value_ = other.has_value_;
123 return *this;
124 }
125
- -
133 value_ = other.value_;
-
134 has_value_ = other.has_value_;
-
135 other.reset();
+
132 MGUTILITY_CNSTXPR inline optional &operator=(optional &&other) {
+
133 value_ = other.value_;
+
134 has_value_ = other.has_value_;
+
135 other.reset();
136 return *this;
137 }
138
- -
145 auto val = std::move(other.value_);
-
146 other.value_ = std::move(value_);
-
147 value_ = std::move(val);
+
144 MGUTILITY_CNSTXPR inline void swap(optional &&other) {
+
145 auto val = std::move(other.value_);
+
146 other.value_ = std::move(value_);
+
147 value_ = std::move(val);
148
-
149 auto hval = std::move(other.has_value_);
-
150 other.has_value_ = std::move(has_value_);
-
151 has_value_ = std::move(hval);
+
149 auto hval = std::move(other.has_value_);
+
150 other.has_value_ = std::move(has_value_);
+
151 has_value_ = std::move(hval);
152 }
153
-
159 MGUTILITY_CNSTXPR inline T &operator*() { return value_; }
+
159 MGUTILITY_CNSTXPR inline T &operator*() { return value_; }
160
-
166 MGUTILITY_CNSTXPR inline T &operator*() const { return value_; }
+
166 MGUTILITY_CNSTXPR inline T &operator*() const { return value_; }
167
- +
174 MGUTILITY_CNSTXPR inline T &value() {
175 if (!has_value_)
176 throw bad_optional_access();
177 return value_;
@@ -220,7 +220,7 @@
179
-
186 MGUTILITY_CNSTXPR inline T &value() const {
+
186 MGUTILITY_CNSTXPR inline T &value() const {
187 if (!has_value_)
188 throw bad_optional_access();
189 return value_;
@@ -228,70 +228,70 @@
191
- +
198 MGUTILITY_CNSTXPR inline T value_or(T &&value) {
199 return has_value_ ? value_ : value;
200 }
201
- +
209 MGUTILITY_CNSTXPR inline T value_or(T &&value) const {
210 return has_value_ ? value_ : value;
211 }
212
- +
219 MGUTILITY_CNSTXPR inline T value_or(const T &value) {
220 return has_value_ ? value_ : value;
221 }
222
-
230 MGUTILITY_CNSTXPR inline T value_or(const T &value) const {
+
230 MGUTILITY_CNSTXPR inline T value_or(const T &value) const {
231 return has_value_ ? value_ : value;
232 }
233
- +
239 MGUTILITY_CNSTXPR inline void emplace(T value) {
240 value_ = std::move(value);
241 has_value_ = true;
242 }
243
-
250 template <typename... Args>
+
250 template <typename... Args>
-
251 MGUTILITY_CNSTXPR inline void emplace(Args &&...args) {
-
252 value_ = std::move(T{std::forward<Args>(args)...});
+
251 MGUTILITY_CNSTXPR inline void emplace(Args &&...args) {
+
252 value_ = std::move(T{std::forward<Args>(args)...});
253 has_value_ = true;
254 }
255
-
261 MGUTILITY_CNSTXPR inline bool has_value() const { return has_value_; }
+
261 MGUTILITY_CNSTXPR inline bool has_value() const { return has_value_; }
262
-
266 template <typename U = T,
+
266 template <typename U = T,
267 detail::enable_if_t<!std::is_destructible<U>::value, bool> = true>
-
268 MGUTILITY_CNSTXPR inline void reset() {
-
269 value_ = T{};
+
268 MGUTILITY_CNSTXPR inline void reset() {
+
269 value_ = T{};
270 has_value_ = false;
271 }
272
-
276 template <typename U = T,
+
276 template <typename U = T,
277 detail::enable_if_t<std::is_destructible<T>::value, bool> = true>
-
278 MGUTILITY_CNSTXPR inline void reset() {
+
278 MGUTILITY_CNSTXPR inline void reset() {
279 value_.~T();
280 has_value_ = false;
281 }
282
-
288 MGUTILITY_CNSTXPR operator bool() { return has_value_; }
+
288 MGUTILITY_CNSTXPR operator bool() { return has_value_; }
289
290private:
291 union {
-
292 T value_;
-
293 char dummy_[sizeof(T)];
+
292 T value_;
+
293 char dummy_[sizeof(T)];
294 };
295 bool has_value_;
296};
@@ -300,8 +300,8 @@
301struct nullopt_t {
-
308 template <typename T> MGUTILITY_CNSTXPR operator optional<T>() {
-
309 return optional<T>{};
+
308 template <typename T> MGUTILITY_CNSTXPR operator optional<T>() {
+
309 return optional<T>{};
310 }
311};
@@ -347,7 +347,6 @@
Exception thrown when accessing an empty optional.
Definition optional.hpp:44
const char * what() const noexcept
Returns the exception message.
Definition optional.hpp:50
Represents a null optional.
Definition optional.hpp:301
-
Definition meta.hpp:161
- + - +
MGUTILITY_CNSTXPR auto mgutility::to_enum MGUTILITY_CNSTXPR auto mgutility::to_enum ( mgutility::string_view str) -> mgutility::optional<Enum> -> mgutility::optional<Enum>
- + + + + + + + + + + + + + + + + + + + + + +
 enum_name
 Change Log
 Contributing
 Assertion macros
 Benchmarks
 Build systems
 Command line
 Configuration
 Extensions
 FAQ
 Features and design goals
 Logging macros
 The <tt>main()</tt> entry point
 Parameterized test cases
 Reference
 Reporters
 String conversions
 Test cases
 Tutorial
 README
 random_dev_notes
 release_process
 enum_name
diff --git a/git-main/scripts_2development__only_2doctest_2doctest_8h_source.html b/git-main/scripts_2development__only_2doctest_2doctest_8h_source.html new file mode 100644 index 0000000..33debde --- /dev/null +++ b/git-main/scripts_2development__only_2doctest_2doctest_8h_source.html @@ -0,0 +1,109 @@ + + + + + + + + + enum_name: /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/scripts/development_only/doctest/doctest.h Source File + + + + + + + + + + + + +
+ +
+ + + + + + +
+
+ enum_name + +
+
+
+ +
+ + + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + + +
+
doctest.h
+
+
+
1#include "doctest_fwd.h"
+
2#ifndef DOCTEST_SINGLE_HEADER
+
3#define DOCTEST_SINGLE_HEADER
+
4#endif
+
5#include "doctest.cpp"
+
+ + + + diff --git a/git-main/search/all_0.js b/git-main/search/all_0.js index 62e808d..299c42e 100644 --- a/git-main/search/all_0.js +++ b/git-main/search/all_0.js @@ -1,4 +1,46 @@ var searchData= [ - ['5ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['0_200_201_200_200_20a_202016_2005_2022_0',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['0_200_202_200_200_20a_202018_2008_2023_1',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['0_201_201_200_20a_202016_2009_2021_2',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['0_201_202_200_201_20a_202018_2010_2024_3',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['0_201_202_200_20a_202017_2005_2015_4',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['0_202_201_200_20a_202018_2011_2030_5',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['0_202_202_200_20a_202018_2012_2005_6',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['0_202_203_200_20a_202019_2003_2023_7',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['0_202_204_200_20a_202020_2006_2027_8',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['01_2010_9',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['01_2015_10',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['01_2028_11',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['02_12',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['02_2002_13',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['02_2006_14',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['02_2010_15',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['02_2018_16',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['02_2024_17',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['02_2027_18',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['03_2010_19',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['03_2015_20',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['03_2022_21',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['03_2023_22',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['03_2024_23',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['04_24',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['05_25',['05',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)']]], + ['05_2006_26',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['05_2010_27',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['05_2015_28',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['05_2017_29',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['05_2022_30',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['05_2024_31',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['06_32',['06',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)']]], + ['06_2002_33',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['06_2018_34',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['06_2027_35',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['08_2012_36',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['08_2023_37',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['09_2005_38',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['09_2011_39',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['09_2020_40',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['09_2021_41',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['09_2022_42',['09 22',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)']]] ]; diff --git a/git-main/search/all_1.js b/git-main/search/all_1.js index 20bdfb6..eb302e5 100644 --- a/git-main/search/all_1.js +++ b/git-main/search/all_1.js @@ -1,4 +1,45 @@ var searchData= [ - ['a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['1_200_200_201_200_200_20a_202016_2005_2022_0',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['1_200_202_201_200_20a_202018_2011_2030_1',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['1_201_200_201_201_200_20a_202016_2009_2021_2',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['1_201_201_201_201_201_20a_202016_2009_2022_3',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['1_201_202_201_201_202_20a_202016_2010_2010_4',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['1_201_203_201_201_203_20a_202016_2011_2015_5',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['1_201_204_201_201_204_20a_202017_2002_2018_6',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['1_202_200_201_202_200_20a_202017_2005_2015_7',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['1_202_200_201_20a_202018_2010_2024_8',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['1_202_201_201_202_201_20a_202017_2005_2024_9',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['1_202_202_201_202_202_20a_202017_2009_2005_10',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['1_202_202_201_20a_202019_2001_2015_11',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['1_202_203_201_202_203_20a_202017_2009_2011_12',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['1_202_203_201_20a_202019_2003_2024_13',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['1_202_204_201_202_204_20a_202017_2009_2020_14',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['1_202_204_201_20a_202020_2011_2004_15',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['1_202_205_201_202_205_20a_202017_2010_2006_16',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['1_202_206_201_202_206_20a_202017_2010_2029_17',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['1_202_207_201_202_207_20a_202018_2002_2006_18',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['1_202_208_201_202_208_20a_202018_2003_2010_19',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['1_202_209_201_202_209_20a_202018_2005_2010_20',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['10_21',['10',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)']]], + ['10_2006_22',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['10_2010_23',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['10_2024_24',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['10_2029_25',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['10_20v2_204_2010_20a_202023_2002_2027_26',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['11_27',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['11_2004_28',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['11_2015_29',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['11_2030_30',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['11_20v2_204_2011_20a_202023_2003_2015_31',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['12_32',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['12_2005_33',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['12_2010_34',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['12_2015_35',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['12_2016_36',['12 16',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)']]], + ['12_2025_37',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['15_38',['15',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)']]], + ['16_39',['16',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)']]], + ['17_40',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['18_41',['18',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)']]] ]; diff --git a/git-main/search/all_10.js b/git-main/search/all_10.js index fbafdde..06e35f8 100644 --- a/git-main/search/all_10.js +++ b/git-main/search/all_10.js @@ -1,7 +1,26 @@ var searchData= [ - ['size_0',['size',['../classmgutility_1_1enum__for__each.html#a0d833b4ee26998c4373aee17be12cd90',1,'mgutility::enum_for_each::size()'],['../classmgutility_1_1basic__string__view.html#a26e96c7b63f54ccd9306e3a4ecf5b336',1,'mgutility::basic_string_view::size() const noexcept']]], - ['substr_1',['substr',['../classmgutility_1_1basic__string__view.html#afaa73ee06ad76de37e100e06f98822ee',1,'mgutility::basic_string_view']]], - ['supported_20compilers_2',['Supported Compilers',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md2',1,'']]], - ['swap_3',['swap',['../classmgutility_1_1optional.html#ac4a977a0b086414df1567343fe6f6f0a',1,'mgutility::optional']]] + ['fail_20test_20cases_0',['Messages which can optionally fail test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'']]], + ['false_5ftype_1',['false_type',['../structdoctest_1_1detail_1_1types_1_1false__type.html',1,'doctest::detail::types']]], + ['faq_2',['FAQ',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html',1,'']]], + ['features_3',['Features',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md191',1,'']]], + ['features_20and_20design_20goals_4',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]], + ['features_3a_5',['Other features:',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md144',1,'']]], + ['fetch_20library_20with_20cmake_6',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md193',1,'']]], + ['files_7',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['filldata_8',['filldata',['../structdoctest_1_1detail_1_1filldata.html',1,'doctest::detail']]], + ['filldata_3c_20const_20char_5bn_5d_3e_9',['filldata< const char[N]>',['../structdoctest_1_1detail_1_1filldata_3_01const_01char_0fN_0e_4.html',1,'doctest::detail']]], + ['filldata_3c_20const_20void_20_2a_20_3e_10',['filldata< const void * >',['../structdoctest_1_1detail_1_1filldata_3_01const_01void_01_5_01_4.html',1,'doctest::detail']]], + ['filldata_3c_20t_20_2a_20_3e_11',['filldata< T * >',['../structdoctest_1_1detail_1_1filldata_3_01T_01_5_01_4.html',1,'doctest::detail']]], + ['filldata_3c_20t_5bn_5d_3e_12',['filldata< T[N]>',['../structdoctest_1_1detail_1_1filldata_3_01T_0fN_0e_4.html',1,'doctest::detail']]], + ['find_13',['find',['../classmgutility_1_1basic__string__view.html#a511d28b000ada097a6f4449266c2a018',1,'mgutility::basic_string_view']]], + ['fixtures_14',['Test fixtures',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md172',1,'']]], + ['floating_20point_20comparisons_15',['Floating point comparisons',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md54',1,'']]], + ['foo_16',['Foo',['../structApp_1_1Foo.html',1,'App::Foo'],['../structBar_1_1Foo.html',1,'Bar::Foo']]], + ['for_20tt_20std_3a_3aostream_20tt_17',['<tt>operator\<\<</tt> overload for <tt>std::ostream</tt>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md164',1,'']]], + ['framework_18',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_19',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['framework_20use_20exceptions_20',['Does the framework use exceptions?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md135',1,'']]], + ['from_20catch_21',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['from_20google_20test_22',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]] ]; diff --git a/git-main/search/all_11.js b/git-main/search/all_11.js index 8bc0169..1852c47 100644 --- a/git-main/search/all_11.js +++ b/git-main/search/all_11.js @@ -1,6 +1,54 @@ var searchData= [ - ['to_5fenum_0',['to_enum',['../namespacemgutility.html#a47470bc6b087ab3ceab7c3873203a2eb',1,'mgutility']]], - ['try_20it_20a_1',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]], - ['type_2',['type',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html#a7b17e3be2a8e0003e56e5fd8cbfa9524',1,'mgutility::detail::enum_sequence_helper< Enum, Min, Min, Next... >']]] + ['get_20compiler_20errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_0',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['get_20the_20best_20compile_20time_20performance_20with_20the_20framework_1',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['getting_20registered_2',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['github_20com_20catchorg_20catch2_20catch_20a_3',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_4',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_5',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_6',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_7',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_8',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_9',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_10',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_11',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_12',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_13',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_14',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_15',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_16',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_17',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_18',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['github_20com_20doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_19',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_20',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_21',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_22',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_23',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_24',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_25',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_26',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_27',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_28',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_29',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_30',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_31',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_32',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_33',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_34',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_35',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_36',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_37',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_38',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_39',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_40',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_41',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_42',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['github_20com_20doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_43',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['github_20com_20doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_44',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['github_20com_20doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_45',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['github_20com_20doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_46',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['github_20com_20doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_47',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['goals_48',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]], + ['godbolt_20org_20z_205ye185mwa_20try_20it_20a_49',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['google_20test_50',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]] ]; diff --git a/git-main/search/all_12.js b/git-main/search/all_12.js index c04421e..ee86b76 100644 --- a/git-main/search/all_12.js +++ b/git-main/search/all_12.js @@ -1,4 +1,113 @@ var searchData= [ - ['usage_20a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['h_20distributed_20tests_20with_20mpi_20a_0',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['h_20utils_20a_1',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['has_5fbit_5for_2',['has_bit_or',['../structmgutility_1_1detail_1_1has__bit__or.html',1,'mgutility::detail']]], + ['has_5fbit_5for_3c_20t_2c_20decltype_28_28t_7b_7d_7ct_7b_7d_29_2c_20void_28_29_29_3e_3',['has_bit_or< T, decltype((T{}|T{}), void())>',['../structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html',1,'mgutility::detail']]], + ['has_5finsertion_5foperator_4',['has_insertion_operator',['../structdoctest_1_1detail_1_1has__insertion__operator.html',1,'doctest::detail']]], + ['has_5finsertion_5foperator_3c_20t_2c_20decltype_28operator_3c_3c_28declval_3c_20std_3a_3aostream_20_26_20_3e_28_29_2c_20declval_3c_20const_20t_20_26_20_3e_28_29_29_2c_20void_28_29_29_3e_5',['has_insertion_operator< T, decltype(operator<<(declval< std::ostream & >(), declval< const T & >()), void())>',['../structdoctest_1_1detail_1_1has__insertion__operator_3_01T_00_01decltype_07operator_3_3_07declvald5a5a279653bbfeef238ad5c984744e2.html',1,'doctest::detail']]], + ['has_5fvalue_6',['has_value',['../classmgutility_1_1optional.html#a444270b6571ff545b4c2f354eb74eaa1',1,'mgutility::optional']]], + ['header_7',['Header',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md60',1,'Cost of including the header'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'Why do I get compiler errors in STL headers when including the doctest header?']]], + ['header_20only_20libraries_8',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['headers_20when_20including_20the_20doctest_20header_9',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['here_10',['What did we do here?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md179',1,'']]], + ['how_20is_20strong_20doctest_20strong_20different_20from_20catch_11',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['how_20is_20strong_20doctest_20strong_20different_20from_20google_20test_12',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['how_20to_20get_20the_20best_20compile_20time_20performance_20with_20the_20framework_13',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['how_20to_20use_20with_20multiple_20files_14',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['how_20to_20write_20tests_20in_20header_20only_20libraries_15',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['href_20doctest_20extensions_20doctest_5fmpi_20h_20distributed_20tests_20with_20mpi_20a_16',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['href_20doctest_20extensions_20doctest_5futil_20h_20utils_20a_17',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['href_20https_3a_20github_20com_20catchorg_20catch2_20catch_20a_18',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_19',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_20',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_21',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_22',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_23',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_24',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_25',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_26',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_27',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_28',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_29',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_30',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_31',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_32',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_33',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_34',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_35',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_36',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_37',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_38',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_39',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_40',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_41',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_42',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_43',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_44',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_45',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_46',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_47',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_48',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_49',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_50',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_51',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_52',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_53',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_54',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_55',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_56',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_57',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_58',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_59',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_60',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_61',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_62',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_63',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['https_3a_20github_20com_20catchorg_20catch2_20catch_20a_64',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_65',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_66',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_67',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_68',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_69',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_70',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_71',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_72',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_73',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_74',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_75',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_76',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_77',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_78',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_79',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_80',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_81',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_82',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_83',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_84',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_85',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_86',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_87',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_88',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_89',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_90',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_91',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_92',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_93',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_94',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_95',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_96',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_97',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_98',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_99',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_100',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_101',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_102',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_103',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_104',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_105',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_106',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_107',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_108',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_109',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]] ]; diff --git a/git-main/search/all_13.js b/git-main/search/all_13.js index a7311cc..2a4b841 100644 --- a/git-main/search/all_13.js +++ b/git-main/search/all_13.js @@ -1,5 +1,32 @@ var searchData= [ - ['value_0',['value',['../structmgutility_1_1detail_1_1is__scoped__enum.html#a7f124839c728583930588def94fbfec0',1,'mgutility::detail::is_scoped_enum::value'],['../classmgutility_1_1optional.html#ac1028387cac8311f37d30683aa0e6dee',1,'mgutility::optional::value()'],['../classmgutility_1_1optional.html#abc9fc767c073e865acbad79df5237bd1',1,'mgutility::optional::value() const']]], - ['value_5for_1',['value_or',['../classmgutility_1_1optional.html#acb65e681b1e5c84f0c00059a9e61903d',1,'mgutility::optional::value_or(T &&value)'],['../classmgutility_1_1optional.html#a14f3152ede420d3799dc3ec9f8ec1a10',1,'mgutility::optional::value_or(T &&value) const'],['../classmgutility_1_1optional.html#aee67dde557acbd11fe3c0a8455cab862',1,'mgutility::optional::value_or(const T &value)'],['../classmgutility_1_1optional.html#acf92119863dd7ae1cc5ae387151751b9',1,'mgutility::optional::value_or(const T &value) const']]] + ['i_20get_20compiler_20errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_0',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['icontextscope_1',['IContextScope',['../structdoctest_1_1IContextScope.html',1,'doctest']]], + ['iexceptiontranslator_2',['IExceptionTranslator',['../structdoctest_1_1detail_1_1IExceptionTranslator.html',1,'doctest::detail']]], + ['in_20a_20static_20library_20not_20getting_20registered_3',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['in_20header_20only_20libraries_4',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['in_20stl_20headers_20when_20including_20the_20doctest_20header_5',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['including_20the_20doctest_20header_6',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['including_20the_20header_7',['Cost of including the header',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md60',1,'']]], + ['info_8',['INFO()',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md147',1,'']]], + ['int_5fholder_9',['int_holder',['../structint__holder.html',1,'']]], + ['int_5fpointer_10',['int_pointer',['../structint__pointer.html',1,'']]], + ['ireporter_11',['IReporter',['../structdoctest_1_1IReporter.html',1,'doctest']]], + ['is_20comparing_20c_20strings_20tt_20char_20tt_20actually_20comparing_20pointers_12',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['is_20doctest_20thread_20aware_13',['Is doctest thread-aware?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md130',1,'']]], + ['is_20doctest_20using_20macros_14',['Why is doctest using macros?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md138',1,'']]], + ['is_20mocking_20supported_15',['Is mocking supported?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md131',1,'']]], + ['is_20strong_20doctest_20strong_20different_20from_20catch_16',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['is_20strong_20doctest_20strong_20different_20from_20google_20test_17',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['is_5farray_18',['is_array',['../structdoctest_1_1detail_1_1types_1_1is__array.html',1,'doctest::detail::types']]], + ['is_5farray_3c_20t_5bsize_5d_3e_19',['is_array< T[SIZE]>',['../structdoctest_1_1detail_1_1types_1_1is__array_3_01T_0fSIZE_0e_4.html',1,'doctest::detail::types']]], + ['is_5fenum_20',['is_enum',['../structdoctest_1_1detail_1_1types_1_1is__enum.html',1,'doctest::detail::types']]], + ['is_5fpointer_21',['is_pointer',['../structdoctest_1_1detail_1_1types_1_1is__pointer.html',1,'doctest::detail::types']]], + ['is_5fpointer_3c_20t_20_2a_20_3e_22',['is_pointer< T * >',['../structdoctest_1_1detail_1_1types_1_1is__pointer_3_01T_01_5_01_4.html',1,'doctest::detail::types']]], + ['is_5frvalue_5freference_23',['is_rvalue_reference',['../structdoctest_1_1detail_1_1types_1_1is__rvalue__reference.html',1,'doctest::detail::types']]], + ['is_5frvalue_5freference_3c_20t_20_26_26_20_3e_24',['is_rvalue_reference< T && >',['../structdoctest_1_1detail_1_1types_1_1is__rvalue__reference_3_01T_01_6_6_01_4.html',1,'doctest::detail::types']]], + ['is_5fscoped_5fenum_25',['is_scoped_enum',['../structmgutility_1_1detail_1_1is__scoped__enum.html',1,'mgutility::detail']]], + ['isnan_26',['IsNaN',['../structdoctest_1_1IsNaN.html',1,'doctest']]], + ['it_20a_27',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['itranslator_28',['ITranslator',['../structITranslator.html',1,'']]] ]; diff --git a/git-main/search/all_14.js b/git-main/search/all_14.js index 112cc52..cd5b0c4 100644 --- a/git-main/search/all_14.js +++ b/git-main/search/all_14.js @@ -1,5 +1,13 @@ var searchData= [ - ['what_0',['what',['../structmgutility_1_1bad__optional__access.html#af3a7f794c94499a7660cfed0d3fed8dc',1,'mgutility::bad_optional_access']]], - ['with_20cmake_1',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md5',1,'']]] + ['label_0',['label',['../structuser1_1_1label.html',1,'user1::label'],['../structuser2_1_1label.html',1,'user2::label'],['../structuser3_1_1label.html',1,'user3::label'],['../structuser4_1_1label.html',1,'user4::label'],['../structuser5_1_1label.html',1,'user5::label'],['../structuser6_1_1label.html',1,'user6::label'],['../structuser7_1_1label.html',1,'user7::label'],['../structuser8_1_1label.html',1,'user8::label'],['../structuser9a_1_1label.html',1,'user9a::label'],['../structuser9b_1_1label.html',1,'user9b::label']]], + ['libraries_1',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['library_20not_20getting_20registered_2',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['library_20with_20cmake_3',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md193',1,'']]], + ['limitations_4',['Limitations',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md192',1,'']]], + ['line_5',['Command line',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2commandline.html',1,'']]], + ['log_6',['Change Log',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html',1,'']]], + ['log_7',['log',['../structdoctest_1_1detail_1_1ResultBuilder.html#a2af75dd1d8db8d3aa949d78025854085',1,'doctest::detail::ResultBuilder']]], + ['logging_20macros_8',['Logging macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html',1,'']]], + ['logo_9',['Logo',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md187',1,'']]] ]; diff --git a/git-main/search/all_15.js b/git-main/search/all_15.js index 290e727..dced3f4 100644 --- a/git-main/search/all_15.js +++ b/git-main/search/all_15.js @@ -1,4 +1,34 @@ var searchData= [ - ['z_205ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['macro_0',['Cost of an assertion macro',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md66',1,'']]], + ['macros_1',['macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html',1,'Assertion macros'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html',1,'Logging macros']]], + ['macros_2',['Why is doctest using macros?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md138',1,'']]], + ['main_20entry_20points_20and_20mpi_20reporters_3',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['main_20page_4',['Main page',['../index.html',1,'']]], + ['main_20tt_20entry_20point_5',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['managers_6',['Package managers',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html#autotoc_md74',1,'']]], + ['messagebuilder_7',['MessageBuilder',['../structdoctest_1_1detail_1_1MessageBuilder.html',1,'doctest::detail']]], + ['messagedata_8',['MessageData',['../structdoctest_1_1MessageData.html',1,'doctest']]], + ['messages_20which_20can_20optionally_20fail_20test_20cases_9',['Messages which can optionally fail test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'']]], + ['mgutility_10',['mgutility',['../namespacemgutility.html',1,'']]], + ['mgutility_5fcnstevl_11',['MGUTILITY_CNSTEVL',['../definitions_8hpp.html#ae79da58f317cf12394dd7e76dbbe832c',1,'definitions.hpp']]], + ['mgutility_5fcnstxpr_5fclang_5fwa_12',['MGUTILITY_CNSTXPR_CLANG_WA',['../definitions_8hpp.html#ad7d158b2132888de05e72cdd28db7e11',1,'definitions.hpp']]], + ['mgutility_5fcplusplus_13',['MGUTILITY_CPLUSPLUS',['../definitions_8hpp.html#ad1e229b7b0500b2c1044b9816307fc02',1,'definitions.hpp']]], + ['mocking_20supported_14',['Is mocking supported?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md131',1,'']]], + ['moveonly_15',['MoveOnly',['../classMoveOnly.html',1,'']]], + ['mpi_20a_16',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['mpi_20reporters_17',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['mpi_5fsub_5fcomm_18',['mpi_sub_comm',['../structdoctest_1_1mpi__sub__comm.html',1,'doctest']]], + ['mpi_5ftest_5fcase_19',['MPI_TEST_CASE',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md117',1,'']]], + ['mpiconsolereporter_20',['MpiConsoleReporter',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md120',1,'']]], + ['mpifilereporter_21',['MpiFileReporter',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md121',1,'']]], + ['multilaneatomic_22',['MultiLaneAtomic',['../classdoctest_1_1detail_1_1MultiLaneAtomic.html',1,'doctest::detail']]], + ['multilaneatomic_3c_20int_20_3e_23',['MultiLaneAtomic< int >',['../classdoctest_1_1detail_1_1MultiLaneAtomic.html',1,'doctest::detail']]], + ['multiple_20files_24',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['my_20tests_20in_20a_20static_20library_20not_20getting_20registered_25',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['myothertype_26',['MyOtherType',['../structBar_1_1MyOtherType.html',1,'Bar']]], + ['mytype_27',['MyType',['../structMyType.html',1,'']]], + ['mytype_3c_20t_2c_20unsigned_20_3e_28',['MyType< T, unsigned >',['../structMyType.html',1,'']]], + ['mytypeinherited_29',['MyTypeInherited',['../structMyTypeInherited.html',1,'']]], + ['myxmlreporter_30',['MyXmlReporter',['../structMyXmlReporter.html',1,'']]] ]; diff --git a/git-main/search/all_16.js b/git-main/search/all_16.js index d1b8aef..6d56043 100644 --- a/git-main/search/all_16.js +++ b/git-main/search/all_16.js @@ -1,4 +1,10 @@ var searchData= [ - ['_7eoptional_0',['~optional',['../classmgutility_1_1optional.html#a2e1c20d05d40a957ee86318dc1558ff8',1,'mgutility::optional']]] + ['name_0',['name',['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view'],['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view']]], + ['nan_20checking_1',['NaN checking',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md55',1,'']]], + ['next_20steps_2',['Next steps',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md182',1,'']]], + ['not_20getting_20registered_3',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['note_4',['Note',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md123',1,'']]], + ['nullopt_5',['nullopt',['../namespacemgutility.html#a2472ad38d80978a9a8c3150e0e2ba43c',1,'mgutility']]], + ['nullopt_5ft_6',['nullopt_t',['../structmgutility_1_1nullopt__t.html',1,'mgutility']]] ]; diff --git a/git-main/search/all_17.js b/git-main/search/all_17.js new file mode 100644 index 0000000..981529f --- /dev/null +++ b/git-main/search/all_17.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['objects_20dlls_0',['Dealing with shared objects (DLLs)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html#autotoc_md152',1,'']]], + ['of_20a_20testing_20context_1',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['of_20an_20assertion_20macro_2',['Cost of an assertion macro',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md66',1,'']]], + ['of_20including_20the_20header_3',['Cost of including the header',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md60',1,'']]], + ['of_20the_20framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_4',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['only_20libraries_5',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['operator_20bool_6',['operator bool',['../classmgutility_1_1optional.html#ab0f2e6f47e7c8eb9b1c4bd553df6eb63',1,'mgutility::optional']]], + ['operator_20optional_3c_20t_20_3e_7',['operator optional< T >',['../structmgutility_1_1nullopt__t.html#a0239dc56aa60ab9eb05646f66814c8b5',1,'mgutility::nullopt_t']]], + ['operator_20result_8',['operator Result',['../structdoctest_1_1detail_1_1Expression__lhs.html#aa0ab4a18aac56bfb02fba8970ed304b3',1,'doctest::detail::Expression_lhs::operator Result()'],['../structdoctest_1_1detail_1_1Expression__lhs.html#aa0ab4a18aac56bfb02fba8970ed304b3',1,'doctest::detail::Expression_lhs::operator Result()']]], + ['operator_20std_3a_3astring_9',['operator std::string',['../classmgutility_1_1basic__string__view.html#a88ab597eb09f775835b2b1012e4738cd',1,'mgutility::basic_string_view::string()'],['../classmgutility_1_1basic__string__view.html#a25b10409abab3fcb1152c301c5e2cc68',1,'mgutility::basic_string_view::string() const']]], + ['operator_20tt_20overload_20for_20tt_20std_3a_3aostream_20tt_10',['<tt>operator\<\<</tt> overload for <tt>std::ostream</tt>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md164',1,'']]], + ['operator_21_3d_11',['operator!=',['../classmgutility_1_1basic__string__view.html#a1d20761329e2d939ab77bbe3e91570d3',1,'mgutility::basic_string_view::operator!='],['../classmgutility_1_1basic__string__view.html#adac0147a9db1ea20951f75cd3664fcda',1,'mgutility::basic_string_view::operator!=']]], + ['operator_2a_12',['operator*',['../classmgutility_1_1optional.html#a86530a0954753d4f81a55364d631bc2a',1,'mgutility::optional::operator*()'],['../classmgutility_1_1optional.html#a5abeb6aa1847ff267211454a9f3f7f50',1,'mgutility::optional::operator*() const']]], + ['operator_3c_3c_13',['operator<<',['../classmgutility_1_1basic__string__view.html#a3a539c3eb984671d1bdbb035960cb9d6',1,'mgutility::basic_string_view']]], + ['operator_3d_14',['operator=',['../classmgutility_1_1optional.html#a37d1cdc3ee17e9b0ad6f51f196377c6f',1,'mgutility::optional::operator=(const optional &other)'],['../classmgutility_1_1optional.html#a12c470b6074a02e2e05b8f3d99723bdc',1,'mgutility::optional::operator=(optional &&other)'],['../classmgutility_1_1basic__string__view.html#a5dd4b45964ba415e1bc756dbd16e086d',1,'mgutility::basic_string_view::operator=(const basic_string_view &other) noexcept'],['../classmgutility_1_1basic__string__view.html#aebc213a351e10cdb8fea03c5a06d6704',1,'mgutility::basic_string_view::operator=(basic_string_view &&other) noexcept']]], + ['operator_3d_3d_15',['operator==',['../classmgutility_1_1basic__string__view.html#a4f78e96e1c8cd701e36367971c7f112b',1,'mgutility::basic_string_view::operator=='],['../classmgutility_1_1basic__string__view.html#a4e033e35d453263fd34724b2b9634581',1,'mgutility::basic_string_view::operator==']]], + ['operator_5b_5d_16',['operator[]',['../classmgutility_1_1basic__string__view.html#a78d80b32f442c1c0994af67cb1a42e1d',1,'mgutility::basic_string_view']]], + ['optional_17',['optional',['../classmgutility_1_1optional.html',1,'mgutility::optional< T >'],['../classmgutility_1_1optional.html#aaf01ec86b3bd0649e824cb262bf238ba',1,'mgutility::optional::optional(nullopt_t &)'],['../classmgutility_1_1optional.html#a6dfc2e2dd5035fe8f4e2ea2d499ff0c6',1,'mgutility::optional::optional()'],['../classmgutility_1_1optional.html#a1f9831c9b189a71acafcdb2b4ebba70f',1,'mgutility::optional::optional(Args &&...args)'],['../classmgutility_1_1optional.html#a42acc3e5b153bece49622510a3b66ade',1,'mgutility::optional::optional(T &&value)'],['../classmgutility_1_1optional.html#a8e42e264b59aeb9c14817895ed617c42',1,'mgutility::optional::optional(const optional &other)'],['../classmgutility_1_1optional.html#a836543069b1c3244050f6a39c0118c44',1,'mgutility::optional::optional(optional &&other)']]], + ['optionally_20fail_20test_20cases_18',['Messages which can optionally fail test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'']]], + ['org_20z_205ye185mwa_20try_20it_20a_19',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['other_20features_3a_20',['Other features:',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md144',1,'']]], + ['other_20reporters_21',['Other reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md122',1,'']]], + ['out_20of_20a_20testing_20context_22',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['over_20time_23',['Stargazers over time',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md186',1,'']]], + ['overload_24',['<tt>doctest::toString</tt> overload',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md165',1,'']]], + ['overload_20for_20tt_20std_3a_3aostream_20tt_25',['<tt>operator\<\<</tt> overload for <tt>std::ostream</tt>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md164',1,'']]] +]; diff --git a/git-main/search/all_18.js b/git-main/search/all_18.js new file mode 100644 index 0000000..f6b2191 --- /dev/null +++ b/git-main/search/all_18.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['package_20managers_0',['Package managers',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html#autotoc_md74',1,'']]], + ['page_1',['Main page',['../index.html',1,'']]], + ['pair_2',['pair',['../structmgutility_1_1pair.html',1,'mgutility']]], + ['pair_3c_20position_20_3e_3',['pair< Position >',['../structmgutility_1_1pair.html',1,'mgutility']]], + ['pair_3c_20t_20_3e_4',['pair< T >',['../structmgutility_1_1pair.html',1,'mgutility']]], + ['parameterized_20by_20type_5',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]], + ['parameterized_20test_20cases_6',['Parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'Parameterized test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md155',1,'Value-parameterized test cases']]], + ['performance_20with_20the_20framework_7',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['point_8',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['point_20comparisons_9',['Floating point comparisons',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md54',1,'']]], + ['pointers_10',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['points_20and_20mpi_20reporters_11',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['portable_3a_12',['Extremely portable:',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md143',1,'']]], + ['pull_20requests_13',['Pull requests',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CONTRIBUTING.html#autotoc_md46',1,'']]] +]; diff --git a/git-main/search/all_19.js b/git-main/search/all_19.js new file mode 100644 index 0000000..edf1572 --- /dev/null +++ b/git-main/search/all_19.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['querydata_0',['QueryData',['../structdoctest_1_1QueryData.html',1,'doctest']]] +]; diff --git a/git-main/search/all_1a.js b/git-main/search/all_1a.js new file mode 100644 index 0000000..f441fbe --- /dev/null +++ b/git-main/search/all_1a.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['random_5fdev_5fnotes_0',['random_dev_notes',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2random__dev__notes.html',1,'']]], + ['react_1',['react',['../structdoctest_1_1detail_1_1MessageBuilder.html#a3a65c5e39a0c04ae8e2a7c34997a2e4d',1,'doctest::detail::MessageBuilder']]], + ['readme_2',['README',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html',1,'']]], + ['reference_3',['Reference',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2readme.html',1,'']]], + ['registered_4',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['relationalcomparator_5',['RelationalComparator',['../structdoctest_1_1detail_1_1RelationalComparator.html',1,'doctest::detail']]], + ['release_5fprocess_6',['release_process',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2release__process.html',1,'']]], + ['remove_5fconst_7',['remove_const',['../structdoctest_1_1detail_1_1types_1_1remove__const.html',1,'doctest::detail::types']]], + ['remove_5fconst_3c_20const_20t_20_3e_8',['remove_const< const T >',['../structdoctest_1_1detail_1_1types_1_1remove__const_3_01const_01T_01_4.html',1,'doctest::detail::types']]], + ['remove_5freference_9',['remove_reference',['../structdoctest_1_1detail_1_1types_1_1remove__reference.html',1,'doctest::detail::types']]], + ['remove_5freference_3c_20t_20_26_20_3e_10',['remove_reference< T & >',['../structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_01_4.html',1,'doctest::detail::types']]], + ['remove_5freference_3c_20t_20_26_26_20_3e_11',['remove_reference< T && >',['../structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_6_01_4.html',1,'doctest::detail::types']]], + ['reporters_12',['Reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md122',1,'Other reporters'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2reporters.html',1,'Reporters'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'The main entry points and mpi reporters']]], + ['requests_13',['Pull requests',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CONTRIBUTING.html#autotoc_md46',1,'']]], + ['reset_14',['reset',['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()'],['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()']]], + ['result_15',['Result',['../structdoctest_1_1detail_1_1Result.html',1,'doctest::detail']]], + ['resultbuilder_16',['ResultBuilder',['../structdoctest_1_1detail_1_1ResultBuilder.html',1,'doctest::detail']]], + ['rfind_17',['rfind',['../classmgutility_1_1basic__string__view.html#aa2ee34f07ee7ec37344898d4f5ea57f9',1,'mgutility::basic_string_view']]], + ['runtime_20benchmarks_18',['Runtime benchmarks',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md68',1,'']]] +]; diff --git a/git-main/search/all_1b.js b/git-main/search/all_1b.js new file mode 100644 index 0000000..e9ceb39 --- /dev/null +++ b/git-main/search/all_1b.js @@ -0,0 +1,38 @@ +var searchData= +[ + ['same_20binary_20executable_20dll_0',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['scaling_20up_1',['Scaling up',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md181',1,'']]], + ['shared_20objects_20dlls_2',['Dealing with shared objects (DLLs)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html#autotoc_md152',1,'']]], + ['should_5fstringify_5fas_5funderlying_5ftype_3',['should_stringify_as_underlying_type',['../structdoctest_1_1detail_1_1should__stringify__as__underlying__type.html',1,'doctest::detail']]], + ['simple_20example_4',['A simple example',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md178',1,'']]], + ['size_5',['size',['../classmgutility_1_1enum__for__each.html#a0d833b4ee26998c4373aee17be12cd90',1,'mgutility::enum_for_each::size()'],['../classmgutility_1_1basic__string__view.html#a26e96c7b63f54ccd9306e3a4ecf5b336',1,'mgutility::basic_string_view::size()']]], + ['somefixture_6',['SomeFixture',['../structSomeFixture.html',1,'']]], + ['specialisation_7',['<tt>doctest::StringMaker\<T\></tt> specialisation',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md166',1,'']]], + ['stargazers_20over_20time_8',['Stargazers over time',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md186',1,'']]], + ['static_20library_20not_20getting_20registered_9',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['std_3a_3aostream_20tt_10',['<tt>operator\<\<</tt> overload for <tt>std::ostream</tt>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md164',1,'']]], + ['steps_11',['Next steps',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md182',1,'']]], + ['stl_20headers_20when_20including_20the_20doctest_20header_12',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['string_13',['String',['../classdoctest_1_1String.html',1,'doctest']]], + ['string_20containment_14',['String containment',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md53',1,'']]], + ['string_20conversions_15',['String conversions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html',1,'']]], + ['stringcontains_16',['StringContains',['../classdoctest_1_1AssertData_1_1StringContains.html',1,'doctest::AssertData']]], + ['stringmaker_17',['StringMaker',['../structdoctest_1_1StringMaker.html',1,'doctest']]], + ['stringmaker_3c_20std_3a_3alist_3c_20t_20_3e_20_3e_18',['StringMaker< std::list< T > >',['../structdoctest_1_1StringMaker_3_01std_1_1list_3_01T_01_4_01_4.html',1,'doctest']]], + ['stringmakerbase_19',['StringMakerBase',['../structdoctest_1_1detail_1_1StringMakerBase.html',1,'doctest::detail']]], + ['stringmakerbase_3c_20detail_3a_3ahas_5finsertion_5foperator_3c_20t_20_3e_3a_3avalue_7c_7cdetail_3a_3atypes_3a_3ais_5fpointer_3c_20t_20_3e_3a_3avalue_7c_7cdetail_3a_3atypes_3a_3ais_5farray_3c_20t_20_3e_3a_3avalue_20_3e_20',['StringMakerBase< detail::has_insertion_operator< T >::value||detail::types::is_pointer< T >::value||detail::types::is_array< T >::value >',['../structdoctest_1_1detail_1_1StringMakerBase.html',1,'doctest::detail']]], + ['stringmakerbase_3c_20true_20_3e_21',['StringMakerBase< true >',['../structdoctest_1_1detail_1_1StringMakerBase_3_01true_01_4.html',1,'doctest::detail']]], + ['strings_20tt_20char_20tt_20actually_20comparing_20pointers_22',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['strong_20doctest_20strong_20different_20from_20catch_23',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['strong_20doctest_20strong_20different_20from_20google_20test_24',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['style_20test_20cases_25',['BDD-style test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md171',1,'']]], + ['subcase_26',['Subcase',['../structdoctest_1_1detail_1_1Subcase.html',1,'doctest::detail::Subcase'],['../structSubcase.html',1,'Subcase']]], + ['subcases_27',['Test cases and subcases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md180',1,'']]], + ['subcasesignature_28',['SubcaseSignature',['../structdoctest_1_1SubcaseSignature.html',1,'doctest']]], + ['substr_29',['substr',['../classmgutility_1_1basic__string__view.html#afaa73ee06ad76de37e100e06f98822ee',1,'mgutility::basic_string_view']]], + ['suites_30',['Test suites',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md173',1,'']]], + ['supported_31',['Is mocking supported?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md131',1,'']]], + ['supported_20compilers_32',['Supported Compilers',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md190',1,'']]], + ['swap_33',['swap',['../classmgutility_1_1optional.html#ac4a977a0b086414df1567343fe6f6f0a',1,'mgutility::optional']]], + ['systems_34',['Build systems',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html',1,'']]] +]; diff --git a/git-main/search/all_1c.js b/git-main/search/all_1c.js new file mode 100644 index 0000000..84d36a7 --- /dev/null +++ b/git-main/search/all_1c.js @@ -0,0 +1,132 @@ +var searchData= +[ + ['t_20tt_20specialisation_0',['<tt>doctest::StringMaker\<T\></tt> specialisation',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md166',1,'']]], + ['templated_20test_20cases_20parameterized_20by_20type_1',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]], + ['test_2',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['test_20cases_3',['Test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md171',1,'BDD-style test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'Messages which can optionally fail test cases']]], + ['test_20cases_4',['Parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'']]], + ['test_20cases_5',['Test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html',1,'Test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md155',1,'Value-parameterized test cases']]], + ['test_20cases_20and_20subcases_6',['Test cases and subcases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md180',1,'']]], + ['test_20cases_20parameterized_20by_20type_7',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]], + ['test_20fixtures_8',['Test fixtures',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md172',1,'']]], + ['test_20suites_9',['Test suites',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md173',1,'']]], + ['testcase_10',['TestCase',['../structdoctest_1_1detail_1_1TestCase.html',1,'doctest::detail']]], + ['testcasedata_11',['TestCaseData',['../structdoctest_1_1TestCaseData.html',1,'doctest']]], + ['testcaseexception_12',['TestCaseException',['../structdoctest_1_1TestCaseException.html',1,'doctest']]], + ['testfailureexception_13',['TestFailureException',['../structdoctest_1_1detail_1_1TestFailureException.html',1,'doctest::detail']]], + ['testing_20context_14',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['testrunstats_15',['TestRunStats',['../structdoctest_1_1TestRunStats.html',1,'doctest']]], + ['tests_20in_20a_20static_20library_20not_20getting_20registered_16',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['tests_20in_20header_20only_20libraries_17',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['tests_20with_20mpi_20a_18',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['testsuite_19',['TestSuite',['../structdoctest_1_1detail_1_1TestSuite.html',1,'doctest::detail']]], + ['the_20best_20compile_20time_20performance_20with_20the_20framework_20',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['the_20doctest_20header_21',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['the_20framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_22',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['the_20framework_20use_20exceptions_23',['Does the framework use exceptions?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md135',1,'']]], + ['the_20header_24',['Cost of including the header',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md60',1,'']]], + ['the_20main_20entry_20points_20and_20mpi_20reporters_25',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['the_20tt_20main_20tt_20entry_20point_26',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['thread_20aware_27',['Is doctest thread-aware?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md130',1,'']]], + ['time_28',['Stargazers over time',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md186',1,'']]], + ['time_20benchmarks_29',['Compile time benchmarks',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md59',1,'']]], + ['time_20performance_20with_20the_20framework_30',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['timer_31',['Timer',['../structdoctest_1_1detail_1_1Timer.html',1,'doctest::detail']]], + ['to_20get_20the_20best_20compile_20time_20performance_20with_20the_20framework_32',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['to_20use_20with_20multiple_20files_33',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['to_20write_20tests_20in_20header_20only_20libraries_34',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]], + ['to_5fenum_35',['to_enum',['../namespacemgutility.html#a47470bc6b087ab3ceab7c3873203a2eb',1,'mgutility']]], + ['todo_36',['TODO',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md124',1,'']]], + ['translating_20exceptions_37',['Translating exceptions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md167',1,'']]], + ['translator_38',['Translator',['../structTranslator.html',1,'']]], + ['transparent_20_3a_39',['Unintrusive (transparent):',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md142',1,'']]], + ['tree_201_200_200_201_200_200_20a_202016_2005_2022_40',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['tree_201_201_200_201_201_200_20a_202016_2009_2021_41',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['tree_201_201_201_201_201_201_20a_202016_2009_2022_42',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['tree_201_201_202_201_201_202_20a_202016_2010_2010_43',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['tree_201_201_203_201_201_203_20a_202016_2011_2015_44',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['tree_201_201_204_201_201_204_20a_202017_2002_2018_45',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['tree_201_202_200_201_202_200_20a_202017_2005_2015_46',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['tree_201_202_201_201_202_201_20a_202017_2005_2024_47',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['tree_201_202_202_201_202_202_20a_202017_2009_2005_48',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['tree_201_202_203_201_202_203_20a_202017_2009_2011_49',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['tree_201_202_204_201_202_204_20a_202017_2009_2020_50',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['tree_201_202_205_201_202_205_20a_202017_2010_2006_51',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['tree_201_202_206_201_202_206_20a_202017_2010_2029_52',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['tree_201_202_207_201_202_207_20a_202018_2002_2006_53',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['tree_201_202_208_201_202_208_20a_202018_2003_2010_54',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['tree_201_202_209_201_202_209_20a_202018_2005_2010_55',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['tree_202_200_200_202_200_200_20a_202018_2008_2023_56',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['tree_202_200_201_202_200_201_20a_202018_2010_2024_57',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['tree_202_201_200_202_201_200_20a_202018_2011_2030_58',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['tree_202_202_200_202_202_200_20a_202018_2012_2005_59',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['tree_202_202_201_202_202_201_20a_202019_2001_2015_60',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['tree_202_202_202_202_202_202_20a_202019_2001_2028_61',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['tree_202_202_203_202_202_203_20a_202019_2002_2010_62',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['tree_202_203_200_202_203_200_20a_202019_2003_2023_63',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['tree_202_203_201_202_203_201_20a_202019_2003_2024_64',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['tree_202_203_202_202_203_202_20a_202019_2005_2006_65',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['tree_202_203_203_202_203_203_20a_202019_2006_2002_66',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['tree_202_203_204_202_203_204_20a_202019_2008_2012_67',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['tree_202_203_205_202_203_205_20a_202019_2009_2022_68',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['tree_202_203_206_202_203_206_20a_202019_2012_2016_69',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['tree_202_203_207_202_203_207_20a_202020_2002_2024_70',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['tree_202_203_208_202_203_208_20a_202020_2005_2017_71',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['tree_202_204_200_202_204_200_20a_202020_2006_2027_72',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['tree_202_204_201_202_204_201_20a_202020_2011_2004_73',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['tree_202_204_202_202_204_202_20a_202020_2012_2015_74',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['tree_202_204_203_202_204_203_20a_202020_2012_2016_75',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['tree_202_204_204_202_204_204_20a_202020_2012_2025_76',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['tree_202_204_205_202_204_205_20a_202021_2002_2002_77',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['tree_202_204_206_202_204_206_20a_202021_2003_2022_78',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['tree_202_204_207_202_204_207_20a_202021_2012_2010_79',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_80',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_81',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_82',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_83',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['true_5ftype_84',['true_type',['../structdoctest_1_1detail_1_1types_1_1true__type.html',1,'doctest::detail::types']]], + ['try_20it_20a_85',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['tt_20char_20tt_20actually_20comparing_20pointers_86',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['tt_20doctest_3a_3astringmaker_20t_20tt_20specialisation_87',['<tt>doctest::StringMaker\<T\></tt> specialisation',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md166',1,'']]], + ['tt_20doctest_3a_3atostring_20tt_20overload_88',['<tt>doctest::toString</tt> overload',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md165',1,'']]], + ['tt_20doctest_5fconfig_5fassertion_5fparameters_5fby_5fvalue_20tt_89',['**<tt>DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md96',1,'']]], + ['tt_20doctest_5fconfig_5fasserts_5freturn_5fvalues_20tt_90',['**<tt>DOCTEST_CONFIG_ASSERTS_RETURN_VALUES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md107',1,'']]], + ['tt_20doctest_5fconfig_5fcolors_5fansi_20tt_91',['**<tt>DOCTEST_CONFIG_COLORS_ANSI</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md99',1,'']]], + ['tt_20doctest_5fconfig_5fcolors_5fnone_20tt_92',['**<tt>DOCTEST_CONFIG_COLORS_NONE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md97',1,'']]], + ['tt_20doctest_5fconfig_5fcolors_5fwindows_20tt_93',['**<tt>DOCTEST_CONFIG_COLORS_WINDOWS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md98',1,'']]], + ['tt_20doctest_5fconfig_5fdisable_20tt_94',['**<tt>DOCTEST_CONFIG_DISABLE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md81',1,'']]], + ['tt_20doctest_5fconfig_5fdouble_5fstringify_20tt_95',['**<tt>DOCTEST_CONFIG_DOUBLE_STRINGIFY</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md86',1,'']]], + ['tt_20doctest_5fconfig_5fevaluate_5fasserts_5feven_5fwhen_5fdisabled_20tt_96',['**<tt>DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md108',1,'']]], + ['tt_20doctest_5fconfig_5fhandle_5fexception_20tt_97',['**<tt>DOCTEST_CONFIG_HANDLE_EXCEPTION</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md111',1,'']]], + ['tt_20doctest_5fconfig_5fimplement_20tt_98',['**<tt>DOCTEST_CONFIG_IMPLEMENT</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md80',1,'']]], + ['tt_20doctest_5fconfig_5fimplement_5fwith_5fmain_20tt_99',['**<tt>DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md79',1,'']]], + ['tt_20doctest_5fconfig_5fimplementation_5fin_5fdll_20tt_100',['**<tt>DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md82',1,'']]], + ['tt_20doctest_5fconfig_5finclude_5ftype_5ftraits_20tt_101',['**<tt>DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md104',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fcomparison_5fwarning_5fsuppression_20tt_102',['**<tt>DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md90',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fcontradicting_5finline_20tt_103',['**<tt>DOCTEST_CONFIG_NO_CONTRADICTING_INLINE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md109',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fexceptions_20tt_104',['**<tt>DOCTEST_CONFIG_NO_EXCEPTIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md94',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fexceptions_5fbut_5fwith_5fall_5fasserts_20tt_105',['**<tt>DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md95',1,'']]], + ['tt_20doctest_5fconfig_5fno_5finclude_5fiostream_20tt_106',['**<tt>DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md110',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fmulti_5flane_5fatomics_20tt_107',['**<tt>DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md106',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fmultithreading_20tt_108',['**<tt>DOCTEST_CONFIG_NO_MULTITHREADING</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md105',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fposix_5fsignals_20tt_109',['**<tt>DOCTEST_CONFIG_NO_POSIX_SIGNALS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md103',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fshort_5fmacro_5fnames_20tt_110',['**<tt>DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md83',1,'']]], + ['tt_20doctest_5fconfig_5fno_5ftry_5fcatch_5fin_5fasserts_20tt_111',['**<tt>DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md93',1,'']]], + ['tt_20doctest_5fconfig_5fno_5funprefixed_5foptions_20tt_112',['**<tt>DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md92',1,'']]], + ['tt_20doctest_5fconfig_5fno_5fwindows_5fseh_20tt_113',['**<tt>DOCTEST_CONFIG_NO_WINDOWS_SEH</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md101',1,'']]], + ['tt_20doctest_5fconfig_5foptions_5fprefix_20tt_114',['**<tt>DOCTEST_CONFIG_OPTIONS_PREFIX</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md91',1,'']]], + ['tt_20doctest_5fconfig_5fposix_5fsignals_20tt_115',['**<tt>DOCTEST_CONFIG_POSIX_SIGNALS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md102',1,'']]], + ['tt_20doctest_5fconfig_5frequire_5fstringification_5ffor_5fall_5fused_5ftypes_20tt_116',['**<tt>DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md85',1,'']]], + ['tt_20doctest_5fconfig_5fsuper_5ffast_5fasserts_20tt_117',['**<tt>DOCTEST_CONFIG_SUPER_FAST_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md87',1,'']]], + ['tt_20doctest_5fconfig_5ftreat_5fchar_5fstar_5fas_5fstring_20tt_118',['**<tt>DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md84',1,'']]], + ['tt_20doctest_5fconfig_5fuse_5fstd_5fheaders_20tt_119',['**<tt>DOCTEST_CONFIG_USE_STD_HEADERS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md88',1,'']]], + ['tt_20doctest_5fconfig_5fvoid_5fcast_5fexpressions_20tt_120',['**<tt>DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md89',1,'']]], + ['tt_20doctest_5fconfig_5fwindows_5fseh_20tt_121',['**<tt>DOCTEST_CONFIG_WINDOWS_SEH</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md100',1,'']]], + ['tt_20main_20tt_20entry_20point_122',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['tt_20operator_20tt_20overload_20for_20tt_20std_3a_3aostream_20tt_123',['<tt>operator\<\<</tt> overload for <tt>std::ostream</tt>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md164',1,'']]], + ['tuple_124',['tuple',['../classstd_1_1tuple.html',1,'std']]], + ['tutorial_125',['Tutorial',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html',1,'']]], + ['type_126',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]], + ['type_127',['type',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html#a7b17e3be2a8e0003e56e5fd8cbfa9524',1,'mgutility::detail::enum_sequence_helper< Enum, Min, Min, Next... >']]], + ['typepair_128',['TypePair',['../structTypePair.html',1,'']]] +]; diff --git a/git-main/search/all_1d.js b/git-main/search/all_1d.js new file mode 100644 index 0000000..c511569 --- /dev/null +++ b/git-main/search/all_1d.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['unary_20asserts_0',['Binary and unary asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md50',1,'']]], + ['unary_5fassert_1',['unary_assert',['../structdoctest_1_1detail_1_1ResultBuilder.html#a63a2a19638f4a761c70abd5563e2d23a',1,'doctest::detail::ResultBuilder::unary_assert(const DOCTEST_REF_WRAP(L) val)'],['../structdoctest_1_1detail_1_1ResultBuilder.html#a63a2a19638f4a761c70abd5563e2d23a',1,'doctest::detail::ResultBuilder::unary_assert(const DOCTEST_REF_WRAP(L) val)']]], + ['underlying_5ftype_2',['underlying_type',['../structdoctest_1_1detail_1_1types_1_1underlying__type.html',1,'doctest::detail::types']]], + ['unintrusive_20transparent_20_3a_3',['Unintrusive (transparent):',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md142',1,'']]], + ['up_4',['Scaling up',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md181',1,'']]], + ['usage_20a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_5',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['use_20exceptions_6',['Does the framework use exceptions?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md135',1,'']]], + ['use_20with_20multiple_20files_7',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['used_20within_20the_20same_20binary_20executable_20dll_8',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['using_20asserts_20out_20of_20a_20testing_20context_9',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['using_20macros_10',['Why is doctest using macros?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md138',1,'']]], + ['utils_20a_11',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]] +]; diff --git a/git-main/search/all_1e.js b/git-main/search/all_1e.js new file mode 100644 index 0000000..f2f2e1f --- /dev/null +++ b/git-main/search/all_1e.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['v2_204_2010_20v2_204_2010_20a_202023_2002_2027_0',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['v2_204_2011_20v2_204_2011_20a_202023_2003_2015_1',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['v2_204_208_20v2_204_208_20a_202022_2001_2010_2',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['v2_204_209_20v2_204_209_20a_202022_2006_2018_3',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['value_4',['value',['../structmgutility_1_1detail_1_1is__scoped__enum.html#a7f124839c728583930588def94fbfec0',1,'mgutility::detail::is_scoped_enum::value'],['../classmgutility_1_1optional.html#ac1028387cac8311f37d30683aa0e6dee',1,'mgutility::optional::value()'],['../classmgutility_1_1optional.html#abc9fc767c073e865acbad79df5237bd1',1,'mgutility::optional::value() const']]], + ['value_20parameterized_20test_20cases_5',['Value-parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md155',1,'']]], + ['value_5for_6',['value_or',['../classmgutility_1_1optional.html#acb65e681b1e5c84f0c00059a9e61903d',1,'mgutility::optional::value_or(T &&value)'],['../classmgutility_1_1optional.html#a14f3152ede420d3799dc3ec9f8ec1a10',1,'mgutility::optional::value_or(T &&value) const'],['../classmgutility_1_1optional.html#aee67dde557acbd11fe3c0a8455cab862',1,'mgutility::optional::value_or(const T &value)'],['../classmgutility_1_1optional.html#acf92119863dd7ae1cc5ae387151751b9',1,'mgutility::optional::value_or(const T &value) const']]], + ['versions_20of_20the_20framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_7',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]] +]; diff --git a/git-main/search/all_1f.js b/git-main/search/all_1f.js new file mode 100644 index 0000000..eaa947c --- /dev/null +++ b/git-main/search/all_1f.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['we_20do_20here_0',['What did we do here?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md179',1,'']]], + ['what_1',['what',['../structmgutility_1_1bad__optional__access.html#af3a7f794c94499a7660cfed0d3fed8dc',1,'mgutility::bad_optional_access']]], + ['what_20did_20we_20do_20here_2',['What did we do here?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md179',1,'']]], + ['when_20including_20the_20doctest_20header_3',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['which_20can_20optionally_20fail_20test_20cases_4',['Messages which can optionally fail test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'']]], + ['why_20are_20my_20tests_20in_20a_20static_20library_20not_20getting_20registered_5',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['why_20do_20i_20get_20compiler_20errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_6',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['why_20is_20comparing_20c_20strings_20tt_20char_20tt_20actually_20comparing_20pointers_7',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['why_20is_20doctest_20using_20macros_8',['Why is doctest using macros?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md138',1,'']]], + ['with_20cmake_9',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md193',1,'']]], + ['with_20mpi_20a_10',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['with_20multiple_20files_11',['How to use with multiple files?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md139',1,'']]], + ['with_20shared_20objects_20dlls_12',['Dealing with shared objects (DLLs)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html#autotoc_md152',1,'']]], + ['with_20the_20framework_13',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['within_20the_20same_20binary_20executable_20dll_14',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['write_20tests_20in_20header_20only_20libraries_15',['How to write tests in header-only libraries?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md134',1,'']]] +]; diff --git a/git-main/search/all_2.js b/git-main/search/all_2.js index 9ab6059..e153fed 100644 --- a/git-main/search/all_2.js +++ b/git-main/search/all_2.js @@ -1,6 +1,91 @@ var searchData= [ - ['bad_5foptional_5faccess_0',['bad_optional_access',['../structmgutility_1_1bad__optional__access.html',1,'mgutility']]], - ['basic_5fstring_5fview_1',['basic_string_view',['../classmgutility_1_1basic__string__view.html',1,'mgutility::basic_string_view< Char >'],['../classmgutility_1_1basic__string__view.html#a98047372022acfb78fbeb82ff7aa5190',1,'mgutility::basic_string_view::basic_string_view() noexcept'],['../classmgutility_1_1basic__string__view.html#a07cc48696b3095ed0b79327b3a423fe6',1,'mgutility::basic_string_view::basic_string_view(const Char *str) noexcept'],['../classmgutility_1_1basic__string__view.html#ab8993982c8b6cc334f448f440d5f368d',1,'mgutility::basic_string_view::basic_string_view(const std::basic_string< Char > &str) noexcept'],['../classmgutility_1_1basic__string__view.html#ac3d4a66987b79b36a6207a7d9c85a5ba',1,'mgutility::basic_string_view::basic_string_view(const Char *str, size_t len) noexcept'],['../classmgutility_1_1basic__string__view.html#a25e8d6ef98e904e1848fb80fe806b2db',1,'mgutility::basic_string_view::basic_string_view(const basic_string_view &other)'],['../classmgutility_1_1basic__string__view.html#a3bf92ec244076c7a71569d64bddc7e3e',1,'mgutility::basic_string_view::basic_string_view(basic_string_view &&other) noexcept']]], - ['begin_2',['begin',['../classmgutility_1_1enum__for__each.html#a1415f386351d4564317694ea55e29954',1,'mgutility::enum_for_each::begin()'],['../classmgutility_1_1basic__string__view.html#a7e457bc18a0dbd2958f740befdb9943d',1,'mgutility::basic_string_view::begin()']]] + ['2_200_200_202_200_200_20a_202018_2008_2023_0',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['2_200_201_202_200_201_20a_202018_2010_2024_1',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['2_200_201_202_200_20a_202017_2005_2015_2',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['2_201_200_202_201_200_20a_202018_2011_2030_3',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['2_201_201_202_201_20a_202017_2005_2024_4',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['2_201_201_202_20a_202016_2010_2010_5',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['2_202_200_202_202_200_20a_202018_2012_2005_6',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['2_202_201_202_202_201_20a_202019_2001_2015_7',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['2_202_201_202_202_20a_202017_2009_2005_8',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['2_202_202_202_202_202_20a_202019_2001_2028_9',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['2_202_203_202_202_203_20a_202019_2002_2010_10',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['2_203_200_202_203_200_20a_202019_2003_2023_11',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['2_203_201_202_203_201_20a_202019_2003_2024_12',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['2_203_201_202_203_20a_202017_2009_2011_13',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['2_203_202_202_203_202_20a_202019_2005_2006_14',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['2_203_203_202_203_203_20a_202019_2006_2002_15',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['2_203_204_202_203_204_20a_202019_2008_2012_16',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['2_203_205_202_203_205_20a_202019_2009_2022_17',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['2_203_206_202_203_206_20a_202019_2012_2016_18',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['2_203_207_202_203_207_20a_202020_2002_2024_19',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['2_203_208_202_203_208_20a_202020_2005_2017_20',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['2_204_200_202_204_200_20a_202020_2006_2027_21',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['2_204_201_202_204_201_20a_202020_2011_2004_22',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['2_204_201_202_204_20a_202017_2009_2020_23',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['2_204_202_202_204_202_20a_202020_2012_2015_24',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['2_204_203_202_204_203_20a_202020_2012_2016_25',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['2_204_204_202_204_204_20a_202020_2012_2025_26',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['2_204_205_202_204_205_20a_202021_2002_2002_27',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['2_204_206_202_204_206_20a_202021_2003_2022_28',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['2_204_207_202_204_207_20a_202021_2012_2010_29',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['2_205_201_202_205_20a_202017_2010_2006_30',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['2_206_201_202_206_20a_202017_2010_2029_31',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['2_207_201_202_207_20a_202018_2002_2006_32',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['2_208_201_202_208_20a_202018_2003_2010_33',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['2_209_201_202_209_20a_202018_2005_2010_34',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['20_35',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['2016_2005_2022_36',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['2016_2009_2021_37',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['2016_2009_2022_38',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['2016_2010_2010_39',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['2016_2011_2015_40',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['2017_2002_2018_41',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['2017_2005_2015_42',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['2017_2005_2024_43',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['2017_2009_2005_44',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['2017_2009_2011_45',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['2017_2009_2020_46',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['2017_2010_2006_47',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['2017_2010_2029_48',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['2018_2002_2006_49',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['2018_2003_2010_50',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['2018_2005_2010_51',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['2018_2008_2023_52',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['2018_2010_2024_53',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['2018_2011_2030_54',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['2018_2012_2005_55',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['2019_2001_2015_56',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['2019_2001_2028_57',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['2019_2002_2010_58',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['2019_2003_2023_59',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['2019_2003_2024_60',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['2019_2005_2006_61',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['2019_2006_2002_62',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['2019_2008_2012_63',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['2019_2009_2022_64',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['2019_2012_2016_65',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['2020_2002_2024_66',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['2020_2005_2017_67',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['2020_2006_2027_68',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['2020_2011_2004_69',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['2020_2012_2015_70',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['2020_2012_2016_71',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['2020_2012_2025_72',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['2021_2002_2002_73',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['2021_2003_2022_74',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['2021_2012_2010_75',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['2022_2001_2010_76',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['2022_2006_2018_77',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['2023_2002_2027_78',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['2023_2003_2015_79',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['21_80',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['22_81',['22',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)']]], + ['23_82',['23',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)']]], + ['24_83',['24',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)']]], + ['25_84',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['27_85',['27',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)']]], + ['28_86',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['29_87',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]] ]; diff --git a/git-main/search/all_20.js b/git-main/search/all_20.js new file mode 100644 index 0000000..fbb8256 --- /dev/null +++ b/git-main/search/all_20.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['z_205ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]] +]; diff --git a/git-main/search/all_21.js b/git-main/search/all_21.js new file mode 100644 index 0000000..d1b8aef --- /dev/null +++ b/git-main/search/all_21.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7eoptional_0',['~optional',['../classmgutility_1_1optional.html#a2e1c20d05d40a957ee86318dc1558ff8',1,'mgutility::optional']]] +]; diff --git a/git-main/search/all_3.js b/git-main/search/all_3.js index 79160d7..2bccc90 100644 --- a/git-main/search/all_3.js +++ b/git-main/search/all_3.js @@ -1,7 +1,17 @@ var searchData= [ - ['cmake_0',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md5',1,'']]], - ['compilers_1',['Supported Compilers',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md2',1,'']]], - ['custom_5fenum_2',['custom_enum',['../structmgutility_1_1custom__enum.html',1,'mgutility']]], - ['custom_5fenum_3c_20position_20_3e_3',['custom_enum< Position >',['../structmgutility_1_1custom__enum_3_01Position_01_4.html',1,'mgutility']]] + ['3_200_202_203_200_20a_202019_2003_2023_0',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['3_201_201_203_20a_202016_2011_2015_1',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['3_201_202_203_201_20a_202019_2003_2024_2',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['3_201_202_203_20a_202017_2009_2011_3',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['3_202_202_203_202_20a_202019_2005_2006_4',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['3_202_202_203_20a_202019_2002_2010_5',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['3_202_204_203_20a_202020_2012_2016_6',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['3_203_202_203_203_20a_202019_2006_2002_7',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['3_204_202_203_204_20a_202019_2008_2012_8',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['3_205_202_203_205_20a_202019_2009_2022_9',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['3_206_202_203_206_20a_202019_2012_2016_10',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['3_207_202_203_207_20a_202020_2002_2024_11',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['3_208_202_203_208_20a_202020_2005_2017_12',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['30_13',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]] ]; diff --git a/git-main/search/all_4.js b/git-main/search/all_4.js index e559cab..5e1c16b 100644 --- a/git-main/search/all_4.js +++ b/git-main/search/all_4.js @@ -1,5 +1,18 @@ var searchData= [ - ['data_0',['data',['../classmgutility_1_1basic__string__view.html#ab37f2035ecf1724d175b3b4a553b97ab',1,'mgutility::basic_string_view']]], - ['definitions_2ehpp_1',['definitions.hpp',['../definitions_8hpp.html',1,'']]] + ['4_200_202_204_200_20a_202020_2006_2027_0',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['4_201_201_204_20a_202017_2002_2018_1',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['4_201_202_204_201_20a_202020_2011_2004_2',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['4_201_202_204_20a_202017_2009_2020_3',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['4_2010_20v2_204_2010_20a_202023_2002_2027_4',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['4_2011_20v2_204_2011_20a_202023_2003_2015_5',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['4_202_202_204_202_20a_202020_2012_2015_6',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['4_202_203_204_20a_202019_2008_2012_7',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['4_203_202_204_203_20a_202020_2012_2016_8',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['4_204_202_204_204_20a_202020_2012_2025_9',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['4_205_202_204_205_20a_202021_2002_2002_10',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['4_206_202_204_206_20a_202021_2003_2022_11',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['4_207_202_204_207_20a_202021_2012_2010_12',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['4_208_20v2_204_208_20a_202022_2001_2010_13',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['4_209_20v2_204_209_20a_202022_2006_2018_14',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]] ]; diff --git a/git-main/search/all_5.js b/git-main/search/all_5.js index fd1d6c8..d79fa56 100644 --- a/git-main/search/all_5.js +++ b/git-main/search/all_5.js @@ -1,18 +1,7 @@ var searchData= [ - ['emplace_0',['emplace',['../classmgutility_1_1optional.html#aafd73c0d09db703e5e6a4e731b192ccb',1,'mgutility::optional::emplace(T value)'],['../classmgutility_1_1optional.html#a1c9693d3f4714f7dff5b56900450d2fd',1,'mgutility::optional::emplace(Args &&...args)']]], - ['empty_1',['empty',['../classmgutility_1_1basic__string__view.html#a37b876e4fd007b94772dd289b58a1bce',1,'mgutility::basic_string_view']]], - ['end_2',['end',['../classmgutility_1_1enum__for__each.html#a6ab0021b410129cbb2d45a21997bb9d5',1,'mgutility::enum_for_each::end()'],['../classmgutility_1_1basic__string__view.html#a0b623628e1fed88cd8f2489ec22782cd',1,'mgutility::basic_string_view::end()']]], - ['enum_5fcast_3',['enum_cast',['../namespacemgutility.html#a945fab3988ccb5de52589c67ee654e38',1,'mgutility']]], - ['enum_5ffor_5feach_4',['enum_for_each',['../classmgutility_1_1enum__for__each.html',1,'mgutility::enum_for_each< Enum >'],['../classmgutility_1_1enum__for__each.html#a136743f726f0af0b04c027dfa3ca08cc',1,'mgutility::enum_for_each::enum_for_each()']]], - ['enum_5fname_5',['enum_name',['../namespacemgutility.html#a56127482f9ec47f2b6600cfdab84af03',1,'mgutility::enum_name()'],['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html',1,'enum_name']]], - ['enum_5frange_6',['enum_range',['../structmgutility_1_1enum__range.html',1,'mgutility']]], - ['enum_5frange_3c_20color_20_3e_7',['enum_range< color >',['../structmgutility_1_1enum__range_3_01color_01_4.html',1,'mgutility']]], - ['enum_5frange_3c_20position_20_3e_8',['enum_range< Position >',['../structmgutility_1_1enum__range_3_01Position_01_4.html',1,'mgutility']]], - ['enum_5fsequence_9',['enum_sequence',['../structmgutility_1_1detail_1_1enum__sequence.html',1,'mgutility::detail']]], - ['enum_5fsequence_5fhelper_10',['enum_sequence_helper',['../structmgutility_1_1detail_1_1enum__sequence__helper.html',1,'mgutility::detail']]], - ['enum_5fsequence_5fhelper_3c_20enum_2c_20min_2c_20min_2c_20next_2e_2e_2e_20_3e_11',['enum_sequence_helper< Enum, Min, Min, Next... >',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html',1,'mgutility::detail']]], - ['enum_5fto_5funderlying_12',['enum_to_underlying',['../namespacemgutility.html#a0434e4efb8b555e4f2ab34b000c8dd47',1,'mgutility']]], - ['enum_5ftype_13',['enum_type',['../structmgutility_1_1detail_1_1enum__type.html',1,'mgutility::detail']]], - ['example_20usage_20a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_14',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['5_201_202_205_20a_202017_2010_2006_0',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['5_202_203_205_20a_202019_2009_2022_1',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['5_202_204_205_20a_202021_2002_2002_2',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['5ye185mwa_20try_20it_20a_3',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]] ]; diff --git a/git-main/search/all_6.js b/git-main/search/all_6.js index e32810d..9bd7395 100644 --- a/git-main/search/all_6.js +++ b/git-main/search/all_6.js @@ -1,6 +1,6 @@ var searchData= [ - ['features_0',['Features',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md3',1,'']]], - ['fetch_20library_20with_20cmake_1',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md5',1,'']]], - ['find_2',['find',['../classmgutility_1_1basic__string__view.html#a511d28b000ada097a6f4449266c2a018',1,'mgutility::basic_string_view']]] + ['6_201_202_206_20a_202017_2010_2029_0',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['6_202_203_206_20a_202019_2012_2016_1',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['6_202_204_206_20a_202021_2003_2022_2',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]] ]; diff --git a/git-main/search/all_7.js b/git-main/search/all_7.js index ecf2a96..456162b 100644 --- a/git-main/search/all_7.js +++ b/git-main/search/all_7.js @@ -1,4 +1,6 @@ var searchData= [ - ['godbolt_20org_20z_205ye185mwa_20try_20it_20a_0',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['7_201_202_207_20a_202018_2002_2006_0',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['7_202_203_207_20a_202020_2002_2024_1',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['7_202_204_207_20a_202021_2012_2010_2',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]] ]; diff --git a/git-main/search/all_8.js b/git-main/search/all_8.js index 329d8db..62f803d 100644 --- a/git-main/search/all_8.js +++ b/git-main/search/all_8.js @@ -1,8 +1,6 @@ var searchData= [ - ['has_5fbit_5for_0',['has_bit_or',['../structmgutility_1_1detail_1_1has__bit__or.html',1,'mgutility::detail']]], - ['has_5fbit_5for_3c_20t_2c_20decltype_28_28t_7b_7d_7ct_7b_7d_29_2c_20void_28_29_29_3e_1',['has_bit_or< T, decltype((T{}|T{}), void())>',['../structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html',1,'mgutility::detail']]], - ['has_5fvalue_2',['has_value',['../classmgutility_1_1optional.html#a444270b6571ff545b4c2f354eb74eaa1',1,'mgutility::optional']]], - ['href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_3',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]], - ['https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_4',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['8_201_202_208_20a_202018_2003_2010_0',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['8_202_203_208_20a_202020_2005_2017_1',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['8_20v2_204_208_20a_202022_2001_2010_2',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]] ]; diff --git a/git-main/search/all_9.js b/git-main/search/all_9.js index b85923a..6e3726d 100644 --- a/git-main/search/all_9.js +++ b/git-main/search/all_9.js @@ -1,5 +1,5 @@ var searchData= [ - ['is_5fscoped_5fenum_0',['is_scoped_enum',['../structmgutility_1_1detail_1_1is__scoped__enum.html',1,'mgutility::detail']]], - ['it_20a_1',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['9_201_202_209_20a_202018_2005_2010_0',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['9_20v2_204_209_20a_202022_2006_2018_1',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]] ]; diff --git a/git-main/search/all_a.js b/git-main/search/all_a.js index cbd73f0..5d3bfb2 100644 --- a/git-main/search/all_a.js +++ b/git-main/search/all_a.js @@ -1,5 +1,4 @@ var searchData= [ - ['library_20with_20cmake_0',['Fetch library with CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md5',1,'']]], - ['limitations_1',['Limitations',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md4',1,'']]] + ['_3a_0',['Unintrusive (transparent):',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md142',1,'']]] ]; diff --git a/git-main/search/all_b.js b/git-main/search/all_b.js index 7e222e5..1a57021 100644 --- a/git-main/search/all_b.js +++ b/git-main/search/all_b.js @@ -1,8 +1,70 @@ var searchData= [ - ['main_20page_0',['Main page',['../index.html',1,'']]], - ['mgutility_1',['mgutility',['../namespacemgutility.html',1,'']]], - ['mgutility_5fcnstevl_2',['MGUTILITY_CNSTEVL',['../definitions_8hpp.html#ae79da58f317cf12394dd7e76dbbe832c',1,'definitions.hpp']]], - ['mgutility_5fcnstxpr_5fclang_5fwa_3',['MGUTILITY_CNSTXPR_CLANG_WA',['../definitions_8hpp.html#ad7d158b2132888de05e72cdd28db7e11',1,'definitions.hpp']]], - ['mgutility_5fcplusplus_4',['MGUTILITY_CPLUSPLUS',['../definitions_8hpp.html#ad1e229b7b0500b2c1044b9816307fc02',1,'definitions.hpp']]] + ['a_0',['A',['../structN_1_1A.html',1,'N']]], + ['a_20href_20doctest_20extensions_20doctest_5fmpi_20h_20distributed_20tests_20with_20mpi_20a_1',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['a_20href_20doctest_20extensions_20doctest_5futil_20h_20utils_20a_2',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['a_20href_20https_3a_20github_20com_20catchorg_20catch2_20catch_20a_3',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_4',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_5',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_6',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_7',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_8',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_9',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_10',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_11',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_12',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_13',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_14',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_15',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_16',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_17',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_18',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_19',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_20',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_21',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_22',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_23',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_24',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_25',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_26',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_27',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_28',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_29',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_30',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_31',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_32',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_33',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_34',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_35',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_36',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_37',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_38',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_39',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_40',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_41',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_42',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_43',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_44',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_45',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_46',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['a_20href_20https_3a_20github_20com_20doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_47',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_48',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['a_20simple_20example_49',['A simple example',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md178',1,'']]], + ['a_20static_20library_20not_20getting_20registered_50',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['a_20testing_20context_51',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['actually_20comparing_20pointers_52',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['an_20assertion_20macro_53',['Cost of an assertion macro',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md66',1,'']]], + ['and_20design_20goals_54',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]], + ['and_20mpi_20reporters_55',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['and_20subcases_56',['Test cases and subcases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md180',1,'']]], + ['and_20unary_20asserts_57',['Binary and unary asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md50',1,'']]], + ['approx_58',['Approx',['../structdoctest_1_1Approx.html',1,'doctest']]], + ['are_20my_20tests_20in_20a_20static_20library_20not_20getting_20registered_59',['Why are my tests in a static library not getting registered?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md132',1,'']]], + ['assertdata_60',['AssertData',['../structdoctest_1_1AssertData.html',1,'doctest']]], + ['assertion_20macro_61',['Cost of an assertion macro',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md66',1,'']]], + ['assertion_20macros_62',['Assertion macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html',1,'']]], + ['assertions_63',['Assertions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md118',1,'']]], + ['asserts_64',['Asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md50',1,'Binary and unary asserts'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md49',1,'Expression decomposing asserts']]], + ['asserts_20out_20of_20a_20testing_20context_65',['Using asserts out of a testing context',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'']]], + ['aware_66',['Is doctest thread-aware?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md130',1,'']]] ]; diff --git a/git-main/search/all_c.js b/git-main/search/all_c.js index 9e1984b..9e49e13 100644 --- a/git-main/search/all_c.js +++ b/git-main/search/all_c.js @@ -1,6 +1,17 @@ var searchData= [ - ['name_0',['name',['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view'],['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view']]], - ['nullopt_1',['nullopt',['../namespacemgutility.html#a2472ad38d80978a9a8c3150e0e2ba43c',1,'mgutility']]], - ['nullopt_5ft_2',['nullopt_t',['../structmgutility_1_1nullopt__t.html',1,'mgutility']]] + ['b_0',['B',['../structN_1_1B.html',1,'N']]], + ['bad_5foptional_5faccess_1',['bad_optional_access',['../structmgutility_1_1bad__optional__access.html',1,'mgutility']]], + ['basic_5fistream_2',['basic_istream',['../classstd_1_1basic__istream.html',1,'std']]], + ['basic_5fostream_3',['basic_ostream',['../classstd_1_1basic__ostream.html',1,'std']]], + ['basic_5fstring_5fview_4',['basic_string_view',['../classmgutility_1_1basic__string__view.html',1,'mgutility::basic_string_view< Char >'],['../classmgutility_1_1basic__string__view.html#a98047372022acfb78fbeb82ff7aa5190',1,'mgutility::basic_string_view::basic_string_view() noexcept'],['../classmgutility_1_1basic__string__view.html#a07cc48696b3095ed0b79327b3a423fe6',1,'mgutility::basic_string_view::basic_string_view(const Char *str) noexcept'],['../classmgutility_1_1basic__string__view.html#ab8993982c8b6cc334f448f440d5f368d',1,'mgutility::basic_string_view::basic_string_view(const std::basic_string< Char > &str) noexcept'],['../classmgutility_1_1basic__string__view.html#ac3d4a66987b79b36a6207a7d9c85a5ba',1,'mgutility::basic_string_view::basic_string_view(const Char *str, size_t len) noexcept'],['../classmgutility_1_1basic__string__view.html#a25e8d6ef98e904e1848fb80fe806b2db',1,'mgutility::basic_string_view::basic_string_view(const basic_string_view &other)'],['../classmgutility_1_1basic__string__view.html#a3bf92ec244076c7a71569d64bddc7e3e',1,'mgutility::basic_string_view::basic_string_view(basic_string_view &&other) noexcept']]], + ['bdd_20style_20test_20cases_5',['BDD-style test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md171',1,'']]], + ['be_20used_20within_20the_20same_20binary_20executable_20dll_6',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['begin_7',['begin',['../classmgutility_1_1enum__for__each.html#a1415f386351d4564317694ea55e29954',1,'mgutility::enum_for_each::begin()'],['../classmgutility_1_1basic__string__view.html#a7e457bc18a0dbd2958f740befdb9943d',1,'mgutility::basic_string_view::begin()']]], + ['benchmarks_8',['Benchmarks',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html',1,'Benchmarks'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md59',1,'Compile time benchmarks'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md68',1,'Runtime benchmarks']]], + ['best_20compile_20time_20performance_20with_20the_20framework_9',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['binary_20and_20unary_20asserts_10',['Binary and unary asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md50',1,'']]], + ['binary_20executable_20dll_11',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['build_20systems_12',['Build systems',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html',1,'']]], + ['by_20type_13',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]] ]; diff --git a/git-main/search/all_d.js b/git-main/search/all_d.js index dcc89d6..5f77347 100644 --- a/git-main/search/all_d.js +++ b/git-main/search/all_d.js @@ -1,14 +1,89 @@ var searchData= [ - ['operator_20bool_0',['operator bool',['../classmgutility_1_1optional.html#ab0f2e6f47e7c8eb9b1c4bd553df6eb63',1,'mgutility::optional']]], - ['operator_20optional_3c_20t_20_3e_1',['operator optional< T >',['../structmgutility_1_1nullopt__t.html#a0239dc56aa60ab9eb05646f66814c8b5',1,'mgutility::nullopt_t']]], - ['operator_20std_3a_3astring_2',['operator std::string',['../classmgutility_1_1basic__string__view.html#a88ab597eb09f775835b2b1012e4738cd',1,'mgutility::basic_string_view::string()'],['../classmgutility_1_1basic__string__view.html#a25b10409abab3fcb1152c301c5e2cc68',1,'mgutility::basic_string_view::string() const']]], - ['operator_21_3d_3',['operator!=',['../classmgutility_1_1basic__string__view.html#a1d20761329e2d939ab77bbe3e91570d3',1,'mgutility::basic_string_view::operator!='],['../classmgutility_1_1basic__string__view.html#adac0147a9db1ea20951f75cd3664fcda',1,'mgutility::basic_string_view::operator!=']]], - ['operator_2a_4',['operator*',['../classmgutility_1_1optional.html#a86530a0954753d4f81a55364d631bc2a',1,'mgutility::optional::operator*()'],['../classmgutility_1_1optional.html#a5abeb6aa1847ff267211454a9f3f7f50',1,'mgutility::optional::operator*() const']]], - ['operator_3c_3c_5',['operator<<',['../classmgutility_1_1basic__string__view.html#a3a539c3eb984671d1bdbb035960cb9d6',1,'mgutility::basic_string_view']]], - ['operator_3d_6',['operator=',['../classmgutility_1_1optional.html#a37d1cdc3ee17e9b0ad6f51f196377c6f',1,'mgutility::optional::operator=(const optional &other)'],['../classmgutility_1_1optional.html#a12c470b6074a02e2e05b8f3d99723bdc',1,'mgutility::optional::operator=(optional &&other)'],['../classmgutility_1_1basic__string__view.html#a5dd4b45964ba415e1bc756dbd16e086d',1,'mgutility::basic_string_view::operator=(const basic_string_view &other) noexcept'],['../classmgutility_1_1basic__string__view.html#aebc213a351e10cdb8fea03c5a06d6704',1,'mgutility::basic_string_view::operator=(basic_string_view &&other) noexcept']]], - ['operator_3d_3d_7',['operator==',['../classmgutility_1_1basic__string__view.html#a4f78e96e1c8cd701e36367971c7f112b',1,'mgutility::basic_string_view::operator=='],['../classmgutility_1_1basic__string__view.html#a4e033e35d453263fd34724b2b9634581',1,'mgutility::basic_string_view::operator==']]], - ['operator_5b_5d_8',['operator[]',['../classmgutility_1_1basic__string__view.html#a78d80b32f442c1c0994af67cb1a42e1d',1,'mgutility::basic_string_view']]], - ['optional_9',['optional',['../classmgutility_1_1optional.html',1,'mgutility::optional< T >'],['../classmgutility_1_1optional.html#aaf01ec86b3bd0649e824cb262bf238ba',1,'mgutility::optional::optional(nullopt_t &)'],['../classmgutility_1_1optional.html#a6dfc2e2dd5035fe8f4e2ea2d499ff0c6',1,'mgutility::optional::optional()'],['../classmgutility_1_1optional.html#a1f9831c9b189a71acafcdb2b4ebba70f',1,'mgutility::optional::optional(Args &&...args)'],['../classmgutility_1_1optional.html#a42acc3e5b153bece49622510a3b66ade',1,'mgutility::optional::optional(T &&value)'],['../classmgutility_1_1optional.html#a8e42e264b59aeb9c14817895ed617c42',1,'mgutility::optional::optional(const optional &other)'],['../classmgutility_1_1optional.html#a836543069b1c3244050f6a39c0118c44',1,'mgutility::optional::optional(optional &&other)']]], - ['org_20z_205ye185mwa_20try_20it_20a_10',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md6',1,'']]] + ['c_0',['C',['../structN_1_1C.html',1,'N']]], + ['c_20strings_20tt_20char_20tt_20actually_20comparing_20pointers_1',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['can_20different_20versions_20of_20the_20framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_2',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['can_20optionally_20fail_20test_20cases_3',['Messages which can optionally fail test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'']]], + ['cases_4',['Cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md171',1,'BDD-style test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html#autotoc_md148',1,'Messages which can optionally fail test cases']]], + ['cases_5',['cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'Parameterized test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html',1,'Test cases']]], + ['cases_6',['Value-parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md155',1,'']]], + ['cases_20and_20subcases_7',['Test cases and subcases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md180',1,'']]], + ['cases_20parameterized_20by_20type_8',['Templated test cases - parameterized by type',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html#autotoc_md157',1,'']]], + ['catch_9',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['catch_20a_10',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['catch2_20catch_20a_11',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['catchorg_20catch2_20catch_20a_12',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['change_20log_13',['Change Log',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html',1,'']]], + ['char_20tt_20actually_20comparing_20pointers_14',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['char_5ftraits_15',['char_traits',['../structstd_1_1char__traits.html',1,'std']]], + ['checking_16',['NaN checking',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md55',1,'']]], + ['cmake_17',['CMake',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html#autotoc_md73',1,'CMake'],['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md193',1,'Fetch library with CMake']]], + ['com_20catchorg_20catch2_20catch_20a_18',['<a href="https://github.com/catchorg/Catch2" >Catch</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md63',1,'']]], + ['com_20doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_19',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['com_20doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_20',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['com_20doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_21',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['com_20doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_22',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['com_20doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_23',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['com_20doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_24',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_25',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_26',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_27',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_28',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_29',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_30',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_31',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_32',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_33',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['com_20doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_34',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['com_20doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_35',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['com_20doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_36',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['com_20doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_37',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['com_20doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_38',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['com_20doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_39',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['com_20doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_40',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['com_20doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_41',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_42',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_43',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_44',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_45',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_46',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_47',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_48',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_49',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['com_20doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_50',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_51',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_52',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_53',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_54',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_55',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_56',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_57',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['com_20doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_58',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['com_20doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_59',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['com_20doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_60',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['com_20doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_61',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['com_20doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_62',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['command_20line_63',['Command line',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2commandline.html',1,'']]], + ['comparing_20c_20strings_20tt_20char_20tt_20actually_20comparing_20pointers_64',['Why is comparing C strings (<tt>char*</tt>) actually comparing pointers?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md133',1,'']]], + ['comparisons_65',['Floating point comparisons',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md54',1,'']]], + ['compile_20time_20benchmarks_66',['Compile time benchmarks',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md59',1,'']]], + ['compile_20time_20performance_20with_20the_20framework_67',['How to get the best compile-time performance with the framework?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md129',1,'']]], + ['compiler_20errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_68',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['compilers_69',['Supported Compilers',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md190',1,'']]], + ['conclusion_70',['Conclusion',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md61',1,'Conclusion'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md67',1,'Conclusion'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md69',1,'Conclusion']]], + ['configuration_71',['Configuration',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html',1,'']]], + ['containment_72',['String containment',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md53',1,'']]], + ['contains_73',['Contains',['../classdoctest_1_1Contains.html',1,'doctest']]], + ['context_74',['Context',['../classdoctest_1_1Context.html',1,'doctest::Context'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md52',1,'Using asserts out of a testing context']]], + ['contextoptions_75',['ContextOptions',['../structdoctest_1_1ContextOptions.html',1,'doctest']]], + ['contextscope_76',['ContextScope',['../classdoctest_1_1detail_1_1ContextScope.html',1,'doctest::detail']]], + ['contextscopebase_77',['ContextScopeBase',['../structdoctest_1_1detail_1_1ContextScopeBase.html',1,'doctest::detail']]], + ['contextstate_78',['ContextState',['../structdoctest_1_1detail_1_1ContextState.html',1,'doctest::detail']]], + ['contributing_79',['Contributing',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CONTRIBUTING.html',1,'Contributing'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md185',1,'Contributing']]], + ['conversions_80',['String conversions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html',1,'']]], + ['cost_20of_20an_20assertion_20macro_81',['Cost of an assertion macro',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md66',1,'']]], + ['cost_20of_20including_20the_20header_82',['Cost of including the header',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md60',1,'']]], + ['currenttestcasestats_83',['CurrentTestCaseStats',['../structdoctest_1_1CurrentTestCaseStats.html',1,'doctest']]], + ['custom_5fenum_84',['custom_enum',['../structmgutility_1_1custom__enum.html',1,'mgutility']]], + ['custom_5fenum_3c_20position_20_3e_85',['custom_enum< Position >',['../structmgutility_1_1custom__enum_3_01Position_01_4.html',1,'mgutility']]] ]; diff --git a/git-main/search/all_e.js b/git-main/search/all_e.js index d00a333..e3f499a 100644 --- a/git-main/search/all_e.js +++ b/git-main/search/all_e.js @@ -1,7 +1,110 @@ var searchData= [ - ['page_0',['Main page',['../index.html',1,'']]], - ['pair_1',['pair',['../structmgutility_1_1pair.html',1,'mgutility']]], - ['pair_3c_20position_20_3e_2',['pair< Position >',['../structmgutility_1_1pair.html',1,'mgutility']]], - ['pair_3c_20t_20_3e_3',['pair< T >',['../structmgutility_1_1pair.html',1,'mgutility']]] + ['data_0',['data',['../classmgutility_1_1basic__string__view.html#ab37f2035ecf1724d175b3b4a553b97ab',1,'mgutility::basic_string_view']]], + ['dealing_20with_20shared_20objects_20dlls_1',['Dealing with shared objects (DLLs)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html#autotoc_md152',1,'']]], + ['decomposing_20asserts_2',['Expression decomposing asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md49',1,'']]], + ['decorators_3',['Decorators',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html#autotoc_md174',1,'']]], + ['deferred_5ffalse_4',['deferred_false',['../structdoctest_1_1detail_1_1deferred__false.html',1,'doctest::detail']]], + ['definitions_2ehpp_5',['definitions.hpp',['../definitions_8hpp.html',1,'']]], + ['design_20goals_6',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]], + ['did_20we_20do_20here_7',['What did we do here?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md179',1,'']]], + ['different_20from_20catch_8',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['different_20from_20google_20test_9',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['different_20versions_20of_20the_20framework_20be_20used_20within_20the_20same_20binary_20executable_20dll_10',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['distributed_20tests_20with_20mpi_20a_11',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['dll_12',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['dlls_13',['Dealing with shared objects (DLLs)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html#autotoc_md152',1,'']]], + ['do_20here_14',['What did we do here?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md179',1,'']]], + ['do_20i_20get_20compiler_20errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_15',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['doctest_16',['doctest',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html#autotoc_md62',1,'']]], + ['doctest_20doctest_20tree_201_200_200_201_200_200_20a_202016_2005_2022_17',['<a href="https://github.com/doctest/doctest/tree/1.0.0" >1.0.0</a> (2016-05-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md44',1,'']]], + ['doctest_20doctest_20tree_201_201_200_201_201_200_20a_202016_2009_2021_18',['<a href="https://github.com/doctest/doctest/tree/1.1.0" >1.1.0</a> (2016-09-21)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md43',1,'']]], + ['doctest_20doctest_20tree_201_201_201_201_201_201_20a_202016_2009_2022_19',['<a href="https://github.com/doctest/doctest/tree/1.1.1" >1.1.1</a> (2016-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md42',1,'']]], + ['doctest_20doctest_20tree_201_201_202_201_201_202_20a_202016_2010_2010_20',['<a href="https://github.com/doctest/doctest/tree/1.1.2" >1.1.2</a> (2016-10-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md41',1,'']]], + ['doctest_20doctest_20tree_201_201_203_201_201_203_20a_202016_2011_2015_21',['<a href="https://github.com/doctest/doctest/tree/1.1.3" >1.1.3</a> (2016-11-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md40',1,'']]], + ['doctest_20doctest_20tree_201_201_204_201_201_204_20a_202017_2002_2018_22',['<a href="https://github.com/doctest/doctest/tree/1.1.4" >1.1.4</a> (2017-02-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md39',1,'']]], + ['doctest_20doctest_20tree_201_202_200_201_202_200_20a_202017_2005_2015_23',['<a href="https://github.com/doctest/doctest/tree/1.2.0" >1.2.0</a> (2017-05-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md38',1,'']]], + ['doctest_20doctest_20tree_201_202_201_201_202_201_20a_202017_2005_2024_24',['<a href="https://github.com/doctest/doctest/tree/1.2.1" >1.2.1</a> (2017-05-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md37',1,'']]], + ['doctest_20doctest_20tree_201_202_202_201_202_202_20a_202017_2009_2005_25',['<a href="https://github.com/doctest/doctest/tree/1.2.2" >1.2.2</a> (2017-09-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md36',1,'']]], + ['doctest_20doctest_20tree_201_202_203_201_202_203_20a_202017_2009_2011_26',['<a href="https://github.com/doctest/doctest/tree/1.2.3" >1.2.3</a> (2017-09-11)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md35',1,'']]], + ['doctest_20doctest_20tree_201_202_204_201_202_204_20a_202017_2009_2020_27',['<a href="https://github.com/doctest/doctest/tree/1.2.4" >1.2.4</a> (2017-09-20)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md34',1,'']]], + ['doctest_20doctest_20tree_201_202_205_201_202_205_20a_202017_2010_2006_28',['<a href="https://github.com/doctest/doctest/tree/1.2.5" >1.2.5</a> (2017-10-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md33',1,'']]], + ['doctest_20doctest_20tree_201_202_206_201_202_206_20a_202017_2010_2029_29',['<a href="https://github.com/doctest/doctest/tree/1.2.6" >1.2.6</a> (2017-10-29)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md32',1,'']]], + ['doctest_20doctest_20tree_201_202_207_201_202_207_20a_202018_2002_2006_30',['<a href="https://github.com/doctest/doctest/tree/1.2.7" >1.2.7</a> (2018-02-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md31',1,'']]], + ['doctest_20doctest_20tree_201_202_208_201_202_208_20a_202018_2003_2010_31',['<a href="https://github.com/doctest/doctest/tree/1.2.8" >1.2.8</a> (2018-03-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md30',1,'']]], + ['doctest_20doctest_20tree_201_202_209_201_202_209_20a_202018_2005_2010_32',['<a href="https://github.com/doctest/doctest/tree/1.2.9" >1.2.9</a> (2018-05-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md29',1,'']]], + ['doctest_20doctest_20tree_202_200_200_202_200_200_20a_202018_2008_2023_33',['<a href="https://github.com/doctest/doctest/tree/2.0.0" >2.0.0</a> (2018-08-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md28',1,'']]], + ['doctest_20doctest_20tree_202_200_201_202_200_201_20a_202018_2010_2024_34',['<a href="https://github.com/doctest/doctest/tree/2.0.1" >2.0.1</a> (2018-10-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md27',1,'']]], + ['doctest_20doctest_20tree_202_201_200_202_201_200_20a_202018_2011_2030_35',['<a href="https://github.com/doctest/doctest/tree/2.1.0" >2.1.0</a> (2018-11-30)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md26',1,'']]], + ['doctest_20doctest_20tree_202_202_200_202_202_200_20a_202018_2012_2005_36',['<a href="https://github.com/doctest/doctest/tree/2.2.0" >2.2.0</a> (2018-12-05)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md25',1,'']]], + ['doctest_20doctest_20tree_202_202_201_202_202_201_20a_202019_2001_2015_37',['<a href="https://github.com/doctest/doctest/tree/2.2.1" >2.2.1</a> (2019-01-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md24',1,'']]], + ['doctest_20doctest_20tree_202_202_202_202_202_202_20a_202019_2001_2028_38',['<a href="https://github.com/doctest/doctest/tree/2.2.2" >2.2.2</a> (2019-01-28)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md23',1,'']]], + ['doctest_20doctest_20tree_202_202_203_202_202_203_20a_202019_2002_2010_39',['<a href="https://github.com/doctest/doctest/tree/2.2.3" >2.2.3</a> (2019-02-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md22',1,'']]], + ['doctest_20doctest_20tree_202_203_200_202_203_200_20a_202019_2003_2023_40',['<a href="https://github.com/doctest/doctest/tree/2.3.0" >2.3.0</a> (2019-03-23)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md21',1,'']]], + ['doctest_20doctest_20tree_202_203_201_202_203_201_20a_202019_2003_2024_41',['<a href="https://github.com/doctest/doctest/tree/2.3.1" >2.3.1</a> (2019-03-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md20',1,'']]], + ['doctest_20doctest_20tree_202_203_202_202_203_202_20a_202019_2005_2006_42',['<a href="https://github.com/doctest/doctest/tree/2.3.2" >2.3.2</a> (2019-05-06)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md19',1,'']]], + ['doctest_20doctest_20tree_202_203_203_202_203_203_20a_202019_2006_2002_43',['<a href="https://github.com/doctest/doctest/tree/2.3.3" >2.3.3</a> (2019-06-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md18',1,'']]], + ['doctest_20doctest_20tree_202_203_204_202_203_204_20a_202019_2008_2012_44',['<a href="https://github.com/doctest/doctest/tree/2.3.4" >2.3.4</a> (2019-08-12)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md17',1,'']]], + ['doctest_20doctest_20tree_202_203_205_202_203_205_20a_202019_2009_2022_45',['<a href="https://github.com/doctest/doctest/tree/2.3.5" >2.3.5</a> (2019-09-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md16',1,'']]], + ['doctest_20doctest_20tree_202_203_206_202_203_206_20a_202019_2012_2016_46',['<a href="https://github.com/doctest/doctest/tree/2.3.6" >2.3.6</a> (2019-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md15',1,'']]], + ['doctest_20doctest_20tree_202_203_207_202_203_207_20a_202020_2002_2024_47',['<a href="https://github.com/doctest/doctest/tree/2.3.7" >2.3.7</a> (2020-02-24)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md14',1,'']]], + ['doctest_20doctest_20tree_202_203_208_202_203_208_20a_202020_2005_2017_48',['<a href="https://github.com/doctest/doctest/tree/2.3.8" >2.3.8</a> (2020-05-17)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md13',1,'']]], + ['doctest_20doctest_20tree_202_204_200_202_204_200_20a_202020_2006_2027_49',['<a href="https://github.com/doctest/doctest/tree/2.4.0" >2.4.0</a> (2020-06-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md12',1,'']]], + ['doctest_20doctest_20tree_202_204_201_202_204_201_20a_202020_2011_2004_50',['<a href="https://github.com/doctest/doctest/tree/2.4.1" >2.4.1</a> (2020-11-04)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md11',1,'']]], + ['doctest_20doctest_20tree_202_204_202_202_204_202_20a_202020_2012_2015_51',['<a href="https://github.com/doctest/doctest/tree/2.4.2" >2.4.2</a> (2020-12-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md10',1,'']]], + ['doctest_20doctest_20tree_202_204_203_202_204_203_20a_202020_2012_2016_52',['<a href="https://github.com/doctest/doctest/tree/2.4.3" >2.4.3</a> (2020-12-16)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md9',1,'']]], + ['doctest_20doctest_20tree_202_204_204_202_204_204_20a_202020_2012_2025_53',['<a href="https://github.com/doctest/doctest/tree/2.4.4" >2.4.4</a> (2020-12-25)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md8',1,'']]], + ['doctest_20doctest_20tree_202_204_205_202_204_205_20a_202021_2002_2002_54',['<a href="https://github.com/doctest/doctest/tree/2.4.5" >2.4.5</a> (2021-02-02)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md7',1,'']]], + ['doctest_20doctest_20tree_202_204_206_202_204_206_20a_202021_2003_2022_55',['<a href="https://github.com/doctest/doctest/tree/2.4.6" >2.4.6</a> (2021-03-22)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md6',1,'']]], + ['doctest_20doctest_20tree_202_204_207_202_204_207_20a_202021_2012_2010_56',['<a href="https://github.com/doctest/doctest/tree/2.4.7" >2.4.7</a> (2021-12-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md5',1,'']]], + ['doctest_20doctest_20tree_20v2_204_2010_20v2_204_2010_20a_202023_2002_2027_57',['<a href="https://github.com/doctest/doctest/tree/v2.4.10" >v2.4.10</a> (2023-02-27)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md2',1,'']]], + ['doctest_20doctest_20tree_20v2_204_2011_20v2_204_2011_20a_202023_2003_2015_58',['<a href="https://github.com/doctest/doctest/tree/v2.4.11" >v2.4.11</a> (2023-03-15)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md1',1,'']]], + ['doctest_20doctest_20tree_20v2_204_208_20v2_204_208_20a_202022_2001_2010_59',['<a href="https://github.com/doctest/doctest/tree/v2.4.8" >v2.4.8</a> (2022-01-10)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md4',1,'']]], + ['doctest_20doctest_20tree_20v2_204_209_20v2_204_209_20a_202022_2006_2018_60',['<a href="https://github.com/doctest/doctest/tree/v2.4.9" >v2.4.9</a> (2022-06-18)',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html#autotoc_md3',1,'']]], + ['doctest_20extensions_20doctest_5fmpi_20h_20distributed_20tests_20with_20mpi_20a_61',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['doctest_20extensions_20doctest_5futil_20h_20utils_20a_62',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['doctest_20header_63',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['doctest_20strong_20different_20from_20catch_64',['How is <strong>doctest</strong> different from Catch?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md127',1,'']]], + ['doctest_20strong_20different_20from_20google_20test_65',['How is <strong>doctest</strong> different from Google Test?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md128',1,'']]], + ['doctest_20thread_20aware_66',['Is doctest thread-aware?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md130',1,'']]], + ['doctest_20using_20macros_67',['Why is doctest using macros?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md138',1,'']]], + ['doctest_3a_3astringmaker_20t_20tt_20specialisation_68',['<tt>doctest::StringMaker\<T\></tt> specialisation',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md166',1,'']]], + ['doctest_3a_3atostring_20tt_20overload_69',['<tt>doctest::toString</tt> overload',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md165',1,'']]], + ['doctest_5fconfig_5fassertion_5fparameters_5fby_5fvalue_20tt_70',['**<tt>DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md96',1,'']]], + ['doctest_5fconfig_5fasserts_5freturn_5fvalues_20tt_71',['**<tt>DOCTEST_CONFIG_ASSERTS_RETURN_VALUES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md107',1,'']]], + ['doctest_5fconfig_5fcolors_5fansi_20tt_72',['**<tt>DOCTEST_CONFIG_COLORS_ANSI</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md99',1,'']]], + ['doctest_5fconfig_5fcolors_5fnone_20tt_73',['**<tt>DOCTEST_CONFIG_COLORS_NONE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md97',1,'']]], + ['doctest_5fconfig_5fcolors_5fwindows_20tt_74',['**<tt>DOCTEST_CONFIG_COLORS_WINDOWS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md98',1,'']]], + ['doctest_5fconfig_5fdisable_20tt_75',['**<tt>DOCTEST_CONFIG_DISABLE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md81',1,'']]], + ['doctest_5fconfig_5fdouble_5fstringify_20tt_76',['**<tt>DOCTEST_CONFIG_DOUBLE_STRINGIFY</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md86',1,'']]], + ['doctest_5fconfig_5fevaluate_5fasserts_5feven_5fwhen_5fdisabled_20tt_77',['**<tt>DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md108',1,'']]], + ['doctest_5fconfig_5fhandle_5fexception_20tt_78',['**<tt>DOCTEST_CONFIG_HANDLE_EXCEPTION</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md111',1,'']]], + ['doctest_5fconfig_5fimplement_20tt_79',['**<tt>DOCTEST_CONFIG_IMPLEMENT</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md80',1,'']]], + ['doctest_5fconfig_5fimplement_5fwith_5fmain_20tt_80',['**<tt>DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md79',1,'']]], + ['doctest_5fconfig_5fimplementation_5fin_5fdll_20tt_81',['**<tt>DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md82',1,'']]], + ['doctest_5fconfig_5finclude_5ftype_5ftraits_20tt_82',['**<tt>DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md104',1,'']]], + ['doctest_5fconfig_5fno_5fcomparison_5fwarning_5fsuppression_20tt_83',['**<tt>DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md90',1,'']]], + ['doctest_5fconfig_5fno_5fcontradicting_5finline_20tt_84',['**<tt>DOCTEST_CONFIG_NO_CONTRADICTING_INLINE</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md109',1,'']]], + ['doctest_5fconfig_5fno_5fexceptions_20tt_85',['**<tt>DOCTEST_CONFIG_NO_EXCEPTIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md94',1,'']]], + ['doctest_5fconfig_5fno_5fexceptions_5fbut_5fwith_5fall_5fasserts_20tt_86',['**<tt>DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md95',1,'']]], + ['doctest_5fconfig_5fno_5finclude_5fiostream_20tt_87',['**<tt>DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md110',1,'']]], + ['doctest_5fconfig_5fno_5fmulti_5flane_5fatomics_20tt_88',['**<tt>DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md106',1,'']]], + ['doctest_5fconfig_5fno_5fmultithreading_20tt_89',['**<tt>DOCTEST_CONFIG_NO_MULTITHREADING</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md105',1,'']]], + ['doctest_5fconfig_5fno_5fposix_5fsignals_20tt_90',['**<tt>DOCTEST_CONFIG_NO_POSIX_SIGNALS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md103',1,'']]], + ['doctest_5fconfig_5fno_5fshort_5fmacro_5fnames_20tt_91',['**<tt>DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md83',1,'']]], + ['doctest_5fconfig_5fno_5ftry_5fcatch_5fin_5fasserts_20tt_92',['**<tt>DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md93',1,'']]], + ['doctest_5fconfig_5fno_5funprefixed_5foptions_20tt_93',['**<tt>DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md92',1,'']]], + ['doctest_5fconfig_5fno_5fwindows_5fseh_20tt_94',['**<tt>DOCTEST_CONFIG_NO_WINDOWS_SEH</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md101',1,'']]], + ['doctest_5fconfig_5foptions_5fprefix_20tt_95',['**<tt>DOCTEST_CONFIG_OPTIONS_PREFIX</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md91',1,'']]], + ['doctest_5fconfig_5fposix_5fsignals_20tt_96',['**<tt>DOCTEST_CONFIG_POSIX_SIGNALS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md102',1,'']]], + ['doctest_5fconfig_5frequire_5fstringification_5ffor_5fall_5fused_5ftypes_20tt_97',['**<tt>DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md85',1,'']]], + ['doctest_5fconfig_5fsuper_5ffast_5fasserts_20tt_98',['**<tt>DOCTEST_CONFIG_SUPER_FAST_ASSERTS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md87',1,'']]], + ['doctest_5fconfig_5ftreat_5fchar_5fstar_5fas_5fstring_20tt_99',['**<tt>DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md84',1,'']]], + ['doctest_5fconfig_5fuse_5fstd_5fheaders_20tt_100',['**<tt>DOCTEST_CONFIG_USE_STD_HEADERS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md88',1,'']]], + ['doctest_5fconfig_5fvoid_5fcast_5fexpressions_20tt_101',['**<tt>DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md89',1,'']]], + ['doctest_5fconfig_5fwindows_5fseh_20tt_102',['**<tt>DOCTEST_CONFIG_WINDOWS_SEH</tt>**',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html#autotoc_md100',1,'']]], + ['doctest_5fmpi_20h_20distributed_20tests_20with_20mpi_20a_103',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['doctest_5futil_20h_20utils_20a_104',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['documentation_105',['Documentation',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html#autotoc_md184',1,'']]], + ['does_20the_20framework_20use_20exceptions_106',['Does the framework use exceptions?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md135',1,'']]] ]; diff --git a/git-main/search/all_f.js b/git-main/search/all_f.js index 84e3316..71b23cf 100644 --- a/git-main/search/all_f.js +++ b/git-main/search/all_f.js @@ -1,5 +1,35 @@ var searchData= [ - ['reset_0',['reset',['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()'],['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()']]], - ['rfind_1',['rfind',['../classmgutility_1_1basic__string__view.html#aa2ee34f07ee7ec37344898d4f5ea57f9',1,'mgutility::basic_string_view']]] + ['emplace_0',['emplace',['../classmgutility_1_1optional.html#aafd73c0d09db703e5e6a4e731b192ccb',1,'mgutility::optional::emplace(T value)'],['../classmgutility_1_1optional.html#a1c9693d3f4714f7dff5b56900450d2fd',1,'mgutility::optional::emplace(Args &&...args)']]], + ['empty_1',['empty',['../classmgutility_1_1basic__string__view.html#a37b876e4fd007b94772dd289b58a1bce',1,'mgutility::basic_string_view']]], + ['enable_5fif_2',['enable_if',['../structdoctest_1_1detail_1_1types_1_1enable__if.html',1,'doctest::detail::types']]], + ['enable_5fif_3c_20true_2c_20t_20_3e_3',['enable_if< true, T >',['../structdoctest_1_1detail_1_1types_1_1enable__if_3_01true_00_01T_01_4.html',1,'doctest::detail::types']]], + ['end_4',['end',['../classmgutility_1_1enum__for__each.html#a6ab0021b410129cbb2d45a21997bb9d5',1,'mgutility::enum_for_each::end()'],['../classmgutility_1_1basic__string__view.html#a0b623628e1fed88cd8f2489ec22782cd',1,'mgutility::basic_string_view::end()']]], + ['entry_20point_5',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['entry_20points_20and_20mpi_20reporters_6',['The main entry points and mpi reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md119',1,'']]], + ['enum_5fcast_7',['enum_cast',['../namespacemgutility.html#a945fab3988ccb5de52589c67ee654e38',1,'mgutility']]], + ['enum_5ffor_5feach_8',['enum_for_each',['../classmgutility_1_1enum__for__each.html',1,'mgutility::enum_for_each< Enum >'],['../classmgutility_1_1enum__for__each.html#a136743f726f0af0b04c027dfa3ca08cc',1,'mgutility::enum_for_each::enum_for_each()']]], + ['enum_5fname_9',['enum_name',['../namespacemgutility.html#a56127482f9ec47f2b6600cfdab84af03',1,'mgutility::enum_name()'],['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html',1,'enum_name']]], + ['enum_5frange_10',['enum_range',['../structmgutility_1_1enum__range.html',1,'mgutility']]], + ['enum_5frange_3c_20color_20_3e_11',['enum_range< color >',['../structmgutility_1_1enum__range_3_01color_01_4.html',1,'mgutility']]], + ['enum_5frange_3c_20position_20_3e_12',['enum_range< Position >',['../structmgutility_1_1enum__range_3_01Position_01_4.html',1,'mgutility']]], + ['enum_5fsequence_13',['enum_sequence',['../structmgutility_1_1detail_1_1enum__sequence.html',1,'mgutility::detail']]], + ['enum_5fsequence_5fhelper_14',['enum_sequence_helper',['../structmgutility_1_1detail_1_1enum__sequence__helper.html',1,'mgutility::detail']]], + ['enum_5fsequence_5fhelper_3c_20enum_2c_20min_2c_20min_2c_20next_2e_2e_2e_20_3e_15',['enum_sequence_helper< Enum, Min, Min, Next... >',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html',1,'mgutility::detail']]], + ['enum_5fto_5funderlying_16',['enum_to_underlying',['../namespacemgutility.html#a0434e4efb8b555e4f2ab34b000c8dd47',1,'mgutility']]], + ['enum_5ftype_17',['enum_type',['../structmgutility_1_1detail_1_1enum__type.html',1,'mgutility::detail']]], + ['errnoguard_18',['ErrnoGuard',['../classdoctest_1_1detail_1_1ErrnoGuard.html',1,'doctest::detail']]], + ['errors_20in_20stl_20headers_20when_20including_20the_20doctest_20header_19',['Why do I get compiler errors in STL headers when including the doctest header?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md136',1,'']]], + ['example_20',['Example',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html#autotoc_md178',1,'A simple example'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md116',1,'Example']]], + ['example_20usage_20a_20href_20https_3a_20godbolt_20org_20z_205ye185mwa_20try_20it_20a_21',['Example usage (<a href="https://godbolt.org/z/5Ye185MWa" >try it!</a>)',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html#autotoc_md194',1,'']]], + ['exceptions_22',['Exceptions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md135',1,'Does the framework use exceptions?'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md51',1,'Exceptions'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html#autotoc_md167',1,'Translating exceptions']]], + ['exceptiontranslator_23',['ExceptionTranslator',['../classdoctest_1_1detail_1_1ExceptionTranslator.html',1,'doctest::detail']]], + ['executable_20dll_24',['Can different versions of the framework be used within the same binary (executable/dll)?',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html#autotoc_md137',1,'']]], + ['expression_20decomposing_20asserts_25',['Expression decomposing asserts',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html#autotoc_md49',1,'']]], + ['expression_5flhs_26',['Expression_lhs',['../structdoctest_1_1detail_1_1Expression__lhs.html',1,'doctest::detail']]], + ['expressiondecomposer_27',['ExpressionDecomposer',['../structdoctest_1_1detail_1_1ExpressionDecomposer.html',1,'doctest::detail']]], + ['extensions_28',['Extensions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html',1,'']]], + ['extensions_20doctest_5fmpi_20h_20distributed_20tests_20with_20mpi_20a_29',['<a href="../../doctest/extensions/doctest_mpi.h" >Distributed tests with MPI</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md115',1,'']]], + ['extensions_20doctest_5futil_20h_20utils_20a_30',['<a href="../../doctest/extensions/doctest_util.h" >Utils</a>',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html#autotoc_md114',1,'']]], + ['extremely_20portable_3a_31',['Extremely portable:',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html#autotoc_md143',1,'']]] ]; diff --git a/git-main/search/classes_0.js b/git-main/search/classes_0.js index 9f7c12e..fb972e2 100644 --- a/git-main/search/classes_0.js +++ b/git-main/search/classes_0.js @@ -1,5 +1,6 @@ var searchData= [ - ['bad_5foptional_5faccess_0',['bad_optional_access',['../structmgutility_1_1bad__optional__access.html',1,'mgutility']]], - ['basic_5fstring_5fview_1',['basic_string_view',['../classmgutility_1_1basic__string__view.html',1,'mgutility']]] + ['a_0',['A',['../structN_1_1A.html',1,'N']]], + ['approx_1',['Approx',['../structdoctest_1_1Approx.html',1,'doctest']]], + ['assertdata_2',['AssertData',['../structdoctest_1_1AssertData.html',1,'doctest']]] ]; diff --git a/git-main/search/classes_1.js b/git-main/search/classes_1.js index 2051ba1..ebb9f9b 100644 --- a/git-main/search/classes_1.js +++ b/git-main/search/classes_1.js @@ -1,5 +1,8 @@ var searchData= [ - ['custom_5fenum_0',['custom_enum',['../structmgutility_1_1custom__enum.html',1,'mgutility']]], - ['custom_5fenum_3c_20position_20_3e_1',['custom_enum< Position >',['../structmgutility_1_1custom__enum_3_01Position_01_4.html',1,'mgutility']]] + ['b_0',['B',['../structN_1_1B.html',1,'N']]], + ['bad_5foptional_5faccess_1',['bad_optional_access',['../structmgutility_1_1bad__optional__access.html',1,'mgutility']]], + ['basic_5fistream_2',['basic_istream',['../classstd_1_1basic__istream.html',1,'std']]], + ['basic_5fostream_3',['basic_ostream',['../classstd_1_1basic__ostream.html',1,'std']]], + ['basic_5fstring_5fview_4',['basic_string_view',['../classmgutility_1_1basic__string__view.html',1,'mgutility']]] ]; diff --git a/git-main/search/classes_10.js b/git-main/search/classes_10.js new file mode 100644 index 0000000..6f5e91b --- /dev/null +++ b/git-main/search/classes_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['testcase_0',['TestCase',['../structdoctest_1_1detail_1_1TestCase.html',1,'doctest::detail']]], + ['testcasedata_1',['TestCaseData',['../structdoctest_1_1TestCaseData.html',1,'doctest']]], + ['testcaseexception_2',['TestCaseException',['../structdoctest_1_1TestCaseException.html',1,'doctest']]], + ['testfailureexception_3',['TestFailureException',['../structdoctest_1_1detail_1_1TestFailureException.html',1,'doctest::detail']]], + ['testrunstats_4',['TestRunStats',['../structdoctest_1_1TestRunStats.html',1,'doctest']]], + ['testsuite_5',['TestSuite',['../structdoctest_1_1detail_1_1TestSuite.html',1,'doctest::detail']]], + ['timer_6',['Timer',['../structdoctest_1_1detail_1_1Timer.html',1,'doctest::detail']]], + ['translator_7',['Translator',['../structTranslator.html',1,'']]], + ['true_5ftype_8',['true_type',['../structdoctest_1_1detail_1_1types_1_1true__type.html',1,'doctest::detail::types']]], + ['tuple_9',['tuple',['../classstd_1_1tuple.html',1,'std']]], + ['typepair_10',['TypePair',['../structTypePair.html',1,'']]] +]; diff --git a/git-main/search/classes_11.js b/git-main/search/classes_11.js new file mode 100644 index 0000000..f7b1c21 --- /dev/null +++ b/git-main/search/classes_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['underlying_5ftype_0',['underlying_type',['../structdoctest_1_1detail_1_1types_1_1underlying__type.html',1,'doctest::detail::types']]] +]; diff --git a/git-main/search/classes_2.js b/git-main/search/classes_2.js index 4aac420..dcb6f3e 100644 --- a/git-main/search/classes_2.js +++ b/git-main/search/classes_2.js @@ -1,11 +1,14 @@ var searchData= [ - ['enum_5ffor_5feach_0',['enum_for_each',['../classmgutility_1_1enum__for__each.html',1,'mgutility']]], - ['enum_5frange_1',['enum_range',['../structmgutility_1_1enum__range.html',1,'mgutility']]], - ['enum_5frange_3c_20color_20_3e_2',['enum_range< color >',['../structmgutility_1_1enum__range_3_01color_01_4.html',1,'mgutility']]], - ['enum_5frange_3c_20position_20_3e_3',['enum_range< Position >',['../structmgutility_1_1enum__range_3_01Position_01_4.html',1,'mgutility']]], - ['enum_5fsequence_4',['enum_sequence',['../structmgutility_1_1detail_1_1enum__sequence.html',1,'mgutility::detail']]], - ['enum_5fsequence_5fhelper_5',['enum_sequence_helper',['../structmgutility_1_1detail_1_1enum__sequence__helper.html',1,'mgutility::detail']]], - ['enum_5fsequence_5fhelper_3c_20enum_2c_20min_2c_20min_2c_20next_2e_2e_2e_20_3e_6',['enum_sequence_helper< Enum, Min, Min, Next... >',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html',1,'mgutility::detail']]], - ['enum_5ftype_7',['enum_type',['../structmgutility_1_1detail_1_1enum__type.html',1,'mgutility::detail']]] + ['c_0',['C',['../structN_1_1C.html',1,'N']]], + ['char_5ftraits_1',['char_traits',['../structstd_1_1char__traits.html',1,'std']]], + ['contains_2',['Contains',['../classdoctest_1_1Contains.html',1,'doctest']]], + ['context_3',['Context',['../classdoctest_1_1Context.html',1,'doctest']]], + ['contextoptions_4',['ContextOptions',['../structdoctest_1_1ContextOptions.html',1,'doctest']]], + ['contextscope_5',['ContextScope',['../classdoctest_1_1detail_1_1ContextScope.html',1,'doctest::detail']]], + ['contextscopebase_6',['ContextScopeBase',['../structdoctest_1_1detail_1_1ContextScopeBase.html',1,'doctest::detail']]], + ['contextstate_7',['ContextState',['../structdoctest_1_1detail_1_1ContextState.html',1,'doctest::detail']]], + ['currenttestcasestats_8',['CurrentTestCaseStats',['../structdoctest_1_1CurrentTestCaseStats.html',1,'doctest']]], + ['custom_5fenum_9',['custom_enum',['../structmgutility_1_1custom__enum.html',1,'mgutility']]], + ['custom_5fenum_3c_20position_20_3e_10',['custom_enum< Position >',['../structmgutility_1_1custom__enum_3_01Position_01_4.html',1,'mgutility']]] ]; diff --git a/git-main/search/classes_3.js b/git-main/search/classes_3.js index 12a06bf..352060d 100644 --- a/git-main/search/classes_3.js +++ b/git-main/search/classes_3.js @@ -1,5 +1,4 @@ var searchData= [ - ['has_5fbit_5for_0',['has_bit_or',['../structmgutility_1_1detail_1_1has__bit__or.html',1,'mgutility::detail']]], - ['has_5fbit_5for_3c_20t_2c_20decltype_28_28t_7b_7d_7ct_7b_7d_29_2c_20void_28_29_29_3e_1',['has_bit_or< T, decltype((T{}|T{}), void())>',['../structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html',1,'mgutility::detail']]] + ['deferred_5ffalse_0',['deferred_false',['../structdoctest_1_1detail_1_1deferred__false.html',1,'doctest::detail']]] ]; diff --git a/git-main/search/classes_4.js b/git-main/search/classes_4.js index d292d63..7f7e2a3 100644 --- a/git-main/search/classes_4.js +++ b/git-main/search/classes_4.js @@ -1,4 +1,17 @@ var searchData= [ - ['is_5fscoped_5fenum_0',['is_scoped_enum',['../structmgutility_1_1detail_1_1is__scoped__enum.html',1,'mgutility::detail']]] + ['enable_5fif_0',['enable_if',['../structdoctest_1_1detail_1_1types_1_1enable__if.html',1,'doctest::detail::types']]], + ['enable_5fif_3c_20true_2c_20t_20_3e_1',['enable_if< true, T >',['../structdoctest_1_1detail_1_1types_1_1enable__if_3_01true_00_01T_01_4.html',1,'doctest::detail::types']]], + ['enum_5ffor_5feach_2',['enum_for_each',['../classmgutility_1_1enum__for__each.html',1,'mgutility']]], + ['enum_5frange_3',['enum_range',['../structmgutility_1_1enum__range.html',1,'mgutility']]], + ['enum_5frange_3c_20color_20_3e_4',['enum_range< color >',['../structmgutility_1_1enum__range_3_01color_01_4.html',1,'mgutility']]], + ['enum_5frange_3c_20position_20_3e_5',['enum_range< Position >',['../structmgutility_1_1enum__range_3_01Position_01_4.html',1,'mgutility']]], + ['enum_5fsequence_6',['enum_sequence',['../structmgutility_1_1detail_1_1enum__sequence.html',1,'mgutility::detail']]], + ['enum_5fsequence_5fhelper_7',['enum_sequence_helper',['../structmgutility_1_1detail_1_1enum__sequence__helper.html',1,'mgutility::detail']]], + ['enum_5fsequence_5fhelper_3c_20enum_2c_20min_2c_20min_2c_20next_2e_2e_2e_20_3e_8',['enum_sequence_helper< Enum, Min, Min, Next... >',['../structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html',1,'mgutility::detail']]], + ['enum_5ftype_9',['enum_type',['../structmgutility_1_1detail_1_1enum__type.html',1,'mgutility::detail']]], + ['errnoguard_10',['ErrnoGuard',['../classdoctest_1_1detail_1_1ErrnoGuard.html',1,'doctest::detail']]], + ['exceptiontranslator_11',['ExceptionTranslator',['../classdoctest_1_1detail_1_1ExceptionTranslator.html',1,'doctest::detail']]], + ['expression_5flhs_12',['Expression_lhs',['../structdoctest_1_1detail_1_1Expression__lhs.html',1,'doctest::detail']]], + ['expressiondecomposer_13',['ExpressionDecomposer',['../structdoctest_1_1detail_1_1ExpressionDecomposer.html',1,'doctest::detail']]] ]; diff --git a/git-main/search/classes_5.js b/git-main/search/classes_5.js index 674dfc3..9d1f4c7 100644 --- a/git-main/search/classes_5.js +++ b/git-main/search/classes_5.js @@ -1,4 +1,10 @@ var searchData= [ - ['nullopt_5ft_0',['nullopt_t',['../structmgutility_1_1nullopt__t.html',1,'mgutility']]] + ['false_5ftype_0',['false_type',['../structdoctest_1_1detail_1_1types_1_1false__type.html',1,'doctest::detail::types']]], + ['filldata_1',['filldata',['../structdoctest_1_1detail_1_1filldata.html',1,'doctest::detail']]], + ['filldata_3c_20const_20char_5bn_5d_3e_2',['filldata< const char[N]>',['../structdoctest_1_1detail_1_1filldata_3_01const_01char_0fN_0e_4.html',1,'doctest::detail']]], + ['filldata_3c_20const_20void_20_2a_20_3e_3',['filldata< const void * >',['../structdoctest_1_1detail_1_1filldata_3_01const_01void_01_5_01_4.html',1,'doctest::detail']]], + ['filldata_3c_20t_20_2a_20_3e_4',['filldata< T * >',['../structdoctest_1_1detail_1_1filldata_3_01T_01_5_01_4.html',1,'doctest::detail']]], + ['filldata_3c_20t_5bn_5d_3e_5',['filldata< T[N]>',['../structdoctest_1_1detail_1_1filldata_3_01T_0fN_0e_4.html',1,'doctest::detail']]], + ['foo_6',['Foo',['../structApp_1_1Foo.html',1,'App::Foo'],['../structBar_1_1Foo.html',1,'Bar::Foo']]] ]; diff --git a/git-main/search/classes_6.js b/git-main/search/classes_6.js index 19bde48..22485e5 100644 --- a/git-main/search/classes_6.js +++ b/git-main/search/classes_6.js @@ -1,4 +1,7 @@ var searchData= [ - ['optional_0',['optional',['../classmgutility_1_1optional.html',1,'mgutility']]] + ['has_5fbit_5for_0',['has_bit_or',['../structmgutility_1_1detail_1_1has__bit__or.html',1,'mgutility::detail']]], + ['has_5fbit_5for_3c_20t_2c_20decltype_28_28t_7b_7d_7ct_7b_7d_29_2c_20void_28_29_29_3e_1',['has_bit_or< T, decltype((T{}|T{}), void())>',['../structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html',1,'mgutility::detail']]], + ['has_5finsertion_5foperator_2',['has_insertion_operator',['../structdoctest_1_1detail_1_1has__insertion__operator.html',1,'doctest::detail']]], + ['has_5finsertion_5foperator_3c_20t_2c_20decltype_28operator_3c_3c_28declval_3c_20std_3a_3aostream_20_26_20_3e_28_29_2c_20declval_3c_20const_20t_20_26_20_3e_28_29_29_2c_20void_28_29_29_3e_3',['has_insertion_operator< T, decltype(operator<<(declval< std::ostream & >(), declval< const T & >()), void())>',['../structdoctest_1_1detail_1_1has__insertion__operator_3_01T_00_01decltype_07operator_3_3_07declvald5a5a279653bbfeef238ad5c984744e2.html',1,'doctest::detail']]] ]; diff --git a/git-main/search/classes_7.js b/git-main/search/classes_7.js index 38a84e1..b74dfc4 100644 --- a/git-main/search/classes_7.js +++ b/git-main/search/classes_7.js @@ -1,6 +1,18 @@ var searchData= [ - ['pair_0',['pair',['../structmgutility_1_1pair.html',1,'mgutility']]], - ['pair_3c_20position_20_3e_1',['pair< Position >',['../structmgutility_1_1pair.html',1,'mgutility']]], - ['pair_3c_20t_20_3e_2',['pair< T >',['../structmgutility_1_1pair.html',1,'mgutility']]] + ['icontextscope_0',['IContextScope',['../structdoctest_1_1IContextScope.html',1,'doctest']]], + ['iexceptiontranslator_1',['IExceptionTranslator',['../structdoctest_1_1detail_1_1IExceptionTranslator.html',1,'doctest::detail']]], + ['int_5fholder_2',['int_holder',['../structint__holder.html',1,'']]], + ['int_5fpointer_3',['int_pointer',['../structint__pointer.html',1,'']]], + ['ireporter_4',['IReporter',['../structdoctest_1_1IReporter.html',1,'doctest']]], + ['is_5farray_5',['is_array',['../structdoctest_1_1detail_1_1types_1_1is__array.html',1,'doctest::detail::types']]], + ['is_5farray_3c_20t_5bsize_5d_3e_6',['is_array< T[SIZE]>',['../structdoctest_1_1detail_1_1types_1_1is__array_3_01T_0fSIZE_0e_4.html',1,'doctest::detail::types']]], + ['is_5fenum_7',['is_enum',['../structdoctest_1_1detail_1_1types_1_1is__enum.html',1,'doctest::detail::types']]], + ['is_5fpointer_8',['is_pointer',['../structdoctest_1_1detail_1_1types_1_1is__pointer.html',1,'doctest::detail::types']]], + ['is_5fpointer_3c_20t_20_2a_20_3e_9',['is_pointer< T * >',['../structdoctest_1_1detail_1_1types_1_1is__pointer_3_01T_01_5_01_4.html',1,'doctest::detail::types']]], + ['is_5frvalue_5freference_10',['is_rvalue_reference',['../structdoctest_1_1detail_1_1types_1_1is__rvalue__reference.html',1,'doctest::detail::types']]], + ['is_5frvalue_5freference_3c_20t_20_26_26_20_3e_11',['is_rvalue_reference< T && >',['../structdoctest_1_1detail_1_1types_1_1is__rvalue__reference_3_01T_01_6_6_01_4.html',1,'doctest::detail::types']]], + ['is_5fscoped_5fenum_12',['is_scoped_enum',['../structmgutility_1_1detail_1_1is__scoped__enum.html',1,'mgutility::detail']]], + ['isnan_13',['IsNaN',['../structdoctest_1_1IsNaN.html',1,'doctest']]], + ['itranslator_14',['ITranslator',['../structITranslator.html',1,'']]] ]; diff --git a/git-main/search/classes_8.js b/git-main/search/classes_8.js new file mode 100644 index 0000000..217a326 --- /dev/null +++ b/git-main/search/classes_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['label_0',['label',['../structuser1_1_1label.html',1,'user1::label'],['../structuser2_1_1label.html',1,'user2::label'],['../structuser3_1_1label.html',1,'user3::label'],['../structuser4_1_1label.html',1,'user4::label'],['../structuser5_1_1label.html',1,'user5::label'],['../structuser6_1_1label.html',1,'user6::label'],['../structuser7_1_1label.html',1,'user7::label'],['../structuser8_1_1label.html',1,'user8::label'],['../structuser9a_1_1label.html',1,'user9a::label'],['../structuser9b_1_1label.html',1,'user9b::label']]] +]; diff --git a/git-main/search/classes_9.js b/git-main/search/classes_9.js new file mode 100644 index 0000000..58693f0 --- /dev/null +++ b/git-main/search/classes_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['messagebuilder_0',['MessageBuilder',['../structdoctest_1_1detail_1_1MessageBuilder.html',1,'doctest::detail']]], + ['messagedata_1',['MessageData',['../structdoctest_1_1MessageData.html',1,'doctest']]], + ['moveonly_2',['MoveOnly',['../classMoveOnly.html',1,'']]], + ['mpi_5fsub_5fcomm_3',['mpi_sub_comm',['../structdoctest_1_1mpi__sub__comm.html',1,'doctest']]], + ['multilaneatomic_4',['MultiLaneAtomic',['../classdoctest_1_1detail_1_1MultiLaneAtomic.html',1,'doctest::detail']]], + ['multilaneatomic_3c_20int_20_3e_5',['MultiLaneAtomic< int >',['../classdoctest_1_1detail_1_1MultiLaneAtomic.html',1,'doctest::detail']]], + ['myothertype_6',['MyOtherType',['../structBar_1_1MyOtherType.html',1,'Bar']]], + ['mytype_7',['MyType',['../structMyType.html',1,'']]], + ['mytype_3c_20t_2c_20unsigned_20_3e_8',['MyType< T, unsigned >',['../structMyType.html',1,'']]], + ['mytypeinherited_9',['MyTypeInherited',['../structMyTypeInherited.html',1,'']]], + ['myxmlreporter_10',['MyXmlReporter',['../structMyXmlReporter.html',1,'']]] +]; diff --git a/git-main/search/classes_a.js b/git-main/search/classes_a.js new file mode 100644 index 0000000..674dfc3 --- /dev/null +++ b/git-main/search/classes_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nullopt_5ft_0',['nullopt_t',['../structmgutility_1_1nullopt__t.html',1,'mgutility']]] +]; diff --git a/git-main/search/classes_b.js b/git-main/search/classes_b.js new file mode 100644 index 0000000..19bde48 --- /dev/null +++ b/git-main/search/classes_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['optional_0',['optional',['../classmgutility_1_1optional.html',1,'mgutility']]] +]; diff --git a/git-main/search/classes_c.js b/git-main/search/classes_c.js new file mode 100644 index 0000000..38a84e1 --- /dev/null +++ b/git-main/search/classes_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['pair_0',['pair',['../structmgutility_1_1pair.html',1,'mgutility']]], + ['pair_3c_20position_20_3e_1',['pair< Position >',['../structmgutility_1_1pair.html',1,'mgutility']]], + ['pair_3c_20t_20_3e_2',['pair< T >',['../structmgutility_1_1pair.html',1,'mgutility']]] +]; diff --git a/git-main/search/classes_d.js b/git-main/search/classes_d.js new file mode 100644 index 0000000..edf1572 --- /dev/null +++ b/git-main/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['querydata_0',['QueryData',['../structdoctest_1_1QueryData.html',1,'doctest']]] +]; diff --git a/git-main/search/classes_e.js b/git-main/search/classes_e.js new file mode 100644 index 0000000..1c856f9 --- /dev/null +++ b/git-main/search/classes_e.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['relationalcomparator_0',['RelationalComparator',['../structdoctest_1_1detail_1_1RelationalComparator.html',1,'doctest::detail']]], + ['remove_5fconst_1',['remove_const',['../structdoctest_1_1detail_1_1types_1_1remove__const.html',1,'doctest::detail::types']]], + ['remove_5fconst_3c_20const_20t_20_3e_2',['remove_const< const T >',['../structdoctest_1_1detail_1_1types_1_1remove__const_3_01const_01T_01_4.html',1,'doctest::detail::types']]], + ['remove_5freference_3',['remove_reference',['../structdoctest_1_1detail_1_1types_1_1remove__reference.html',1,'doctest::detail::types']]], + ['remove_5freference_3c_20t_20_26_20_3e_4',['remove_reference< T & >',['../structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_01_4.html',1,'doctest::detail::types']]], + ['remove_5freference_3c_20t_20_26_26_20_3e_5',['remove_reference< T && >',['../structdoctest_1_1detail_1_1types_1_1remove__reference_3_01T_01_6_6_01_4.html',1,'doctest::detail::types']]], + ['result_6',['Result',['../structdoctest_1_1detail_1_1Result.html',1,'doctest::detail']]], + ['resultbuilder_7',['ResultBuilder',['../structdoctest_1_1detail_1_1ResultBuilder.html',1,'doctest::detail']]] +]; diff --git a/git-main/search/classes_f.js b/git-main/search/classes_f.js new file mode 100644 index 0000000..14f68c9 --- /dev/null +++ b/git-main/search/classes_f.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['should_5fstringify_5fas_5funderlying_5ftype_0',['should_stringify_as_underlying_type',['../structdoctest_1_1detail_1_1should__stringify__as__underlying__type.html',1,'doctest::detail']]], + ['somefixture_1',['SomeFixture',['../structSomeFixture.html',1,'']]], + ['string_2',['String',['../classdoctest_1_1String.html',1,'doctest']]], + ['stringcontains_3',['StringContains',['../classdoctest_1_1AssertData_1_1StringContains.html',1,'doctest::AssertData']]], + ['stringmaker_4',['StringMaker',['../structdoctest_1_1StringMaker.html',1,'doctest']]], + ['stringmaker_3c_20std_3a_3alist_3c_20t_20_3e_20_3e_5',['StringMaker< std::list< T > >',['../structdoctest_1_1StringMaker_3_01std_1_1list_3_01T_01_4_01_4.html',1,'doctest']]], + ['stringmakerbase_6',['StringMakerBase',['../structdoctest_1_1detail_1_1StringMakerBase.html',1,'doctest::detail']]], + ['stringmakerbase_3c_20detail_3a_3ahas_5finsertion_5foperator_3c_20t_20_3e_3a_3avalue_7c_7cdetail_3a_3atypes_3a_3ais_5fpointer_3c_20t_20_3e_3a_3avalue_7c_7cdetail_3a_3atypes_3a_3ais_5farray_3c_20t_20_3e_3a_3avalue_20_3e_7',['StringMakerBase< detail::has_insertion_operator< T >::value||detail::types::is_pointer< T >::value||detail::types::is_array< T >::value >',['../structdoctest_1_1detail_1_1StringMakerBase.html',1,'doctest::detail']]], + ['stringmakerbase_3c_20true_20_3e_8',['StringMakerBase< true >',['../structdoctest_1_1detail_1_1StringMakerBase_3_01true_01_4.html',1,'doctest::detail']]], + ['subcase_9',['Subcase',['../structdoctest_1_1detail_1_1Subcase.html',1,'doctest::detail::Subcase'],['../structSubcase.html',1,'Subcase']]], + ['subcasesignature_10',['SubcaseSignature',['../structdoctest_1_1SubcaseSignature.html',1,'doctest']]] +]; diff --git a/git-main/search/functions_5.js b/git-main/search/functions_5.js index 293876b..3a45ca9 100644 --- a/git-main/search/functions_5.js +++ b/git-main/search/functions_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['name_0',['name',['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view'],['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view']]] + ['log_0',['log',['../structdoctest_1_1detail_1_1ResultBuilder.html#a2af75dd1d8db8d3aa949d78025854085',1,'doctest::detail::ResultBuilder']]] ]; diff --git a/git-main/search/functions_6.js b/git-main/search/functions_6.js index ed0d5c4..293876b 100644 --- a/git-main/search/functions_6.js +++ b/git-main/search/functions_6.js @@ -1,10 +1,4 @@ var searchData= [ - ['operator_20bool_0',['operator bool',['../classmgutility_1_1optional.html#ab0f2e6f47e7c8eb9b1c4bd553df6eb63',1,'mgutility::optional']]], - ['operator_20optional_3c_20t_20_3e_1',['operator optional< T >',['../structmgutility_1_1nullopt__t.html#a0239dc56aa60ab9eb05646f66814c8b5',1,'mgutility::nullopt_t']]], - ['operator_20std_3a_3astring_2',['operator std::string',['../classmgutility_1_1basic__string__view.html#a88ab597eb09f775835b2b1012e4738cd',1,'mgutility::basic_string_view::string()'],['../classmgutility_1_1basic__string__view.html#a25b10409abab3fcb1152c301c5e2cc68',1,'mgutility::basic_string_view::string() const']]], - ['operator_2a_3',['operator*',['../classmgutility_1_1optional.html#a86530a0954753d4f81a55364d631bc2a',1,'mgutility::optional::operator*()'],['../classmgutility_1_1optional.html#a5abeb6aa1847ff267211454a9f3f7f50',1,'mgutility::optional::operator*() const']]], - ['operator_3d_4',['operator=',['../classmgutility_1_1optional.html#a37d1cdc3ee17e9b0ad6f51f196377c6f',1,'mgutility::optional::operator=(const optional &other)'],['../classmgutility_1_1optional.html#a12c470b6074a02e2e05b8f3d99723bdc',1,'mgutility::optional::operator=(optional &&other)'],['../classmgutility_1_1basic__string__view.html#a5dd4b45964ba415e1bc756dbd16e086d',1,'mgutility::basic_string_view::operator=(const basic_string_view &other) noexcept'],['../classmgutility_1_1basic__string__view.html#aebc213a351e10cdb8fea03c5a06d6704',1,'mgutility::basic_string_view::operator=(basic_string_view &&other) noexcept']]], - ['operator_5b_5d_5',['operator[]',['../classmgutility_1_1basic__string__view.html#a78d80b32f442c1c0994af67cb1a42e1d',1,'mgutility::basic_string_view']]], - ['optional_6',['optional',['../classmgutility_1_1optional.html#aaf01ec86b3bd0649e824cb262bf238ba',1,'mgutility::optional::optional(nullopt_t &)'],['../classmgutility_1_1optional.html#a6dfc2e2dd5035fe8f4e2ea2d499ff0c6',1,'mgutility::optional::optional()'],['../classmgutility_1_1optional.html#a1f9831c9b189a71acafcdb2b4ebba70f',1,'mgutility::optional::optional(Args &&...args)'],['../classmgutility_1_1optional.html#a42acc3e5b153bece49622510a3b66ade',1,'mgutility::optional::optional(T &&value)'],['../classmgutility_1_1optional.html#a8e42e264b59aeb9c14817895ed617c42',1,'mgutility::optional::optional(const optional &other)'],['../classmgutility_1_1optional.html#a836543069b1c3244050f6a39c0118c44',1,'mgutility::optional::optional(optional &&other)']]] + ['name_0',['name',['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view'],['../structmgutility_1_1detail_1_1enum__type.html#abee017c1717fd3bf5c31b2c6fecd82fd',1,'mgutility::detail::enum_type::name() noexcept -> mgutility::string_view']]] ]; diff --git a/git-main/search/functions_7.js b/git-main/search/functions_7.js index 84e3316..779042d 100644 --- a/git-main/search/functions_7.js +++ b/git-main/search/functions_7.js @@ -1,5 +1,11 @@ var searchData= [ - ['reset_0',['reset',['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()'],['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()']]], - ['rfind_1',['rfind',['../classmgutility_1_1basic__string__view.html#aa2ee34f07ee7ec37344898d4f5ea57f9',1,'mgutility::basic_string_view']]] + ['operator_20bool_0',['operator bool',['../classmgutility_1_1optional.html#ab0f2e6f47e7c8eb9b1c4bd553df6eb63',1,'mgutility::optional']]], + ['operator_20optional_3c_20t_20_3e_1',['operator optional< T >',['../structmgutility_1_1nullopt__t.html#a0239dc56aa60ab9eb05646f66814c8b5',1,'mgutility::nullopt_t']]], + ['operator_20result_2',['operator Result',['../structdoctest_1_1detail_1_1Expression__lhs.html#aa0ab4a18aac56bfb02fba8970ed304b3',1,'doctest::detail::Expression_lhs::operator Result()'],['../structdoctest_1_1detail_1_1Expression__lhs.html#aa0ab4a18aac56bfb02fba8970ed304b3',1,'doctest::detail::Expression_lhs::operator Result()']]], + ['operator_20std_3a_3astring_3',['operator std::string',['../classmgutility_1_1basic__string__view.html#a88ab597eb09f775835b2b1012e4738cd',1,'mgutility::basic_string_view::string()'],['../classmgutility_1_1basic__string__view.html#a25b10409abab3fcb1152c301c5e2cc68',1,'mgutility::basic_string_view::string() const']]], + ['operator_2a_4',['operator*',['../classmgutility_1_1optional.html#a86530a0954753d4f81a55364d631bc2a',1,'mgutility::optional::operator*()'],['../classmgutility_1_1optional.html#a5abeb6aa1847ff267211454a9f3f7f50',1,'mgutility::optional::operator*() const']]], + ['operator_3d_5',['operator=',['../classmgutility_1_1optional.html#a37d1cdc3ee17e9b0ad6f51f196377c6f',1,'mgutility::optional::operator=(const optional &other)'],['../classmgutility_1_1optional.html#a12c470b6074a02e2e05b8f3d99723bdc',1,'mgutility::optional::operator=(optional &&other)'],['../classmgutility_1_1basic__string__view.html#a5dd4b45964ba415e1bc756dbd16e086d',1,'mgutility::basic_string_view::operator=(const basic_string_view &other) noexcept'],['../classmgutility_1_1basic__string__view.html#aebc213a351e10cdb8fea03c5a06d6704',1,'mgutility::basic_string_view::operator=(basic_string_view &&other) noexcept']]], + ['operator_5b_5d_6',['operator[]',['../classmgutility_1_1basic__string__view.html#a78d80b32f442c1c0994af67cb1a42e1d',1,'mgutility::basic_string_view']]], + ['optional_7',['optional',['../classmgutility_1_1optional.html#aaf01ec86b3bd0649e824cb262bf238ba',1,'mgutility::optional::optional(nullopt_t &)'],['../classmgutility_1_1optional.html#a6dfc2e2dd5035fe8f4e2ea2d499ff0c6',1,'mgutility::optional::optional()'],['../classmgutility_1_1optional.html#a1f9831c9b189a71acafcdb2b4ebba70f',1,'mgutility::optional::optional(Args &&...args)'],['../classmgutility_1_1optional.html#a42acc3e5b153bece49622510a3b66ade',1,'mgutility::optional::optional(T &&value)'],['../classmgutility_1_1optional.html#a8e42e264b59aeb9c14817895ed617c42',1,'mgutility::optional::optional(const optional &other)'],['../classmgutility_1_1optional.html#a836543069b1c3244050f6a39c0118c44',1,'mgutility::optional::optional(optional &&other)']]] ]; diff --git a/git-main/search/functions_8.js b/git-main/search/functions_8.js index 8dcf543..02d9043 100644 --- a/git-main/search/functions_8.js +++ b/git-main/search/functions_8.js @@ -1,6 +1,6 @@ var searchData= [ - ['size_0',['size',['../classmgutility_1_1enum__for__each.html#a0d833b4ee26998c4373aee17be12cd90',1,'mgutility::enum_for_each::size()'],['../classmgutility_1_1basic__string__view.html#a26e96c7b63f54ccd9306e3a4ecf5b336',1,'mgutility::basic_string_view::size() const noexcept']]], - ['substr_1',['substr',['../classmgutility_1_1basic__string__view.html#afaa73ee06ad76de37e100e06f98822ee',1,'mgutility::basic_string_view']]], - ['swap_2',['swap',['../classmgutility_1_1optional.html#ac4a977a0b086414df1567343fe6f6f0a',1,'mgutility::optional']]] + ['react_0',['react',['../structdoctest_1_1detail_1_1MessageBuilder.html#a3a65c5e39a0c04ae8e2a7c34997a2e4d',1,'doctest::detail::MessageBuilder']]], + ['reset_1',['reset',['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()'],['../classmgutility_1_1optional.html#aa5d9dc1c598a5735584b903dcf98c9f4',1,'mgutility::optional::reset()']]], + ['rfind_2',['rfind',['../classmgutility_1_1basic__string__view.html#aa2ee34f07ee7ec37344898d4f5ea57f9',1,'mgutility::basic_string_view']]] ]; diff --git a/git-main/search/functions_9.js b/git-main/search/functions_9.js index 33003c9..8dcf543 100644 --- a/git-main/search/functions_9.js +++ b/git-main/search/functions_9.js @@ -1,4 +1,6 @@ var searchData= [ - ['to_5fenum_0',['to_enum',['../namespacemgutility.html#a47470bc6b087ab3ceab7c3873203a2eb',1,'mgutility']]] + ['size_0',['size',['../classmgutility_1_1enum__for__each.html#a0d833b4ee26998c4373aee17be12cd90',1,'mgutility::enum_for_each::size()'],['../classmgutility_1_1basic__string__view.html#a26e96c7b63f54ccd9306e3a4ecf5b336',1,'mgutility::basic_string_view::size() const noexcept']]], + ['substr_1',['substr',['../classmgutility_1_1basic__string__view.html#afaa73ee06ad76de37e100e06f98822ee',1,'mgutility::basic_string_view']]], + ['swap_2',['swap',['../classmgutility_1_1optional.html#ac4a977a0b086414df1567343fe6f6f0a',1,'mgutility::optional']]] ]; diff --git a/git-main/search/functions_a.js b/git-main/search/functions_a.js index cc598b5..33003c9 100644 --- a/git-main/search/functions_a.js +++ b/git-main/search/functions_a.js @@ -1,5 +1,4 @@ var searchData= [ - ['value_0',['value',['../classmgutility_1_1optional.html#ac1028387cac8311f37d30683aa0e6dee',1,'mgutility::optional::value()'],['../classmgutility_1_1optional.html#abc9fc767c073e865acbad79df5237bd1',1,'mgutility::optional::value() const']]], - ['value_5for_1',['value_or',['../classmgutility_1_1optional.html#acb65e681b1e5c84f0c00059a9e61903d',1,'mgutility::optional::value_or(T &&value)'],['../classmgutility_1_1optional.html#a14f3152ede420d3799dc3ec9f8ec1a10',1,'mgutility::optional::value_or(T &&value) const'],['../classmgutility_1_1optional.html#aee67dde557acbd11fe3c0a8455cab862',1,'mgutility::optional::value_or(const T &value)'],['../classmgutility_1_1optional.html#acf92119863dd7ae1cc5ae387151751b9',1,'mgutility::optional::value_or(const T &value) const']]] + ['to_5fenum_0',['to_enum',['../namespacemgutility.html#a47470bc6b087ab3ceab7c3873203a2eb',1,'mgutility']]] ]; diff --git a/git-main/search/functions_b.js b/git-main/search/functions_b.js index c9b8017..73c1f32 100644 --- a/git-main/search/functions_b.js +++ b/git-main/search/functions_b.js @@ -1,4 +1,4 @@ var searchData= [ - ['what_0',['what',['../structmgutility_1_1bad__optional__access.html#af3a7f794c94499a7660cfed0d3fed8dc',1,'mgutility::bad_optional_access']]] + ['unary_5fassert_0',['unary_assert',['../structdoctest_1_1detail_1_1ResultBuilder.html#a63a2a19638f4a761c70abd5563e2d23a',1,'doctest::detail::ResultBuilder::unary_assert(const DOCTEST_REF_WRAP(L) val)'],['../structdoctest_1_1detail_1_1ResultBuilder.html#a63a2a19638f4a761c70abd5563e2d23a',1,'doctest::detail::ResultBuilder::unary_assert(const DOCTEST_REF_WRAP(L) val)']]] ]; diff --git a/git-main/search/functions_c.js b/git-main/search/functions_c.js index d1b8aef..cc598b5 100644 --- a/git-main/search/functions_c.js +++ b/git-main/search/functions_c.js @@ -1,4 +1,5 @@ var searchData= [ - ['_7eoptional_0',['~optional',['../classmgutility_1_1optional.html#a2e1c20d05d40a957ee86318dc1558ff8',1,'mgutility::optional']]] + ['value_0',['value',['../classmgutility_1_1optional.html#ac1028387cac8311f37d30683aa0e6dee',1,'mgutility::optional::value()'],['../classmgutility_1_1optional.html#abc9fc767c073e865acbad79df5237bd1',1,'mgutility::optional::value() const']]], + ['value_5for_1',['value_or',['../classmgutility_1_1optional.html#acb65e681b1e5c84f0c00059a9e61903d',1,'mgutility::optional::value_or(T &&value)'],['../classmgutility_1_1optional.html#a14f3152ede420d3799dc3ec9f8ec1a10',1,'mgutility::optional::value_or(T &&value) const'],['../classmgutility_1_1optional.html#aee67dde557acbd11fe3c0a8455cab862',1,'mgutility::optional::value_or(const T &value)'],['../classmgutility_1_1optional.html#acf92119863dd7ae1cc5ae387151751b9',1,'mgutility::optional::value_or(const T &value) const']]] ]; diff --git a/git-main/search/functions_d.js b/git-main/search/functions_d.js new file mode 100644 index 0000000..c9b8017 --- /dev/null +++ b/git-main/search/functions_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['what_0',['what',['../structmgutility_1_1bad__optional__access.html#af3a7f794c94499a7660cfed0d3fed8dc',1,'mgutility::bad_optional_access']]] +]; diff --git a/git-main/search/functions_e.js b/git-main/search/functions_e.js new file mode 100644 index 0000000..d1b8aef --- /dev/null +++ b/git-main/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7eoptional_0',['~optional',['../classmgutility_1_1optional.html#a2e1c20d05d40a957ee86318dc1558ff8',1,'mgutility::optional']]] +]; diff --git a/git-main/search/pages_0.js b/git-main/search/pages_0.js index e7b967e..ea67eac 100644 --- a/git-main/search/pages_0.js +++ b/git-main/search/pages_0.js @@ -1,4 +1,5 @@ var searchData= [ - ['enum_5fname_0',['enum_name',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html',1,'']]] + ['and_20design_20goals_0',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]], + ['assertion_20macros_1',['Assertion macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html',1,'']]] ]; diff --git a/git-main/search/pages_1.js b/git-main/search/pages_1.js index 96328fe..5f2e685 100644 --- a/git-main/search/pages_1.js +++ b/git-main/search/pages_1.js @@ -1,4 +1,5 @@ var searchData= [ - ['main_20page_0',['Main page',['../index.html',1,'']]] + ['benchmarks_0',['Benchmarks',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2benchmarks.html',1,'']]], + ['build_20systems_1',['Build systems',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html',1,'']]] ]; diff --git a/git-main/search/pages_2.js b/git-main/search/pages_2.js index 35ac3bf..d5954ac 100644 --- a/git-main/search/pages_2.js +++ b/git-main/search/pages_2.js @@ -1,4 +1,9 @@ var searchData= [ - ['page_0',['Main page',['../index.html',1,'']]] + ['cases_0',['cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'Parameterized test cases'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html',1,'Test cases']]], + ['change_20log_1',['Change Log',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html',1,'']]], + ['command_20line_2',['Command line',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2commandline.html',1,'']]], + ['configuration_3',['Configuration',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2configuration.html',1,'']]], + ['contributing_4',['Contributing',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CONTRIBUTING.html',1,'']]], + ['conversions_5',['String conversions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html',1,'']]] ]; diff --git a/git-main/search/pages_3.js b/git-main/search/pages_3.js new file mode 100644 index 0000000..4ec5ea4 --- /dev/null +++ b/git-main/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['design_20goals_0',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]] +]; diff --git a/git-main/search/pages_4.js b/git-main/search/pages_4.js new file mode 100644 index 0000000..113540f --- /dev/null +++ b/git-main/search/pages_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['entry_20point_0',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['enum_5fname_1',['enum_name',['../md__2home_2runner_2work_2enum__name_2enum__name_2README.html',1,'']]], + ['extensions_2',['Extensions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2extensions.html',1,'']]] +]; diff --git a/git-main/search/pages_5.js b/git-main/search/pages_5.js new file mode 100644 index 0000000..712d3ec --- /dev/null +++ b/git-main/search/pages_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['faq_0',['FAQ',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2faq.html',1,'']]], + ['features_20and_20design_20goals_1',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]] +]; diff --git a/git-main/search/pages_6.js b/git-main/search/pages_6.js new file mode 100644 index 0000000..bf53b4c --- /dev/null +++ b/git-main/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['goals_0',['Features and design goals',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2features.html',1,'']]] +]; diff --git a/git-main/search/pages_7.js b/git-main/search/pages_7.js new file mode 100644 index 0000000..1e0e59a --- /dev/null +++ b/git-main/search/pages_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['line_0',['Command line',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2commandline.html',1,'']]], + ['log_1',['Change Log',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2CHANGELOG.html',1,'']]], + ['logging_20macros_2',['Logging macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html',1,'']]] +]; diff --git a/git-main/search/pages_8.js b/git-main/search/pages_8.js new file mode 100644 index 0000000..c3f55c5 --- /dev/null +++ b/git-main/search/pages_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['macros_0',['macros',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2assertions.html',1,'Assertion macros'],['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2logging.html',1,'Logging macros']]], + ['main_20page_1',['Main page',['../index.html',1,'']]], + ['main_20tt_20entry_20point_2',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]] +]; diff --git a/git-main/search/pages_9.js b/git-main/search/pages_9.js new file mode 100644 index 0000000..c0287b0 --- /dev/null +++ b/git-main/search/pages_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['page_0',['Main page',['../index.html',1,'']]], + ['parameterized_20test_20cases_1',['Parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'']]], + ['point_2',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]] +]; diff --git a/git-main/search/pages_a.js b/git-main/search/pages_a.js new file mode 100644 index 0000000..0560662 --- /dev/null +++ b/git-main/search/pages_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['random_5fdev_5fnotes_0',['random_dev_notes',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2random__dev__notes.html',1,'']]], + ['readme_1',['README',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2README.html',1,'']]], + ['reference_2',['Reference',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2readme.html',1,'']]], + ['release_5fprocess_3',['release_process',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2scripts_2release__process.html',1,'']]], + ['reporters_4',['Reporters',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2reporters.html',1,'']]] +]; diff --git a/git-main/search/pages_b.js b/git-main/search/pages_b.js new file mode 100644 index 0000000..9998f83 --- /dev/null +++ b/git-main/search/pages_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['string_20conversions_0',['String conversions',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2stringification.html',1,'']]], + ['systems_1',['Build systems',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2build-systems.html',1,'']]] +]; diff --git a/git-main/search/pages_c.js b/git-main/search/pages_c.js new file mode 100644 index 0000000..f9f536d --- /dev/null +++ b/git-main/search/pages_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['test_20cases_0',['Parameterized test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2parameterized-tests.html',1,'']]], + ['test_20cases_1',['Test cases',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2testcases.html',1,'']]], + ['the_20tt_20main_20tt_20entry_20point_2',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['tt_20main_20tt_20entry_20point_3',['The <tt>main()</tt> entry point',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2main.html',1,'']]], + ['tutorial_4',['Tutorial',['../md__2home_2runner_2work_2enum__name_2enum__name_2build_2__deps_2doctest-src_2doc_2markdown_2tutorial.html',1,'']]] +]; diff --git a/git-main/search/searchdata.js b/git-main/search/searchdata.js index 0b14879..5e5f573 100644 --- a/git-main/search/searchdata.js +++ b/git-main/search/searchdata.js @@ -1,15 +1,15 @@ var indexSectionsWithContent = { - 0: "5abcdefghilmnoprstuvwz~", - 1: "bcehinop", + 0: "0123456789:abcdefghilmnopqrstuvwz~", + 1: "abcdefhilmnopqrstu", 2: "m", 3: "d", - 4: "bdefhnorstvw~", + 4: "bdefhlnorstuvw~", 5: "nv", 6: "t", 7: "o", 8: "m", - 9: "emp" + 9: "abcdefglmprst" }; var indexSectionNames = diff --git a/git-main/string__view_8hpp_source.html b/git-main/string__view_8hpp_source.html index c464e4f..0e3956c 100644 --- a/git-main/string__view_8hpp_source.html +++ b/git-main/string__view_8hpp_source.html @@ -142,120 +142,120 @@
57template <typename Char = char> class basic_string_view {
58public:
-
62 constexpr inline basic_string_view() noexcept : data_(""), size_(0) {}
+
62 constexpr inline basic_string_view() noexcept : data_(""), size_(0) {}
63
-
69 constexpr inline basic_string_view(const Char *str) noexcept
-
70 : data_(str), size_(detail::strlen_constexpr(str)) {}
+
69 constexpr inline basic_string_view(const Char *str) noexcept
+
70 : data_(str), size_(detail::strlen_constexpr(str)) {}
71
77 constexpr inline basic_string_view(
-
78 const std::basic_string<Char> &str) noexcept
-
79 : data_(str.c_str()), size_(str.size()) {}
+
78 const std::basic_string<Char> &str) noexcept
+
79 : data_(str.c_str()), size_(str.size()) {}
80
-
87 constexpr inline basic_string_view(const Char *str, size_t len) noexcept
-
88 : data_(str), size_(len) {}
+
87 constexpr inline basic_string_view(const Char *str, size_t len) noexcept
+
88 : data_(str), size_(len) {}
89
-
95 constexpr inline basic_string_view(const basic_string_view &other)
-
96 : data_(other.data_), size_(other.size_) {}
+
95 constexpr inline basic_string_view(const basic_string_view &other)
+
96 : data_(other.data_), size_(other.size_) {}
97
- -
104 : data_(std::move(other.data_)), size_(std::move(other.size_)) {}
+
103 constexpr inline basic_string_view(basic_string_view &&other) noexcept
+
104 : data_(std::move(other.data_)), size_(std::move(other.size_)) {}
105
- +
112 MGUTILITY_CNSTXPR inline basic_string_view<Char> &
- -
114 data_ = other.data_;
-
115 size_ = other.size_;
+
113 operator=(const basic_string_view &other) noexcept {
+
114 data_ = other.data_;
+
115 size_ = other.size_;
116 return *this;
117 }
118
- +
125 MGUTILITY_CNSTXPR inline basic_string_view<Char> &
- -
127 data_ = std::move(other.data_);
-
128 size_ = std::move(other.size_);
+
126 operator=(basic_string_view &&other) noexcept {
+
127 data_ = std::move(other.data_);
+
128 size_ = std::move(other.size_);
129 return *this;
130 }
131
-
138 constexpr inline const Char operator[](size_t index) const noexcept {
+
138 constexpr inline const Char operator[](size_t index) const noexcept {
139 return data_[index];
140 }
141
-
147 constexpr inline const Char *begin() const noexcept { return data_; }
+
147 constexpr inline const Char *begin() const noexcept { return data_; }
148
-
154 constexpr inline const Char *end() const noexcept { return (data_ + size_); }
+
154 constexpr inline const Char *end() const noexcept { return (data_ + size_); }
155
-
161 constexpr inline bool empty() const noexcept { return size_ < 1; }
+
161 constexpr inline bool empty() const noexcept { return size_ < 1; }
162
-
168 constexpr inline size_t size() const noexcept { return size_; }
+
168 constexpr inline size_t size() const noexcept { return size_; }
169
-
175 constexpr inline const Char *data() const noexcept { return data_; }
+
175 constexpr inline const Char *data() const noexcept { return data_; }
176
-
184 constexpr inline basic_string_view<Char>
+
184 constexpr inline basic_string_view<Char>
-
185 substr(size_t begin, size_t len = 0U) const noexcept {
-
186 return basic_string_view<Char>(data_ + begin,
-
187 len == 0U ? size_ - begin : len);
+
185 substr(size_t begin, size_t len = 0U) const noexcept {
+
186 return basic_string_view<Char>(data_ + begin,
+
187 len == 0U ? size_ - begin : len);
188 }
189
-
197 constexpr inline size_t rfind(Char c, size_t pos = npos) const noexcept {
-
198 return (pos == npos ? pos = size_ : pos = pos), c == data_[pos] ? pos
-
199 : pos == 0U
+
197 constexpr inline size_t rfind(Char c, size_t pos = npos) const noexcept {
+
198 return (pos == npos ? pos = size_ : pos = pos), c == data_[pos] ? pos
+
199 : pos == 0U
200 ? npos
-
201 : rfind(c, --pos);
+
201 : rfind(c, --pos);
202 }
203
-
211 constexpr inline size_t find(Char c, size_t pos = 0) const noexcept {
-
212 return c == data_[pos] ? pos : pos < size_ ? find(c, ++pos) : npos;
+
211 constexpr inline size_t find(Char c, size_t pos = 0) const noexcept {
+
212 return c == data_[pos] ? pos : pos < size_ ? find(c, ++pos) : npos;
213 }
214
222 constexpr friend inline bool
- -
224 basic_string_view<Char> rhs) noexcept {
-
225 return (lhs.size_ == rhs.size_) &&
-
226 std::strncmp(lhs.data_, rhs.data_, lhs.size_) == 0;
+ +
224 basic_string_view<Char> rhs) noexcept {
+
225 return (lhs.size_ == rhs.size_) &&
+
226 std::strncmp(lhs.data_, rhs.data_, lhs.size_) == 0;
227 }
228
-
236 constexpr friend inline bool operator==(basic_string_view<Char> lhs,
-
237 const Char *rhs) noexcept {
-
238 return (lhs.size_ == detail::strlen_constexpr(rhs)) &&
-
239 std::strncmp(lhs.data_, rhs, lhs.size_) == 0;
+
236 constexpr friend inline bool operator==(basic_string_view<Char> lhs,
+
237 const Char *rhs) noexcept {
+
238 return (lhs.size_ == detail::strlen_constexpr(rhs)) &&
+
239 std::strncmp(lhs.data_, rhs, lhs.size_) == 0;
240 }
241
249 constexpr friend inline bool
- -
251 basic_string_view<Char> rhs) noexcept {
-
252 return !(lhs == rhs);
+ +
251 basic_string_view<Char> rhs) noexcept {
+
252 return !(lhs == rhs);
253 }
254
-
262 constexpr friend inline bool operator!=(basic_string_view<Char> lhs,
-
263 const Char *rhs) noexcept {
-
264 return !(lhs == rhs);
+
262 constexpr friend inline bool operator!=(basic_string_view<Char> lhs,
+
263 const Char *rhs) noexcept {
+
264 return !(lhs == rhs);
265 }
266
@@ -264,12 +264,12 @@
279 inline operator std::string() const { return std::string(data_, size_); }
280
-
288 friend inline std::ostream &operator<<(std::ostream &os,
- -
290 for (auto c : sv) {
-
291 os << c;
+ +
289 const basic_string_view<Char> &sv) {
+
290 for (auto c : sv) {
+
291 os << c;
292 }
-
293 return os;
+
293 return os;
294 }
295
@@ -277,7 +277,7 @@
297
298private:
299 size_t size_;
-
300 const Char *data_;
+
300 const Char *data_;
301};
302
@@ -316,9 +316,9 @@
constexpr friend bool operator!=(basic_string_view< Char > lhs, const Char *rhs) noexcept
Inequality operator.
Definition string_view.hpp:262
MGUTILITY_CNSTXPR basic_string_view< Char > & operator=(basic_string_view &&other) noexcept
Move assignment operator.
Definition string_view.hpp:126
constexpr basic_string_view< Char > substr(size_t begin, size_t len=0U) const noexcept
Returns a substring view.
Definition string_view.hpp:185
+
Definition doctest.h:530
Defines macros for compiler and standard support detection.
Checks for MSVC compiler version.
Definition enum_for_each.hpp:34
-
Definition meta.hpp:161

diff --git a/git-main/structmgutility_1_1detail_1_1enum__sequence__helper.html b/git-main/structmgutility_1_1detail_1_1enum__sequence__helper.html index a8a3992..6f2425e 100644 --- a/git-main/structmgutility_1_1detail_1_1enum__sequence__helper.html +++ b/git-main/structmgutility_1_1detail_1_1enum__sequence__helper.html @@ -96,7 +96,7 @@

#include <meta.hpp>

Detailed Description

-
template<typename Enum, int Min, int Max, int... Next>
+
template<typename Enum, int Min, int Max, int... Next>
struct mgutility::detail::enum_sequence_helper< Enum, Min, Max, Next >

Helper for generating a sequence of enumeration values.

Template Parameters
diff --git a/git-main/structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html b/git-main/structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html index 65970c4..718c298 100644 --- a/git-main/structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html +++ b/git-main/structmgutility_1_1detail_1_1enum__sequence__helper_3_01Enum_00_01Min_00_01Min_00_01Next_8_8_8_01_4.html @@ -102,12 +102,12 @@ +using 

Public Types

-using type = enum_sequence<Enum, static_cast<Enum>(Next)...>
type = enum_sequence<Enum, static_cast<Enum>(Next)...>
 The resulting sequence type.
 

Detailed Description

-
template<typename Enum, int Min, int... Next>
+
template<typename Enum, int Min, int... Next>
struct mgutility::detail::enum_sequence_helper< Enum, Min, Min, Next... >

Specialization of enum_sequence_helper for the end of the sequence.

Template Parameters
diff --git a/git-main/structmgutility_1_1detail_1_1enum__type.html b/git-main/structmgutility_1_1detail_1_1enum__type.html index c32f62d..f39dff5 100644 --- a/git-main/structmgutility_1_1detail_1_1enum__type.html +++ b/git-main/structmgutility_1_1detail_1_1enum__type.html @@ -96,12 +96,12 @@
- - + + - - + +

Static Public Member Functions

template<typename Enum , Enum e, detail::enable_if_t<!detail::is_scoped_enum< Enum >::value, bool > = true>
static MGUTILITY_CNSTXPR auto name () noexcept -> mgutility::string_view
template<typename Enum , Enum e, detail::enable_if_t<!detail::is_scoped_enum< Enum >::value, bool > = true>
static MGUTILITY_CNSTXPR auto name () noexcept -> mgutility::string_view
 Gets the name of an unscoped enum value.
 
template<typename Enum , Enum e, detail::enable_if_t< detail::is_scoped_enum< Enum >::value, bool > = true>
static MGUTILITY_CNSTXPR auto name () noexcept -> mgutility::string_view
template<typename Enum , Enum e, detail::enable_if_t< detail::is_scoped_enum< Enum >::value, bool > = true>
static MGUTILITY_CNSTXPR auto name () noexcept -> mgutility::string_view
 Gets the name of a scoped enum value.
 
@@ -112,13 +112,13 @@

-template<typename Enum , Enum e, detail::enable_if_t<!detail::is_scoped_enum< Enum >::value, bool > = true>
+template<typename Enum , Enum e, detail::enable_if_t<!detail::is_scoped_enum< Enum >::value, bool > = true>
- + @@ -149,13 +149,13 @@

-template<typename Enum , Enum e, detail::enable_if_t< detail::is_scoped_enum< Enum >::value, bool > = true>
+template<typename Enum , Enum e, detail::enable_if_t< detail::is_scoped_enum< Enum >::value, bool > = true>

static MGUTILITY_CNSTXPR auto mgutility::detail::enum_type::name static MGUTILITY_CNSTXPR auto mgutility::detail::enum_type::name ( ) -> mgutility::string_view
+static constexpr auto  +static constexpr auto 
- + diff --git a/git-main/structmgutility_1_1detail_1_1has__bit__or.html b/git-main/structmgutility_1_1detail_1_1has__bit__or.html index 5b652e5..a328c52 100644 --- a/git-main/structmgutility_1_1detail_1_1has__bit__or.html +++ b/git-main/structmgutility_1_1detail_1_1has__bit__or.html @@ -102,7 +102,7 @@

Detailed Description

-
template<typename T, typename = void>
+
template<typename T, typename = void>
struct mgutility::detail::has_bit_or< T, typename >

Trait to check if a type supports the bitwise OR operator.

Template Parameters
static MGUTILITY_CNSTXPR auto mgutility::detail::enum_type::name static MGUTILITY_CNSTXPR auto mgutility::detail::enum_type::name ( ) -> mgutility::string_view
diff --git a/git-main/structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html b/git-main/structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html index a15506c..e004453 100644 --- a/git-main/structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html +++ b/git-main/structmgutility_1_1detail_1_1has__bit__or_3_01T_00_01decltype_07_07T_02_03_7T_02_03_08_00_01void_07_08_08_4.html @@ -102,7 +102,7 @@

Detailed Description

-
template<typename T>
+
template<typename T>
struct mgutility::detail::has_bit_or< T, decltype((T{}|T{}), void())>

Specialization of has_bit_or for types that support the bitwise OR operator.

Template Parameters
diff --git a/git-main/structmgutility_1_1detail_1_1is__scoped__enum.html b/git-main/structmgutility_1_1detail_1_1is__scoped__enum.html index bbbc24b..cd4f782 100644 --- a/git-main/structmgutility_1_1detail_1_1is__scoped__enum.html +++ b/git-main/structmgutility_1_1detail_1_1is__scoped__enum.html @@ -101,12 +101,12 @@
- +

Static Public Attributes

static constexpr auto value
static constexpr auto value
 Boolean value indicating if the type is a scoped enumeration.
 

Detailed Description

-
template<typename E>
+
template<typename E>
struct mgutility::detail::is_scoped_enum< E >

Trait to check if a type is a scoped enumeration.

Template Parameters
@@ -121,13 +121,13 @@

+template<typename E >

diff --git a/git-main/structmgutility_1_1enum__range.html b/git-main/structmgutility_1_1enum__range.html index 176194b..0af7e55 100644 --- a/git-main/structmgutility_1_1enum__range.html +++ b/git-main/structmgutility_1_1enum__range.html @@ -102,14 +102,14 @@ +static constexpr auto  +static constexpr auto 
- +
constexpr auto mgutility::detail::is_scoped_enum< E >::valueconstexpr auto mgutility::detail::is_scoped_enum< E >::value

Static Public Attributes

-static constexpr auto min {0}
min {0}
 
-static constexpr auto max {256}
max {256}
 

Detailed Description

-
template<typename T>
+
template<typename T>
struct mgutility::enum_range< T >

Provides the range for an enumeration type.

Template Parameters
diff --git a/git-main/structmgutility_1_1enum__range_3_01Position_01_4.html b/git-main/structmgutility_1_1enum__range_3_01Position_01_4.html index 605b3db..d50b6a4 100644 --- a/git-main/structmgutility_1_1enum__range_3_01Position_01_4.html +++ b/git-main/structmgutility_1_1enum__range_3_01Position_01_4.html @@ -97,10 +97,10 @@ +static constexpr auto  +static constexpr auto 

Static Public Attributes

-static constexpr auto min = 0
min = 0
 
-static constexpr auto max = 16
max = 16
 

The documentation for this struct was generated from the following file:
    diff --git a/git-main/structmgutility_1_1enum__range_3_01color_01_4.html b/git-main/structmgutility_1_1enum__range_3_01color_01_4.html index 79c8ac6..12fd908 100644 --- a/git-main/structmgutility_1_1enum__range_3_01color_01_4.html +++ b/git-main/structmgutility_1_1enum__range_3_01color_01_4.html @@ -97,10 +97,10 @@

Static Public Attributes

-static constexpr auto min = 0
min = 0
 
-static constexpr auto max = 150
max = 150
 

The documentation for this struct was generated from the following file:
    diff --git a/git-main/structmgutility_1_1nullopt__t.html b/git-main/structmgutility_1_1nullopt__t.html index 3d765c3..2ee3091 100644 --- a/git-main/structmgutility_1_1nullopt__t.html +++ b/git-main/structmgutility_1_1nullopt__t.html @@ -101,8 +101,8 @@ - - + +

    Public Member Functions

    template<typename T >
    MGUTILITY_CNSTXPR operator optional< T > ()
    template<typename T >
    MGUTILITY_CNSTXPR operator optional< T > ()
     Converts nullopt_t to an empty optional.
     
    @@ -115,13 +115,13 @@

    +template<typename T >
    - + diff --git a/git-main/structmgutility_1_1pair.html b/git-main/structmgutility_1_1pair.html index 670a86f..91d4146 100644 --- a/git-main/structmgutility_1_1pair.html +++ b/git-main/structmgutility_1_1pair.html @@ -97,10 +97,10 @@ +T  +U 
    MGUTILITY_CNSTXPR mgutility::nullopt_t::operator optional< T > MGUTILITY_CNSTXPR mgutility::nullopt_t::operator optional< T > ( )

    Public Attributes

    -T first
    first
     
    -U second
    second
     

    The documentation for this struct was generated from the following file:
      diff --git a/git-main/structstd_1_1char__traits.html b/git-main/structstd_1_1char__traits.html new file mode 100644 index 0000000..fa29080 --- /dev/null +++ b/git-main/structstd_1_1char__traits.html @@ -0,0 +1,102 @@ + + + + + + + + + enum_name: std::char_traits< charT > Struct Template Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      std::char_traits< charT > Struct Template Reference
      +
      +
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/doctest/doctest.h
      • +
      +
      + + + + diff --git a/git-main/structuser1_1_1label-members.html b/git-main/structuser1_1_1label-members.html new file mode 100644 index 0000000..56474da --- /dev/null +++ b/git-main/structuser1_1_1label-members.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user1::label Member List
      +
      +
      + +

      This is the complete list of members for user1::label, including all inherited members.

      + + + +
      i (defined in user1::label)user1::label
      label() (defined in user1::label)user1::labelinline
      + + + + diff --git a/git-main/structuser1_1_1label.html b/git-main/structuser1_1_1label.html new file mode 100644 index 0000000..0c6130e --- /dev/null +++ b/git-main/structuser1_1_1label.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: user1::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user1::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace1.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser2_1_1label-members.html b/git-main/structuser2_1_1label-members.html new file mode 100644 index 0000000..30494c7 --- /dev/null +++ b/git-main/structuser2_1_1label-members.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user2::label Member List
      +
      +
      + +

      This is the complete list of members for user2::label, including all inherited members.

      + + + + +
      i (defined in user2::label)user2::label
      label() (defined in user2::label)user2::labelinline
      operator== (defined in user2::label)user2::labelfriend
      + + + + diff --git a/git-main/structuser2_1_1label.html b/git-main/structuser2_1_1label.html new file mode 100644 index 0000000..672209b --- /dev/null +++ b/git-main/structuser2_1_1label.html @@ -0,0 +1,119 @@ + + + + + + + + + enum_name: user2::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user2::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      + + + +

      +Friends

      +bool operator== (const user2::label &lhs, const user2::label &rhs)
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace2.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser3_1_1label-members.html b/git-main/structuser3_1_1label-members.html new file mode 100644 index 0000000..f548012 --- /dev/null +++ b/git-main/structuser3_1_1label-members.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user3::label Member List
      +
      +
      + +

      This is the complete list of members for user3::label, including all inherited members.

      + + + + +
      i (defined in user3::label)user3::label
      label() (defined in user3::label)user3::labelinline
      operator==(const user3::label &rhs) const (defined in user3::label)user3::labelinline
      + + + + diff --git a/git-main/structuser3_1_1label.html b/git-main/structuser3_1_1label.html new file mode 100644 index 0000000..dd46da7 --- /dev/null +++ b/git-main/structuser3_1_1label.html @@ -0,0 +1,119 @@ + + + + + + + + + enum_name: user3::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user3::label Struct Reference
      +
      +
      + + + + +

      +Public Member Functions

      +bool operator== (const user3::label &rhs) const
       
      + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace3.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser4_1_1label-members.html b/git-main/structuser4_1_1label-members.html new file mode 100644 index 0000000..9968f79 --- /dev/null +++ b/git-main/structuser4_1_1label-members.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user4::label Member List
      +
      +
      + +

      This is the complete list of members for user4::label, including all inherited members.

      + + + + +
      i (defined in user4::label)user4::label
      label() (defined in user4::label)user4::labelinline
      operator==(const user4::label &rhs) const (defined in user4::label)user4::labelinline
      + + + + diff --git a/git-main/structuser4_1_1label.html b/git-main/structuser4_1_1label.html new file mode 100644 index 0000000..8401b0b --- /dev/null +++ b/git-main/structuser4_1_1label.html @@ -0,0 +1,119 @@ + + + + + + + + + enum_name: user4::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user4::label Struct Reference
      +
      +
      + + + + +

      +Public Member Functions

      +bool operator== (const user4::label &rhs) const
       
      + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace4.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser5_1_1label-members.html b/git-main/structuser5_1_1label-members.html new file mode 100644 index 0000000..8f062ca --- /dev/null +++ b/git-main/structuser5_1_1label-members.html @@ -0,0 +1,105 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user5::label Member List
      +
      +
      + +

      This is the complete list of members for user5::label, including all inherited members.

      + + + + +
      i (defined in user5::label)user5::label
      label() (defined in user5::label)user5::labelinline
      operator==(const user5::label &rhs) const (defined in user5::label)user5::labelinline
      + + + + diff --git a/git-main/structuser5_1_1label.html b/git-main/structuser5_1_1label.html new file mode 100644 index 0000000..c9b7d2f --- /dev/null +++ b/git-main/structuser5_1_1label.html @@ -0,0 +1,119 @@ + + + + + + + + + enum_name: user5::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user5::label Struct Reference
      +
      +
      + + + + +

      +Public Member Functions

      +bool operator== (const user5::label &rhs) const
       
      + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace4.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser6_1_1label-members.html b/git-main/structuser6_1_1label-members.html new file mode 100644 index 0000000..3f44dc8 --- /dev/null +++ b/git-main/structuser6_1_1label-members.html @@ -0,0 +1,111 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user6::label Member List
      +
      +
      + +

      This is the complete list of members for user6::label, including all inherited members.

      + + + + + + + + + + +
      i (defined in user6::label)user6::label
      label() (defined in user6::label)user6::labelinline
      label() (defined in user6::label)user6::labelinline
      label() (defined in user6::label)user6::labelinline
      label() (defined in user6::label)user6::labelinline
      operator==(const user6::label &rhs) const (defined in user6::label)user6::labelinline
      operator== (defined in user6::label)user6::labelfriend
      operator==(const user6::label &rhs) const (defined in user6::label)user6::labelinline
      operator== (defined in user6::label)user6::labelfriend
      + + + + diff --git a/git-main/structuser6_1_1label.html b/git-main/structuser6_1_1label.html new file mode 100644 index 0000000..4ce741b --- /dev/null +++ b/git-main/structuser6_1_1label.html @@ -0,0 +1,135 @@ + + + + + + + + + enum_name: user6::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user6::label Struct Reference
      +
      +
      + + + + + + +

      +Public Member Functions

      +bool operator== (const user6::label &rhs) const
       
      +bool operator== (const user6::label &rhs) const
       
      + + + +

      +Public Attributes

      +int i
       
      + + + + + +

      +Friends

      +bool operator== (const user6::label &lhs, const user6::label &rhs)
       
      +bool operator== (const user6::label &lhs, const user6::label &rhs)
       
      +
      The documentation for this struct was generated from the following files:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace5.cpp
      • +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace6.cpp
      • +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace7.cpp
      • +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace8.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser7_1_1label-members.html b/git-main/structuser7_1_1label-members.html new file mode 100644 index 0000000..aebaf83 --- /dev/null +++ b/git-main/structuser7_1_1label-members.html @@ -0,0 +1,108 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user7::label Member List
      +
      +
      + +

      This is the complete list of members for user7::label, including all inherited members.

      + + + + + + + +
      i (defined in user7::label)user7::label
      label() (defined in user7::label)user7::labelinline
      label() (defined in user7::label)user7::labelinline
      label() (defined in user7::label)user7::labelinline
      operator== (defined in user7::label)user7::labelfriend
      operator== (defined in user7::label)user7::labelfriend
      + + + + diff --git a/git-main/structuser7_1_1label.html b/git-main/structuser7_1_1label.html new file mode 100644 index 0000000..692b976 --- /dev/null +++ b/git-main/structuser7_1_1label.html @@ -0,0 +1,124 @@ + + + + + + + + + enum_name: user7::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user7::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      + + + + + +

      +Friends

      +bool operator== (const user7::label &lhs, const user7::label &rhs)
       
      +bool operator== (const user7::label &lhs, const user7::label &rhs)
       
      +
      The documentation for this struct was generated from the following files:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace5.cpp
      • +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace6.cpp
      • +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace7.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser8_1_1label-members.html b/git-main/structuser8_1_1label-members.html new file mode 100644 index 0000000..c03c104 --- /dev/null +++ b/git-main/structuser8_1_1label-members.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user8::label Member List
      +
      +
      + +

      This is the complete list of members for user8::label, including all inherited members.

      + + + +
      i (defined in user8::label)user8::label
      label() (defined in user8::label)user8::labelinline
      + + + + diff --git a/git-main/structuser8_1_1label.html b/git-main/structuser8_1_1label.html new file mode 100644 index 0000000..4647bea --- /dev/null +++ b/git-main/structuser8_1_1label.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: user8::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user8::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace8.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser9a_1_1label-members.html b/git-main/structuser9a_1_1label-members.html new file mode 100644 index 0000000..8318627 --- /dev/null +++ b/git-main/structuser9a_1_1label-members.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user9a::label Member List
      +
      +
      + +

      This is the complete list of members for user9a::label, including all inherited members.

      + + + +
      i (defined in user9a::label)user9a::label
      label() (defined in user9a::label)user9a::labelinline
      + + + + diff --git a/git-main/structuser9a_1_1label.html b/git-main/structuser9a_1_1label.html new file mode 100644 index 0000000..8108f5c --- /dev/null +++ b/git-main/structuser9a_1_1label.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: user9a::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user9a::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace9.cpp
      • +
      +
      + + + + diff --git a/git-main/structuser9b_1_1label-members.html b/git-main/structuser9b_1_1label-members.html new file mode 100644 index 0000000..97b2e71 --- /dev/null +++ b/git-main/structuser9b_1_1label-members.html @@ -0,0 +1,104 @@ + + + + + + + + + enum_name: Member List + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      +
      user9b::label Member List
      +
      +
      + +

      This is the complete list of members for user9b::label, including all inherited members.

      + + + +
      i (defined in user9b::label)user9b::label
      label() (defined in user9b::label)user9b::labelinline
      + + + + diff --git a/git-main/structuser9b_1_1label.html b/git-main/structuser9b_1_1label.html new file mode 100644 index 0000000..d6eb3ca --- /dev/null +++ b/git-main/structuser9b_1_1label.html @@ -0,0 +1,112 @@ + + + + + + + + + enum_name: user9b::label Struct Reference + + + + + + + + + + + + +
      + +
      + + + + + + +
      +
      + enum_name + +
      +
      +
      + +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + + +
      + +
      user9b::label Struct Reference
      +
      +
      + + + + +

      +Public Attributes

      +int i
       
      +
      The documentation for this struct was generated from the following file:
        +
      • /home/runner/work/enum_name/enum_name/build/_deps/doctest-src/examples/all_features/namespace9.cpp
      • +
      +
      + + + +