From 16e60ec8c50ac1ba12d9de0fe35dd773463606e1 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 25 Jul 2021 22:19:00 +0200 Subject: [PATCH] Added template memento pattern --- docs/test_cases.md | 1 + docs/test_cases/t00026.md | 83 +++++++++++++++++++++++++++++++ docs/test_cases/t00026_class.png | Bin 0 -> 32978 bytes tests/t00026/.clanguml | 12 +++++ tests/t00026/t00026.cc | 58 +++++++++++++++++++++ tests/t00026/test_case.h | 54 ++++++++++++++++++++ tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 ++ 8 files changed, 212 insertions(+) create mode 100644 docs/test_cases/t00026.md create mode 100644 docs/test_cases/t00026_class.png create mode 100644 tests/t00026/.clanguml create mode 100644 tests/t00026/t00026.cc create mode 100644 tests/t00026/test_case.h diff --git a/docs/test_cases.md b/docs/test_cases.md index 9f87eca0..e4da3ba2 100644 --- a/docs/test_cases.md +++ b/docs/test_cases.md @@ -24,6 +24,7 @@ * [t00023](./test_cases/t00023.md) - Strategy pattern * [t00024](./test_cases/t00024.md) - Proxy pattern * [t00025](./test_cases/t00025.md) - Template proxy pattern + * [t00026](./test_cases/t00026.md) - Template memento pattern ## Sequence diagrams * [t20001](./test_cases/t20001.md) - Basic sequence diagram ## Configuration diagrams diff --git a/docs/test_cases/t00026.md b/docs/test_cases/t00026.md new file mode 100644 index 00000000..fece16cc --- /dev/null +++ b/docs/test_cases/t00026.md @@ -0,0 +1,83 @@ +# t00026 - Template memento pattern +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00026_class: + type: class + glob: + - ../../tests/t00026/t00026.cc + using_namespace: + - clanguml::t00026 + include: + namespaces: + - clanguml::t00026 + +``` +## Source code +File t00026.cc +```cpp +#include +#include +#include + +namespace clanguml { +namespace t00026 { + +template class Memento { +public: + Memento(T &&v) + : m_value(std::forward(v)) + { + } + + T value() const { return m_value; } + +private: + T m_value; +}; + +template class Originator { +public: + Originator(T &&v) + : m_value(std::forward(v)) + { + } + + Memento memoize_value() const { return Memento{m_value}; } + + void load(const Memento &m) { m_value = m.value(); } + + void print() const { std::cout << m_value << std::endl; } + + void set(T &&v) { m_value = std::forward(v); } + +private: + T m_value; +}; + +template class Caretaker { +public: + Memento &state(const std::string &n) { return m_mementos.at(n); } + + void set_state(const std::string &s, Memento &&m) + { + m_mementos.try_emplace(s, std::move(m)); + } + +private: + std::unordered_map> m_mementos; +}; + +struct StringMemento { + Caretaker caretaker; + Originator originator; +}; + +} +} + +``` +## Generated UML diagrams +![t00026_class](./t00026_class.png "Template memento pattern") diff --git a/docs/test_cases/t00026_class.png b/docs/test_cases/t00026_class.png new file mode 100644 index 0000000000000000000000000000000000000000..45dc0e979c3c61653db012a3da2bbf8da3188aa2 GIT binary patch literal 32978 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 aXP)j7T{*#L?v%HGlN6PEQ6Q}6^Zx +#include +#include + +namespace clanguml { +namespace t00026 { + +template class Memento { +public: + Memento(T &&v) + : m_value(std::forward(v)) + { + } + + T value() const { return m_value; } + +private: + T m_value; +}; + +template class Originator { +public: + Originator(T &&v) + : m_value(std::forward(v)) + { + } + + Memento memoize_value() const { return Memento{m_value}; } + + void load(const Memento &m) { m_value = m.value(); } + + void print() const { std::cout << m_value << std::endl; } + + void set(T &&v) { m_value = std::forward(v); } + +private: + T m_value; +}; + +template class Caretaker { +public: + Memento &state(const std::string &n) { return m_mementos.at(n); } + + void set_state(const std::string &s, Memento &&m) + { + m_mementos.try_emplace(s, std::move(m)); + } + +private: + std::unordered_map> m_mementos; +}; + +struct StringMemento { + Caretaker caretaker; + Originator originator; +}; +} +} diff --git a/tests/t00026/test_case.h b/tests/t00026/test_case.h new file mode 100644 index 00000000..4dc8892c --- /dev/null +++ b/tests/t00026/test_case.h @@ -0,0 +1,54 @@ +/** + * tests/t00026/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("t00026", "[test-case][class]") +{ + auto [config, db] = load_config("t00026"); + + auto diagram = config.diagrams["t00026_class"]; + + REQUIRE(diagram->name == "t00026_class"); + + REQUIRE(diagram->include.namespaces.size() == 1); + REQUIRE_THAT(diagram->include.namespaces, + VectorContains(std::string{"clanguml::t00026"})); + + REQUIRE(diagram->exclude.namespaces.size() == 0); + + REQUIRE(diagram->should_include("clanguml::t00026::A")); + + auto model = generate_class_diagram(db, diagram); + + REQUIRE(model.name == "t00026_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, IsClassTemplate("Memento", "T")); + REQUIRE_THAT(puml, IsClassTemplate("Originator", "T")); + REQUIRE_THAT(puml, IsClassTemplate("Caretaker", "T")); + REQUIRE_THAT(puml, + IsInstantiation(_A("Originator"), _A("Originator"))); + REQUIRE_THAT(puml, + IsInstantiation(_A("Caretaker"), _A("Caretaker"))); + + save_puml( + "./" + config.output_directory + "/" + diagram->name + ".puml", puml); +} diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 36c830a8..c2140124 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -129,6 +129,7 @@ using namespace clanguml::test::matchers; #include "t00023/test_case.h" #include "t00024/test_case.h" #include "t00025/test_case.h" +#include "t00026/test_case.h" // // Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index ab33058f..72ab5a2f 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -72,6 +72,9 @@ test_cases: - name: t00025 title: Template proxy pattern description: + - name: t00026 + title: Template memento pattern + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram