From b99a82554a6f040558581b54459620e544b9c9ba Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 24 Jul 2021 20:57:20 +0200 Subject: [PATCH] Added missing test case docs --- README.md | 2 +- docs/test_cases/t00018.md | 136 +++++++++++++++++++++++++++++++ docs/test_cases/t00018_class.png | Bin 0 -> 13317 bytes 3 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 docs/test_cases/t00018.md create mode 100644 docs/test_cases/t00018_class.png diff --git a/README.md b/README.md index d51a3582..453599e0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![linux build](https://github.com/bkryza/clang-uml/actions/workflows/build.yml/badge.svg) -`clang-uml` is an automatic !(PlantUML)[https://plantuml.com/] class and sequence +`clang-uml` is an automatic ![PlantUML](https://plantuml.com/) class and sequence diagram generator, driven by YAML configuration files. The main idea behind the project is to easily maintain up-to-date diagrams within a code-base or document existing project code. The configuration file or files for `clang-uml` define the diff --git a/docs/test_cases/t00018.md b/docs/test_cases/t00018.md new file mode 100644 index 00000000..760615a8 --- /dev/null +++ b/docs/test_cases/t00018.md @@ -0,0 +1,136 @@ +# t00018 - Pimpl pattern +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00018_class: + type: class + glob: + - ../../tests/t00018/**.h + - ../../tests/t00018/**.cc + using_namespace: + - clanguml::t00018 + include: + namespaces: + - clanguml::t00018 + +``` +## Source code +File t00018_impl.h +```cpp +#pragma once + +#include "t00018.h" + +namespace clanguml { +namespace t00018 { +namespace impl { + +class widget { + int n; + +public: + void draw(const clanguml::t00018::widget &w) const; + void draw(const clanguml::t00018::widget &w); + widget(int n); +}; +} +} +} + +``` +File t00018.h +```cpp +#pragma once + +#include +#include +#include + +namespace clanguml { +namespace t00018 { + +namespace impl { +class widget; +} + +// Pimpl example based on https://en.cppreference.com/w/cpp/language/pimpl +class widget { + std::unique_ptr pImpl; + +public: + void draw() const; + void draw(); + bool shown() const { return true; } + widget(int); + ~widget(); + + widget(widget &&); + + widget(const widget &) = delete; + widget &operator=(widget &&); + widget &operator=(const widget &) = delete; +}; +} +} + +``` +File t00018.cc +```cpp +#include "t00018.h" +#include "t00018_impl.h" + +namespace clanguml { +namespace t00018 { + +void widget::draw() const { pImpl->draw(*this); } + +void widget::draw() { pImpl->draw(*this); } + +widget::widget(int n) + : pImpl{std::make_unique(n)} +{ +} + +widget::widget(widget &&) = default; + +widget::~widget() = default; + +widget &widget::operator=(widget &&) = default; +} +} + +``` +File t00018_impl.cc +```cpp +#include "t00018_impl.h" +#include "t00018.h" + +namespace clanguml { +namespace t00018 { +namespace impl { + +widget::widget(int n) + : n(n) +{ +} + +void widget::draw(const clanguml::t00018::widget &w) const +{ + if (w.shown()) + std::cout << "drawing a const widget " << n << '\n'; +} + +void widget::draw(const clanguml::t00018::widget &w) +{ + if (w.shown()) + std::cout << "drawing a non-const widget " << n << '\n'; +} +} +} +} + +``` +## Generated UML diagrams +![t00018_class](./t00018_class.png "Pimpl pattern") diff --git a/docs/test_cases/t00018_class.png b/docs/test_cases/t00018_class.png new file mode 100644 index 0000000000000000000000000000000000000000..a5911e01a0cc1d4e2287ae7ba258244c17cd2c6d GIT binary patch literal 13317 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