# t00019 - Layercake pattern ## Config ```yaml compilation_database_dir: .. output_directory: puml diagrams: t00019_class: type: class glob: - ../../tests/t00019/**.cc using_namespace: - clanguml::t00019 include: namespaces: - clanguml::t00019 ``` ## Source code File t00019_layer2.h ```cpp #pragma once namespace clanguml { namespace t00019 { template class Layer2 : public LowerLayer { using LowerLayer::LowerLayer; using LowerLayer::m1; using LowerLayer::m2; int all_calls_count() const { return LowerLayer::m1_calls() + LowerLayer::m2_calls(); } }; } } ``` File t00019_base.h ```cpp #pragma once #include namespace clanguml { namespace t00019 { class Base { Base() = default; virtual ~Base() = default; virtual int m1() { return 2; } virtual std::string m2() { return "two"; } }; } } ``` File t00019_layer1.h ```cpp #pragma once #include #include namespace clanguml { namespace t00019 { template class Layer1 : public LowerLayer { using LowerLayer::LowerLayer; int m1() override { std::cout << "m1 called\n"; return LowerLayer::m1(); } std::string m2() override { std::cout << "m2 called\n"; return LowerLayer::m2(); } }; } } ``` File t00019.cc ```cpp #include "t00019_base.h" #include "t00019_layer1.h" #include "t00019_layer2.h" #include "t00019_layer3.h" #include namespace clanguml { namespace t00019 { class A { public: std::unique_ptr>>> layers; }; } } ``` File t00019_layer3.h ```cpp #pragma once #include namespace clanguml { namespace t00019 { template class Layer3 : public LowerLayer { using LowerLayer::LowerLayer; virtual int m1() override { m_m1_calls++; return LowerLayer::m1(); } virtual std::string m2() override { m_m2_calls++; return LowerLayer::m2(); } int m1_calls() const { return m_m1_calls; } int m2_calls() const { return m_m2_calls; } private: int m_m1_calls{}; int m_m2_calls{}; }; } } ``` ## Generated UML diagrams ![t00019_class](./t00019_class.svg "Layercake pattern")