From 868ee1e04be15bc79753367a07ba7d76d6a14fca Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 18:17:18 +0200 Subject: [PATCH 1/6] Adding template base class inheritance inference --- src/uml/class_diagram_visitor.cc | 53 ++++++++++++++++++++++++++++++++ tests/t00032/.clang-uml | 12 ++++++++ tests/t00032/t00032.cc | 37 ++++++++++++++++++++++ tests/t00032/test_case.h | 49 +++++++++++++++++++++++++++++ tests/test_cases.cc | 1 + 5 files changed, 152 insertions(+) create mode 100644 tests/t00032/.clang-uml create mode 100644 tests/t00032/t00032.cc create mode 100644 tests/t00032/test_case.h diff --git a/src/uml/class_diagram_visitor.cc b/src/uml/class_diagram_visitor.cc index 30c9fea8..fb6e108a 100644 --- a/src/uml/class_diagram_visitor.cc +++ b/src/uml/class_diagram_visitor.cc @@ -1185,6 +1185,8 @@ class_ tu_visitor::build_template_instantiation( class_ tinst; std::string full_template_name; + std::vector> template_base_params{}; + if (t.primary_template().get(ctx.entity_index).size()) { const auto &primary_template_ref = static_cast( @@ -1201,6 +1203,54 @@ class_ tu_visitor::build_template_instantiation( if (full_template_name.back() == ':') tinst.name = full_template_name + tinst.name; + std::vector> template_parameter_names{}; + if (primary_template_ref.scope_name().has_value()) { + for (const auto &tp : primary_template_ref.scope_name() + .value() + .template_parameters()) { + template_parameter_names.emplace_back( + tp.name(), tp.is_variadic()); + } + } + + // Check if the primary template has any base classes + int base_index = 0; + for (const auto &base : primary_template_ref.bases()) { + if (base.kind() == cppast::cpp_entity_kind::base_class_t) { + const auto &base_class = + static_cast(base); + + const auto base_class_name = + cppast::to_string(base_class.type()); + + LOG_ERROR("FOUND TEMPLATE INSTANTIATION BASE: {}, {}, {}", + cppast::to_string(base.kind()), base_class_name, + base_index); + + // Check if any of the primary template arguments has a + // parameter equal to this type + auto it = std::find_if(template_parameter_names.begin(), + template_parameter_names.end(), + [&base_class_name]( + const auto &p) { return p.first == base_class_name; }); + + if (it != template_parameter_names.end()) { + // Found base class which is a template parameter + LOG_ERROR("FOUND BASE CLASS WHICH IS A TEMPLATE PARAMETER " + "{}, {}, {}", + it->first, it->second, + std::distance(template_parameter_names.begin(), it)); + template_base_params.emplace_back(it->first, it->second, + std::distance(template_parameter_names.begin(), it)); + } + else { + // This is a regular base class - it is handled by + // process_template + } + } + base_index++; + } + if (primary_template_ref.user_data()) { tinst.base_template_usr = static_cast(primary_template_ref.user_data()); @@ -1232,6 +1282,7 @@ class_ tu_visitor::build_template_instantiation( tinst.is_template_instantiation = true; + // Process template argumetns for (const auto &targ : t.arguments().value()) { class_template ct; if (targ.type()) { @@ -1255,6 +1306,8 @@ class_ tu_visitor::build_template_instantiation( tinst.templates.emplace_back(std::move(ct)); } + // Check if template inherits from any of the template arguments + tinst.usr = tinst.full_name(ctx.config.using_namespace); if (tinst.usr.substr(0, tinst.usr.find('<')).find("::") == std::string::npos) { diff --git a/tests/t00032/.clang-uml b/tests/t00032/.clang-uml new file mode 100644 index 00000000..58018aa0 --- /dev/null +++ b/tests/t00032/.clang-uml @@ -0,0 +1,12 @@ +compilation_database_dir: .. +output_directory: puml +diagrams: + t00032_class: + type: class + glob: + - ../../tests/t00032/t00032.cc + using_namespace: + - clanguml::t00032 + include: + namespaces: + - clanguml::t00032 diff --git a/tests/t00032/t00032.cc b/tests/t00032/t00032.cc new file mode 100644 index 00000000..99cf3b32 --- /dev/null +++ b/tests/t00032/t00032.cc @@ -0,0 +1,37 @@ +#include +#include + +namespace clanguml { +namespace t00032 { + +struct Base { +}; + +struct TBase { +}; + +struct A { + void operator()() { } +}; + +struct B { + void operator()() { } +}; + +struct C { + void operator()() { } +}; + +template +struct Overload : public Base, public T, public Ts... { + using Ts::operator()...; +}; + +template Overload(Ts...) -> Overload; + +struct R { + Overload overload; +}; + +} // namespace t00032 +} // namespace clanguml diff --git a/tests/t00032/test_case.h b/tests/t00032/test_case.h new file mode 100644 index 00000000..da339e08 --- /dev/null +++ b/tests/t00032/test_case.h @@ -0,0 +1,49 @@ +/** + * tests/t00032/test_case.cc + * + * Copyright (c) 2021 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +TEST_CASE("t00032", "[test-case][class]") +{ + auto [config, db] = load_config("t00032"); + + auto diagram = config.diagrams["t00032_class"]; + + REQUIRE(diagram->name == "t00032_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00032"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00032::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00032_class"); + + auto puml = generate_class_puml(diagram, model); + AliasMatcher _A(puml); + + REQUIRE_THAT(puml, StartsWith("@startuml")); + REQUIRE_THAT(puml, EndsWith("@enduml\n")); + + REQUIRE_THAT(puml, IsClass(_A("A"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index a3f2fe62..d410f137 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -135,6 +135,7 @@ using namespace clanguml::test::matchers; #include "t00029/test_case.h" #include "t00030/test_case.h" #include "t00031/test_case.h" +#include "t00032/test_case.h" // // Sequence diagram tests From d62939838906b72b654446ecebc46a69e537a6aa Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 23:41:15 +0200 Subject: [PATCH 2/6] Added template overload pattern test case --- src/uml/class_diagram_visitor.cc | 40 +++++++++++++++++++++++++++----- tests/t00032/t00032.cc | 5 ++-- tests/t00032/test_case.h | 14 +++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/uml/class_diagram_visitor.cc b/src/uml/class_diagram_visitor.cc index fb6e108a..3282cbea 100644 --- a/src/uml/class_diagram_visitor.cc +++ b/src/uml/class_diagram_visitor.cc @@ -31,6 +31,8 @@ #include #include +#include + namespace clanguml { namespace visitor { namespace class_diagram { @@ -1185,7 +1187,7 @@ class_ tu_visitor::build_template_instantiation( class_ tinst; std::string full_template_name; - std::vector> template_base_params{}; + std::deque> template_base_params{}; if (t.primary_template().get(ctx.entity_index).size()) { const auto &primary_template_ref = @@ -1223,7 +1225,7 @@ class_ tu_visitor::build_template_instantiation( const auto base_class_name = cppast::to_string(base_class.type()); - LOG_ERROR("FOUND TEMPLATE INSTANTIATION BASE: {}, {}, {}", + LOG_DBG("Found template instantiation base: {}, {}, {}", cppast::to_string(base.kind()), base_class_name, base_index); @@ -1236,8 +1238,8 @@ class_ tu_visitor::build_template_instantiation( if (it != template_parameter_names.end()) { // Found base class which is a template parameter - LOG_ERROR("FOUND BASE CLASS WHICH IS A TEMPLATE PARAMETER " - "{}, {}, {}", + LOG_DBG("Found base class which is a template parameter " + "{}, {}, {}", it->first, it->second, std::distance(template_parameter_names.begin(), it)); template_base_params.emplace_back(it->first, it->second, @@ -1283,7 +1285,10 @@ class_ tu_visitor::build_template_instantiation( tinst.is_template_instantiation = true; // Process template argumetns + int arg_index{0}; + bool variadic_params{false}; for (const auto &targ : t.arguments().value()) { + bool add_template_argument_as_base_class{false}; class_template ct; if (targ.type()) { ct.type = cppast::to_string(targ.type().value()); @@ -1301,13 +1306,36 @@ class_ tu_visitor::build_template_instantiation( .as_string(); } + // In case any of the template arguments are base classes, add + // them as parents of the current template instantiation class + if (template_base_params.size() > 0) { + auto [arg_name, is_variadic, index] = template_base_params.front(); + if (variadic_params) + add_template_argument_as_base_class = true; + else { + variadic_params = is_variadic; + if (arg_index == index) { + add_template_argument_as_base_class = true; + template_base_params.pop_front(); + } + } + + if (add_template_argument_as_base_class) { + LOG_DBG("Adding template argument '{}' as base class", ct.type); + + class_parent cp; + cp.access = class_parent::access_t::kPublic; + cp.name = ct.type; + + tinst.bases.emplace_back(std::move(cp)); + } + } + LOG_DBG("Adding template argument '{}'", ct.type); tinst.templates.emplace_back(std::move(ct)); } - // Check if template inherits from any of the template arguments - tinst.usr = tinst.full_name(ctx.config.using_namespace); if (tinst.usr.substr(0, tinst.usr.find('<')).find("::") == std::string::npos) { diff --git a/tests/t00032/t00032.cc b/tests/t00032/t00032.cc index 99cf3b32..c080048e 100644 --- a/tests/t00032/t00032.cc +++ b/tests/t00032/t00032.cc @@ -22,15 +22,16 @@ struct C { void operator()() { } }; -template +template struct Overload : public Base, public T, public Ts... { using Ts::operator()...; + L counter; }; template Overload(Ts...) -> Overload; struct R { - Overload overload; + Overload overload; }; } // namespace t00032 diff --git a/tests/t00032/test_case.h b/tests/t00032/test_case.h index da339e08..d8effc23 100644 --- a/tests/t00032/test_case.h +++ b/tests/t00032/test_case.h @@ -42,7 +42,21 @@ TEST_CASE("t00032", "[test-case][class]") REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); + REQUIRE_THAT(puml, IsClass(_A("Base"))); + REQUIRE_THAT(puml, IsClass(_A("TBase"))); REQUIRE_THAT(puml, IsClass(_A("A"))); + REQUIRE_THAT(puml, IsClass(_A("B"))); + REQUIRE_THAT(puml, IsClass(_A("C"))); + REQUIRE_THAT(puml, IsClass(_A("R"))); + + REQUIRE_THAT(puml, IsClassTemplate("Overload", "T,L,Ts...")); + + REQUIRE_THAT(puml, IsBaseClass(_A("Base"), _A("Overload"))); + REQUIRE_THAT( + puml, IsBaseClass(_A("TBase"), _A("Overload"))); + REQUIRE_THAT(puml, IsBaseClass(_A("A"), _A("Overload"))); + REQUIRE_THAT(puml, IsBaseClass(_A("B"), _A("Overload"))); + REQUIRE_THAT(puml, IsBaseClass(_A("C"), _A("Overload"))); save_puml( "./" + config.output_directory + "/" + diagram->name + ".puml", puml); From 55f1cc029859d76f72b6fdfc5df3e1c211542f33 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 23:47:12 +0200 Subject: [PATCH 3/6] Updated clang-format to version 12 --- Makefile | 2 +- src/uml/sequence_diagram_model.h | 2 +- tests/catch.h | 150 ++++++++++++++++--------------- tests/t00002/t00002.cc | 4 +- tests/t00003/t00003.cc | 8 +- tests/t00004/t00004.cc | 4 +- tests/t00011/t00011.cc | 2 +- tests/t00013/t00013.cc | 2 +- tests/t00015/t00015.cc | 3 +- tests/t00021/t00021.cc | 16 ++-- tests/t00022/t00022.cc | 8 +- tests/t00023/t00023.cc | 6 +- tests/t00024/t00024.cc | 8 +- tests/t00025/t00025.cc | 8 +- tests/t00027/t00027.cc | 8 +- tests/t20001/t20001.cc | 4 +- 16 files changed, 121 insertions(+), 114 deletions(-) diff --git a/Makefile b/Makefile index 002f4201..cc053baa 100644 --- a/Makefile +++ b/Makefile @@ -62,4 +62,4 @@ init_compile_commands: debug .PHONY: clang-format clang-format: - docker run --rm -v $(CURDIR):/root/sources bkryza/clang-format-check:1.2 + docker run --rm -v $(CURDIR):/root/sources bkryza/clang-format-check:1.3 diff --git a/src/uml/sequence_diagram_model.h b/src/uml/sequence_diagram_model.h index 504e3778..395a3714 100644 --- a/src/uml/sequence_diagram_model.h +++ b/src/uml/sequence_diagram_model.h @@ -55,7 +55,7 @@ struct diagram { std::map sequences; - void sort() {} + void sort() { } }; } } diff --git a/tests/catch.h b/tests/catch.h index 9a6a49f9..f531df86 100644 --- a/tests/catch.h +++ b/tests/catch.h @@ -853,8 +853,9 @@ constexpr auto operator"" _catch_sr( INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) #else #define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) \ - INTERNAL_CATCH_EXPAND_VARGS(decltype( \ - get_wrapper())) + INTERNAL_CATCH_EXPAND_VARGS( \ + decltype(get_wrapper())) #define INTERNAL_CATCH_MAKE_TYPE_LIST(...) \ INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2( \ INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) @@ -1277,8 +1278,8 @@ template struct true_given : std::true_type { }; struct is_callable_tester { template - true_given()(std::declval()...))> static test(int); + true_given()( + std::declval()...))> static test(int); template std::false_type static test(...); }; @@ -1634,8 +1635,8 @@ struct AutoReg : NonCopyable { }; \ static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() { \ using TestInit = typename create()), \ + decltype(get_wrapper()), \ TypeList>::type; \ TestInit t; \ @@ -1851,8 +1852,8 @@ struct AutoReg : NonCopyable { }; \ static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() { \ using TestInit = typename create()), \ + decltype(get_wrapper()), \ TypeList>::type; \ TestInit t; \ @@ -2152,7 +2153,7 @@ inline id performOptionalSelector(id obj, SEL sel) #define CATCH_UNSAFE_UNRETAINED #define CATCH_ARC_STRONG #else -inline void arcSafeRelease(NSObject *) {} +inline void arcSafeRelease(NSObject *) { } inline id performOptionalSelector(id obj, SEL sel) { #ifdef __clang__ @@ -2194,8 +2195,9 @@ template std::string rawMemoryToString(const T &object) template class IsStreamInsertable { template - static auto test(int) -> decltype( - std::declval() << std::declval(), std::true_type()); + static auto test(int) + -> decltype(std::declval() << std::declval(), + std::true_type()); template static auto test(...) -> std::false_type; @@ -2549,7 +2551,7 @@ struct TupleElementPrinter { template struct TupleElementPrinter { - static void print(const Tuple &, std::ostream &) {} + static void print(const Tuple &, std::ostream &) { } }; } @@ -3318,7 +3320,7 @@ public: } template - void captureValues(size_t index, T const &value, Ts const &... values) + void captureValues(size_t index, T const &value, Ts const &...values) { captureValue(index, Catch::Detail::stringify(value)); captureValues(index + 1, values...); @@ -4698,13 +4700,15 @@ struct IGeneratorTracker { namespace Catch { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) -template -[[noreturn]] void throw_exception(Ex const &e) { throw e; } +template [[noreturn]] void throw_exception(Ex const &e) +{ + throw e; +} #else // ^^ Exceptions are enabled // Exceptions are disabled vv [[noreturn]] void throw_exception(std::exception const &e); #endif - [[noreturn]] void throw_logic_error(std::string const &msg); +[[noreturn]] void throw_logic_error(std::string const &msg); [[noreturn]] void throw_domain_error(std::string const &msg); [[noreturn]] void throw_runtime_error(std::string const &msg); @@ -4754,7 +4758,7 @@ namespace Generators { // !TBD move this into its own location? namespace pf { template -std::unique_ptr make_unique(Args &&... args) +std::unique_ptr make_unique(Args &&...args) { return std::unique_ptr(new T(std::forward(args)...)); } @@ -4847,14 +4851,14 @@ template class Generators : public IGenerator { populate(T(std::forward(val))); } template - void populate(U &&valueOrGenerator, Gs &&... moreGenerators) + void populate(U &&valueOrGenerator, Gs &&...moreGenerators) { populate(std::forward(valueOrGenerator)); populate(std::forward(moreGenerators)...); } public: - template Generators(Gs &&... moreGenerators) + template Generators(Gs &&...moreGenerators) { m_generators.reserve(sizeof...(Gs)); populate(std::forward(moreGenerators)...); @@ -4888,7 +4892,7 @@ template struct as { }; template -auto makeGenerators(GeneratorWrapper &&generator, Gs &&... moreGenerators) +auto makeGenerators(GeneratorWrapper &&generator, Gs &&...moreGenerators) -> Generators { return Generators( @@ -4900,13 +4904,13 @@ auto makeGenerators(GeneratorWrapper &&generator) -> Generators return Generators(std::move(generator)); } template -auto makeGenerators(T &&val, Gs &&... moreGenerators) -> Generators +auto makeGenerators(T &&val, Gs &&...moreGenerators) -> Generators { return makeGenerators( value(std::forward(val)), std::forward(moreGenerators)...); } template -auto makeGenerators(as, U &&val, Gs &&... moreGenerators) -> Generators +auto makeGenerators(as, U &&val, Gs &&...moreGenerators) -> Generators { return makeGenerators( value(T(std::forward(val))), std::forward(moreGenerators)...); @@ -5749,7 +5753,7 @@ public: } private: - virtual ~OcMethod() {} + virtual ~OcMethod() { } Class m_cls; SEL m_sel; @@ -6557,7 +6561,7 @@ struct IStreamingReporter { virtual void noMatchingTestCases(std::string const &spec) = 0; - virtual void reportInvalidArguments(std::string const &) {} + virtual void reportInvalidArguments(std::string const &) { } virtual void testRunStarting(TestRunInfo const &testRunInfo) = 0; virtual void testGroupStarting(GroupInfo const &groupInfo) = 0; @@ -6566,10 +6570,10 @@ struct IStreamingReporter { virtual void sectionStarting(SectionInfo const §ionInfo) = 0; #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) - virtual void benchmarkPreparing(std::string const &) {} - virtual void benchmarkStarting(BenchmarkInfo const &) {} - virtual void benchmarkEnded(BenchmarkStats<> const &) {} - virtual void benchmarkFailed(std::string const &) {} + virtual void benchmarkPreparing(std::string const &) { } + virtual void benchmarkStarting(BenchmarkInfo const &) { } + virtual void benchmarkEnded(BenchmarkStats<> const &) { } + virtual void benchmarkFailed(std::string const &) { } #endif // CATCH_CONFIG_ENABLE_BENCHMARKING virtual void assertionStarting(AssertionInfo const &assertionInfo) = 0; @@ -6652,9 +6656,9 @@ template struct StreamingReporterBase : IStreamingReporter { ~StreamingReporterBase() override = default; - void noMatchingTestCases(std::string const &) override {} + void noMatchingTestCases(std::string const &) override { } - void reportInvalidArguments(std::string const &) override {} + void reportInvalidArguments(std::string const &) override { } void testRunStarting(TestRunInfo const &_testRunInfo) override { @@ -6718,7 +6722,7 @@ struct CumulativeReporterBase : IStreamingReporter { : value(_value) { } - virtual ~Node() {} + virtual ~Node() { } using ChildNodes = std::vector>; T value; @@ -6794,10 +6798,10 @@ struct CumulativeReporterBase : IStreamingReporter { return {Verbosity::Normal}; } - void testRunStarting(TestRunInfo const &) override {} - void testGroupStarting(GroupInfo const &) override {} + void testRunStarting(TestRunInfo const &) override { } + void testGroupStarting(GroupInfo const &) override { } - void testCaseStarting(TestCaseInfo const &) override {} + void testCaseStarting(TestCaseInfo const &) override { } void sectionStarting(SectionInfo const §ionInfo) override { @@ -6823,7 +6827,7 @@ struct CumulativeReporterBase : IStreamingReporter { m_deepestSection = std::move(node); } - void assertionStarting(AssertionInfo const &) override {} + void assertionStarting(AssertionInfo const &) override { } bool assertionEnded(AssertionStats const &assertionStats) override { @@ -6873,7 +6877,7 @@ struct CumulativeReporterBase : IStreamingReporter { } virtual void testRunEndedCumulative() = 0; - void skipTest(TestCaseInfo const &) override {} + void skipTest(TestCaseInfo const &) override { } IConfigPtr m_config; std::ostream &stream; @@ -7458,7 +7462,7 @@ inline void optimizer_barrier() template inline void deoptimize_value(T &&x) { keep_memory(&x); } template -inline auto invoke_deoptimized(Fn &&fn, Args &&... args) -> +inline auto invoke_deoptimized(Fn &&fn, Args &&...args) -> typename std::enable_if< !std::is_same::value>::type { @@ -7466,7 +7470,7 @@ inline auto invoke_deoptimized(Fn &&fn, Args &&... args) -> } template -inline auto invoke_deoptimized(Fn &&fn, Args &&... args) -> +inline auto invoke_deoptimized(Fn &&fn, Args &&...args) -> typename std::enable_if< std::is_same::value>::type { @@ -7498,14 +7502,14 @@ template using CompleteType_t = typename CompleteType::type; template struct CompleteInvoker { template - static Result invoke(Fun &&fun, Args &&... args) + static Result invoke(Fun &&fun, Args &&...args) { return std::forward(fun)(std::forward(args)...); } }; template <> struct CompleteInvoker { template - static CompleteType_t invoke(Fun &&fun, Args &&... args) + static CompleteType_t invoke(Fun &&fun, Args &&...args) { std::forward(fun)(std::forward(args)...); return {}; @@ -7516,7 +7520,7 @@ template using ResultOf_t = typename std::result_of::type; // invoke and not return void :( template CompleteType_t> complete_invoke( - Fun &&fun, Args &&... args) + Fun &&fun, Args &&...args) { return CompleteInvoker>::invoke( std::forward(fun), std::forward(args)...); @@ -7683,7 +7687,7 @@ private: }; struct do_nothing { - void operator()() const {} + void operator()() const { } }; template @@ -7802,7 +7806,7 @@ namespace Catch { namespace Benchmark { namespace Detail { template -TimingOf measure(Fun &&fun, Args &&... args) +TimingOf measure(Fun &&fun, Args &&...args) { auto start = Clock::now(); auto &&r = Detail::complete_invoke(fun, std::forward(args)...); @@ -8153,8 +8157,7 @@ EnvironmentEstimate> estimate_clock_cost( volatile auto ignored = Clock::now(); (void)ignored; } - }) - .elapsed; + }).elapsed; }; time_clock(1); int iters = clock_cost_estimation_iterations; @@ -8442,7 +8445,7 @@ template struct ObjectStorage { ~ObjectStorage() { destruct_on_exit(); } - template void construct(Args &&... args) + template void construct(Args &&...args) { new (&data) T(std::forward(args)...); } @@ -10082,7 +10085,7 @@ public: return m_tokenBuffer.front(); } - auto operator-> () const -> Token const * + auto operator->() const -> Token const * { assert(!m_tokenBuffer.empty()); return &m_tokenBuffer.front(); @@ -11380,7 +11383,7 @@ struct IColourImpl { }; struct NoColourImpl : IColourImpl { - void use(Colour::Code) override {} + void use(Colour::Code) override { } static IColourImpl *instance() { @@ -11868,7 +11871,8 @@ void formatReconstructedExpression(std::ostream &os, std::string const &lhs, namespace Catch { #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && \ !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) -[[noreturn]] void throw_exception(std::exception const &e) { +[[noreturn]] void throw_exception(std::exception const &e) +{ Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n" << "The message was: " << e.what() << '\n'; @@ -11881,8 +11885,10 @@ namespace Catch { throw_exception(std::logic_error(msg)); } -[[noreturn]] void throw_domain_error( - std::string const &msg) { throw_exception(std::domain_error(msg)); } +[[noreturn]] void throw_domain_error(std::string const &msg) +{ + throw_exception(std::domain_error(msg)); +} [[noreturn]] void throw_runtime_error(std::string const &msg) { @@ -11925,7 +11931,7 @@ std::vector parseEnums(StringRef enums); namespace Catch { -IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {} +IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() { } namespace Detail { @@ -11954,7 +11960,7 @@ std::vector parseEnums(StringRef enums) return parsed; } -EnumInfo::~EnumInfo() {} +EnumInfo::~EnumInfo() { } StringRef EnumInfo::lookup(int value) const { @@ -12033,7 +12039,7 @@ private: namespace Catch { -ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {} +ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() { } void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator *translator) @@ -12278,7 +12284,7 @@ char FatalConditionHandler::altStackMem[sigStackSize] = {}; #else namespace Catch { -void FatalConditionHandler::reset() {} +void FatalConditionHandler::reset() { } } #endif // signals/SEH handling @@ -12294,13 +12300,13 @@ void FatalConditionHandler::reset() {} namespace Catch { -IGeneratorTracker::~IGeneratorTracker() {} +IGeneratorTracker::~IGeneratorTracker() { } const char *GeneratorException::what() const noexcept { return m_msg; } namespace Generators { -GeneratorUntypedBase::~GeneratorUntypedBase() {} +GeneratorUntypedBase::~GeneratorUntypedBase() { } auto acquireGeneratorTracker(SourceLineInfo const &lineInfo) -> IGeneratorTracker & @@ -12496,7 +12502,7 @@ TestRunStats::TestRunStats( TestRunStats::~TestRunStats() = default; -void IStreamingReporter::fatalErrorEncountered(StringRef) {} +void IStreamingReporter::fatalErrorEncountered(StringRef) { } bool IStreamingReporter::isMulti() const { return false; } IReporterFactory::~IReporterFactory() = default; @@ -12539,7 +12545,7 @@ LeakDetector::LeakDetector() #else -Catch::LeakDetector::LeakDetector() {} +Catch::LeakDetector::LeakDetector() { } #endif @@ -14145,7 +14151,7 @@ struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker { m_generator = std::move(generator); } }; -GeneratorTracker::~GeneratorTracker() {} +GeneratorTracker::~GeneratorTracker() { } } RunContext::RunContext( @@ -15056,8 +15062,8 @@ int Session::runInternal() // the return value to 255 prevents false negative when some multiple // of 256 tests has failed return (std::min)(MaxExitCode, - (std::max)( - totals.error, static_cast(totals.assertions.failed))); + (std::max)(totals.error, + static_cast(totals.assertions.failed))); } #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) catch (std::exception &ex) @@ -15086,7 +15092,7 @@ static auto getSingletons() -> std::vector *& } } -ISingleton::~ISingleton() {} +ISingleton::~ISingleton() { } void addSingleton(ISingleton *singleton) { @@ -15519,7 +15525,7 @@ RegistrarForTagAliases::RegistrarForTagAliases( namespace Catch { -TagAliasRegistry::~TagAliasRegistry() {} +TagAliasRegistry::~TagAliasRegistry() { } TagAlias const *TagAliasRegistry::find(std::string const &alias) const { @@ -15562,7 +15568,7 @@ void TagAliasRegistry::add(std::string const &alias, std::string const &tag, << "\tRedefined at: " << lineInfo); } -ITagAliasRegistry::~ITagAliasRegistry() {} +ITagAliasRegistry::~ITagAliasRegistry() { } ITagAliasRegistry const &ITagAliasRegistry::get() { @@ -17428,7 +17434,7 @@ std::set TestEventListenerBase::getSupportedVerbosities() return {Verbosity::Quiet, Verbosity::Normal, Verbosity::High}; } -void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} +void TestEventListenerBase::assertionStarting(AssertionInfo const &) { } bool TestEventListenerBase::assertionEnded(AssertionStats const &) { @@ -17702,7 +17708,7 @@ void CompactReporter::noMatchingTestCases(std::string const &spec) stream << "No test cases matched '" << spec << '\'' << std::endl; } -void CompactReporter::assertionStarting(AssertionInfo const &) {} +void CompactReporter::assertionStarting(AssertionInfo const &) { } bool CompactReporter::assertionEnded(AssertionStats const &_assertionStats) { @@ -17739,7 +17745,7 @@ void CompactReporter::testRunEnded(TestRunStats const &_testRunStats) StreamingReporterBase::testRunEnded(_testRunStats); } -CompactReporter::~CompactReporter() {} +CompactReporter::~CompactReporter() { } CATCH_REGISTER_REPORTER("compact", CompactReporter) @@ -18156,7 +18162,7 @@ void ConsoleReporter::reportInvalidArguments(std::string const &arg) stream << "Invalid Filter: " << arg << std::endl; } -void ConsoleReporter::assertionStarting(AssertionInfo const &) {} +void ConsoleReporter::assertionStarting(AssertionInfo const &) { } bool ConsoleReporter::assertionEnded(AssertionStats const &_assertionStats) { @@ -18571,7 +18577,7 @@ JunitReporter::JunitReporter(ReporterConfig const &_config) m_reporterPrefs.shouldReportAllAssertions = true; } -JunitReporter::~JunitReporter() {} +JunitReporter::~JunitReporter() { } std::string JunitReporter::getDescription() { @@ -18579,7 +18585,7 @@ std::string JunitReporter::getDescription() "junitreport target"; } -void JunitReporter::noMatchingTestCases(std::string const & /*spec*/) {} +void JunitReporter::noMatchingTestCases(std::string const & /*spec*/) { } void JunitReporter::testRunStarting(TestRunInfo const &runInfo) { @@ -19063,7 +19069,7 @@ void XmlReporter::sectionStarting(SectionInfo const §ionInfo) } } -void XmlReporter::assertionStarting(AssertionInfo const &) {} +void XmlReporter::assertionStarting(AssertionInfo const &) { } bool XmlReporter::assertionEnded(AssertionStats const &assertionStats) { diff --git a/tests/t00002/t00002.cc b/tests/t00002/t00002.cc index 6a8b92dd..6eb8a5de 100644 --- a/tests/t00002/t00002.cc +++ b/tests/t00002/t00002.cc @@ -11,12 +11,12 @@ public: class B : public A { public: - virtual void foo_a() override {} + virtual void foo_a() override { } }; class C : public A { public: - virtual void foo_c() override {} + virtual void foo_c() override { } }; class D : public B, public C { diff --git a/tests/t00003/t00003.cc b/tests/t00003/t00003.cc index b63fd7bb..1820dc1c 100644 --- a/tests/t00003/t00003.cc +++ b/tests/t00003/t00003.cc @@ -15,9 +15,9 @@ public: A(const A &) = default; virtual ~A() = default; - void basic_method() {} + void basic_method() { } static int static_method() { return 0; } - void const_method() const {} + void const_method() const { } auto auto_method() { return 1; } auto double_int(const int i) { return 2 * i; } @@ -37,7 +37,7 @@ public: static const auto auto_member{10UL}; protected: - void protected_method() {} + void protected_method() { } int protected_member; @@ -46,7 +46,7 @@ protected: }; private: - void private_method() {} + void private_method() { } int private_member; int a, b, c; diff --git a/tests/t00004/t00004.cc b/tests/t00004/t00004.cc index 22be0004..3216ba7a 100644 --- a/tests/t00004/t00004.cc +++ b/tests/t00004/t00004.cc @@ -3,7 +3,7 @@ namespace t00004 { class A { public: - void foo() const {} + void foo() const { } class AA { public: @@ -13,7 +13,7 @@ public: }; }; - void foo2() const {} + void foo2() const { } }; } } diff --git a/tests/t00011/t00011.cc b/tests/t00011/t00011.cc index 20f9de5a..ea9bcb2d 100644 --- a/tests/t00011/t00011.cc +++ b/tests/t00011/t00011.cc @@ -14,7 +14,7 @@ template class D { class A { private: - void foo() {} + void foo() { } friend class B; friend class external::C; // TODO diff --git a/tests/t00013/t00013.cc b/tests/t00013/t00013.cc index dc8ca465..d96d0e84 100644 --- a/tests/t00013/t00013.cc +++ b/tests/t00013/t00013.cc @@ -27,7 +27,7 @@ class R; struct D { int d; - void print(R *r) {} + void print(R *r) { } }; template struct E { diff --git a/tests/t00015/t00015.cc b/tests/t00015/t00015.cc index a7762cac..736eb9ff 100644 --- a/tests/t00015/t00015.cc +++ b/tests/t00015/t00015.cc @@ -8,7 +8,8 @@ class A { } namespace ns2_v0_9_0 { -class [[deprecated]] A {}; +class [[deprecated]] A { +}; } namespace { diff --git a/tests/t00021/t00021.cc b/tests/t00021/t00021.cc index c3aaa1c4..0a338a12 100644 --- a/tests/t00021/t00021.cc +++ b/tests/t00021/t00021.cc @@ -15,20 +15,20 @@ public: class Visitor1 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Visitor2 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Visitor3 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Item { @@ -39,12 +39,12 @@ public: class A : public Item { public: - void accept(const Visitor &visitor) const override {} + void accept(const Visitor &visitor) const override { } }; class B : public Item { public: - void accept(const Visitor &visitor) const override {} + void accept(const Visitor &visitor) const override { } }; } } diff --git a/tests/t00022/t00022.cc b/tests/t00022/t00022.cc index 2e26ace2..d226c4db 100644 --- a/tests/t00022/t00022.cc +++ b/tests/t00022/t00022.cc @@ -18,14 +18,14 @@ protected: class A1 : public A { protected: - void method1() override {} - void method2() override {} + void method1() override { } + void method2() override { } }; class A2 : public A { protected: - void method1() override {} - void method2() override {} + void method1() override { } + void method2() override { } }; } } diff --git a/tests/t00023/t00023.cc b/tests/t00023/t00023.cc index ac990ba5..3d3cdd94 100644 --- a/tests/t00023/t00023.cc +++ b/tests/t00023/t00023.cc @@ -11,17 +11,17 @@ public: class StrategyA : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class StrategyB : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class StrategyC : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class Context { diff --git a/tests/t00024/t00024.cc b/tests/t00024/t00024.cc index b22bb5c9..d082aee8 100644 --- a/tests/t00024/t00024.cc +++ b/tests/t00024/t00024.cc @@ -13,14 +13,14 @@ public: class Target1 : public Target { public: - void m1() override {} - void m2() override {} + void m1() override { } + void m2() override { } }; class Target2 : public Target { public: - void m1() override {} - void m2() override {} + void m1() override { } + void m2() override { } }; class Proxy : public Target { diff --git a/tests/t00025/t00025.cc b/tests/t00025/t00025.cc index c31ee5a8..091b8185 100644 --- a/tests/t00025/t00025.cc +++ b/tests/t00025/t00025.cc @@ -5,14 +5,14 @@ namespace t00025 { class Target1 { public: - void m1() {} - void m2() {} + void m1() { } + void m2() { } }; class Target2 { public: - void m1() {} - void m2() {} + void m1() { } + void m2() { } }; template class Proxy { diff --git a/tests/t00027/t00027.cc b/tests/t00027/t00027.cc index 379a100d..7f0ea89c 100644 --- a/tests/t00027/t00027.cc +++ b/tests/t00027/t00027.cc @@ -16,7 +16,7 @@ class Line : public Shape, public T>... { public: void display() override { - std::apply([](auto &&... x) { (x.display(), ...); }, + std::apply([](auto &&...x) { (x.display(), ...); }, std::forward_as_tuple(T>()...)); } }; @@ -26,7 +26,7 @@ class Text : public Shape, public T>... { public: void display() override { - std::apply([](auto &&... x) { (x.display(), ...); }, + std::apply([](auto &&...x) { (x.display(), ...); }, std::forward_as_tuple(T>()...)); } }; @@ -37,12 +37,12 @@ struct ShapeDecorator { template class Color : public ShapeDecorator { public: - void display() override {} + void display() override { } }; template class Weight : public ShapeDecorator { public: - void display() override {} + void display() override { } }; struct Window { diff --git a/tests/t20001/t20001.cc b/tests/t20001/t20001.cc index 2523199b..18878c11 100644 --- a/tests/t20001/t20001.cc +++ b/tests/t20001/t20001.cc @@ -13,7 +13,7 @@ struct C { class A { public: - A() {} + A() { } int add(int x, int y) { return m_c.add(x, y); } @@ -28,7 +28,7 @@ public: return res; } - void log_result(int r) {} + void log_result(int r) { } private: detail::C m_c{}; From beeb6211408f85b58d3a3f85206bcce8fd5b2e1a Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 23:48:37 +0200 Subject: [PATCH 4/6] Updated test cases documentation --- docs/test_cases/t00002.md | 4 ++-- docs/test_cases/t00003.md | 8 ++++---- docs/test_cases/t00004.md | 4 ++-- docs/test_cases/t00011.md | 2 +- docs/test_cases/t00013.md | 2 +- docs/test_cases/t00015.md | 3 ++- docs/test_cases/t00021.md | 16 ++++++++-------- docs/test_cases/t00022.md | 8 ++++---- docs/test_cases/t00023.md | 6 +++--- docs/test_cases/t00024.md | 8 ++++---- docs/test_cases/t00025.md | 8 ++++---- docs/test_cases/t00027.md | 8 ++++---- docs/test_cases/t20001.md | 4 ++-- 13 files changed, 41 insertions(+), 40 deletions(-) diff --git a/docs/test_cases/t00002.md b/docs/test_cases/t00002.md index 5adadd4d..1e3b2ca5 100644 --- a/docs/test_cases/t00002.md +++ b/docs/test_cases/t00002.md @@ -34,12 +34,12 @@ public: class B : public A { public: - virtual void foo_a() override {} + virtual void foo_a() override { } }; class C : public A { public: - virtual void foo_c() override {} + virtual void foo_c() override { } }; class D : public B, public C { diff --git a/docs/test_cases/t00003.md b/docs/test_cases/t00003.md index 2b0e8783..299fb8b1 100644 --- a/docs/test_cases/t00003.md +++ b/docs/test_cases/t00003.md @@ -35,9 +35,9 @@ public: A(const A &) = default; virtual ~A() = default; - void basic_method() {} + void basic_method() { } static int static_method() { return 0; } - void const_method() const {} + void const_method() const { } auto auto_method() { return 1; } auto double_int(const int i) { return 2 * i; } @@ -57,7 +57,7 @@ public: static const auto auto_member{10UL}; protected: - void protected_method() {} + void protected_method() { } int protected_member; @@ -66,7 +66,7 @@ protected: }; private: - void private_method() {} + void private_method() { } int private_member; int a, b, c; diff --git a/docs/test_cases/t00004.md b/docs/test_cases/t00004.md index 2a8bf99d..a6f84008 100644 --- a/docs/test_cases/t00004.md +++ b/docs/test_cases/t00004.md @@ -25,7 +25,7 @@ namespace t00004 { class A { public: - void foo() const {} + void foo() const { } class AA { public: @@ -35,7 +35,7 @@ public: }; }; - void foo2() const {} + void foo2() const { } }; } } diff --git a/docs/test_cases/t00011.md b/docs/test_cases/t00011.md index ea0560e4..35ce8de0 100644 --- a/docs/test_cases/t00011.md +++ b/docs/test_cases/t00011.md @@ -34,7 +34,7 @@ template class D { class A { private: - void foo() {} + void foo() { } friend class B; friend class external::C; // TODO diff --git a/docs/test_cases/t00013.md b/docs/test_cases/t00013.md index b374935c..c3bc0857 100644 --- a/docs/test_cases/t00013.md +++ b/docs/test_cases/t00013.md @@ -48,7 +48,7 @@ class R; struct D { int d; - void print(R *r) {} + void print(R *r) { } }; template struct E { diff --git a/docs/test_cases/t00015.md b/docs/test_cases/t00015.md index 8c33c9ba..47c773ba 100644 --- a/docs/test_cases/t00015.md +++ b/docs/test_cases/t00015.md @@ -28,7 +28,8 @@ class A { } namespace ns2_v0_9_0 { -class [[deprecated]] A {}; +class [[deprecated]] A { +}; } namespace { diff --git a/docs/test_cases/t00021.md b/docs/test_cases/t00021.md index 32390628..2218a661 100644 --- a/docs/test_cases/t00021.md +++ b/docs/test_cases/t00021.md @@ -35,20 +35,20 @@ public: class Visitor1 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Visitor2 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Visitor3 : public Visitor { public: - void visit_A(const A &item) const override {} - void visit_B(const B &item) const override {} + void visit_A(const A &item) const override { } + void visit_B(const B &item) const override { } }; class Item { @@ -59,12 +59,12 @@ public: class A : public Item { public: - void accept(const Visitor &visitor) const override {} + void accept(const Visitor &visitor) const override { } }; class B : public Item { public: - void accept(const Visitor &visitor) const override {} + void accept(const Visitor &visitor) const override { } }; } } diff --git a/docs/test_cases/t00022.md b/docs/test_cases/t00022.md index b8b9e1b9..15da0671 100644 --- a/docs/test_cases/t00022.md +++ b/docs/test_cases/t00022.md @@ -38,14 +38,14 @@ protected: class A1 : public A { protected: - void method1() override {} - void method2() override {} + void method1() override { } + void method2() override { } }; class A2 : public A { protected: - void method1() override {} - void method2() override {} + void method1() override { } + void method2() override { } }; } } diff --git a/docs/test_cases/t00023.md b/docs/test_cases/t00023.md index f8bef705..606e7aa5 100644 --- a/docs/test_cases/t00023.md +++ b/docs/test_cases/t00023.md @@ -31,17 +31,17 @@ public: class StrategyA : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class StrategyB : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class StrategyC : public Strategy { public: - void algorithm() override {} + void algorithm() override { } }; class Context { diff --git a/docs/test_cases/t00024.md b/docs/test_cases/t00024.md index f4266f2e..9d2b1248 100644 --- a/docs/test_cases/t00024.md +++ b/docs/test_cases/t00024.md @@ -33,14 +33,14 @@ public: class Target1 : public Target { public: - void m1() override {} - void m2() override {} + void m1() override { } + void m2() override { } }; class Target2 : public Target { public: - void m1() override {} - void m2() override {} + void m1() override { } + void m2() override { } }; class Proxy : public Target { diff --git a/docs/test_cases/t00025.md b/docs/test_cases/t00025.md index d9cf06dd..de475cf1 100644 --- a/docs/test_cases/t00025.md +++ b/docs/test_cases/t00025.md @@ -25,14 +25,14 @@ namespace t00025 { class Target1 { public: - void m1() {} - void m2() {} + void m1() { } + void m2() { } }; class Target2 { public: - void m1() {} - void m2() {} + void m1() { } + void m2() { } }; template class Proxy { diff --git a/docs/test_cases/t00027.md b/docs/test_cases/t00027.md index b794cfe3..7b9c36a9 100644 --- a/docs/test_cases/t00027.md +++ b/docs/test_cases/t00027.md @@ -36,7 +36,7 @@ class Line : public Shape, public T>... { public: void display() override { - std::apply([](auto &&... x) { (x.display(), ...); }, + std::apply([](auto &&...x) { (x.display(), ...); }, std::forward_as_tuple(T>()...)); } }; @@ -46,7 +46,7 @@ class Text : public Shape, public T>... { public: void display() override { - std::apply([](auto &&... x) { (x.display(), ...); }, + std::apply([](auto &&...x) { (x.display(), ...); }, std::forward_as_tuple(T>()...)); } }; @@ -57,12 +57,12 @@ struct ShapeDecorator { template class Color : public ShapeDecorator { public: - void display() override {} + void display() override { } }; template class Weight : public ShapeDecorator { public: - void display() override {} + void display() override { } }; struct Window { diff --git a/docs/test_cases/t20001.md b/docs/test_cases/t20001.md index d24a578a..18bf4669 100644 --- a/docs/test_cases/t20001.md +++ b/docs/test_cases/t20001.md @@ -43,7 +43,7 @@ struct C { class A { public: - A() {} + A() { } int add(int x, int y) { return m_c.add(x, y); } @@ -58,7 +58,7 @@ public: return res; } - void log_result(int r) {} + void log_result(int r) { } private: detail::C m_c{}; From 1f2d8e24333638eb6e95a33842cf4d3ccd0cb16d Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 23:51:07 +0200 Subject: [PATCH 5/6] Updated test cases documentation --- docs/test_cases.md | 1 + docs/test_cases/t00032.md | 62 +++++++++++++++++++++++++++++++ docs/test_cases/t00032_class.png | Bin 0 -> 25068 bytes tests/test_cases.yaml | 3 ++ 4 files changed, 66 insertions(+) create mode 100644 docs/test_cases/t00032.md create mode 100644 docs/test_cases/t00032_class.png diff --git a/docs/test_cases.md b/docs/test_cases.md index 8f06dcc2..19d605fa 100644 --- a/docs/test_cases.md +++ b/docs/test_cases.md @@ -30,6 +30,7 @@ * [t00029](./test_cases/t00029.md) - PlantUML skip decorator test case * [t00030](./test_cases/t00030.md) - PlantUML relationship decorators test case * [t00031](./test_cases/t00031.md) - PlantUML style decorator test case + * [t00032](./test_cases/t00032.md) - Class template with template base classes test case ## Sequence diagrams * [t20001](./test_cases/t20001.md) - Basic sequence diagram ## Configuration diagrams diff --git a/docs/test_cases/t00032.md b/docs/test_cases/t00032.md new file mode 100644 index 00000000..839b10c7 --- /dev/null +++ b/docs/test_cases/t00032.md @@ -0,0 +1,62 @@ +# t00032 - Class template with template base classes test case +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00032_class: + type: class + glob: + - ../../tests/t00032/t00032.cc + using_namespace: + - clanguml::t00032 + include: + namespaces: + - clanguml::t00032 + +``` +## Source code +File t00032.cc +```cpp +#include +#include + +namespace clanguml { +namespace t00032 { + +struct Base { +}; + +struct TBase { +}; + +struct A { + void operator()() { } +}; + +struct B { + void operator()() { } +}; + +struct C { + void operator()() { } +}; + +template +struct Overload : public Base, public T, public Ts... { + using Ts::operator()...; + L counter; +}; + +template Overload(Ts...) -> Overload; + +struct R { + Overload overload; +}; + +} // namespace t00032 +} // namespace clanguml + +``` +## Generated UML diagrams +![t00032_class](./t00032_class.png "Class template with template base classes test case") diff --git a/docs/test_cases/t00032_class.png b/docs/test_cases/t00032_class.png new file mode 100644 index 0000000000000000000000000000000000000000..a8dd3edb0a8ca838275d2932f0d487134233903a GIT binary patch literal 25068 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ᗎ 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 literal 0 HcmV?d00001 diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index a34689f6..160c327b 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -90,6 +90,9 @@ test_cases: - name: t00031 title: PlantUML style decorator test case description: + - name: t00032 + title: Class template with template base classes test case + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram From 406bcde2b5bfe6704b80c29bfcc035579131d264 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 3 Aug 2021 23:54:29 +0200 Subject: [PATCH 6/6] Updated README --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 9e78e252..e253dd24 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,17 @@ The following decorators are currently supported: - [aggregation](docs/test_cases/t00030.md) - document the property as aggregation - [style](docs/test_cases/t00031.md) - add PlantUML style to a C++ entity +##### Doxygen integration +`clang-uml` can be omitted completed in ![Doxygen](https://www.doxygen.nl/index.html), by adding the following +lines to the Doxygen config file: + +``` +ALIASES += clanguml="" +ALIASES += clanguml{1}="" +ALIASES += clanguml{2}="" +ALIASES += clanguml{3}="" +``` + ### Sequence diagrams #### Example