# t00026 - Template memento pattern ## Config ```yaml compilation_database_dir: .. output_directory: diagrams 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; }; } // namespace t00026 } // namespace clanguml ``` ## Generated PlantUML diagrams ![t00026_class](./t00026_class.svg "Template memento pattern") ## Generated Mermaid diagrams ![t00026_class](./t00026_class_mermaid.svg "Template memento pattern") ## Generated JSON models ```json { "diagram_type": "class", "elements": [ { "bases": [], "display_name": "clanguml::t00026::Memento", "id": "1241204213727905390", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "m_value", "source_location": { "column": 7, "file": "../../tests/t00026/t00026.cc", "line": 18, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "T" } ], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "Memento", "parameters": [ { "name": "v", "type": "T &&" } ], "source_location": { "column": 5, "file": "../../tests/t00026/t00026.cc", "line": 10, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" }, { "access": "public", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "value", "parameters": [], "source_location": { "column": 7, "file": "../../tests/t00026/t00026.cc", "line": 15, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "T" } ], "name": "Memento", "namespace": "clanguml::t00026", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 8, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00026::Originator", "id": "1324770803720816727", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "m_value", "source_location": { "column": 7, "file": "../../tests/t00026/t00026.cc", "line": 37, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "T" } ], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": true, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "Originator", "parameters": [ { "name": "v", "type": "T &&" } ], "source_location": { "column": 5, "file": "../../tests/t00026/t00026.cc", "line": 23, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" }, { "access": "public", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "memoize_value", "parameters": [], "source_location": { "column": 16, "file": "../../tests/t00026/t00026.cc", "line": 28, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "Memento" }, { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "load", "parameters": [ { "name": "m", "type": "const Memento &" } ], "source_location": { "column": 10, "file": "../../tests/t00026/t00026.cc", "line": 30, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" }, { "access": "public", "is_const": true, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "print", "parameters": [], "source_location": { "column": 10, "file": "../../tests/t00026/t00026.cc", "line": 32, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" }, { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "set", "parameters": [ { "name": "v", "type": "T &&" } ], "source_location": { "column": 10, "file": "../../tests/t00026/t00026.cc", "line": 34, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" } ], "name": "Originator", "namespace": "clanguml::t00026", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 21, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00026::Caretaker", "id": "2032715387182792204", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [ { "access": "private", "is_static": false, "name": "m_mementos", "source_location": { "column": 49, "file": "../../tests/t00026/t00026.cc", "line": 50, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "std::unordered_map>" } ], "methods": [ { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "state", "parameters": [ { "name": "n", "type": "const std::string &" } ], "source_location": { "column": 17, "file": "../../tests/t00026/t00026.cc", "line": 42, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "Memento &" }, { "access": "public", "is_const": false, "is_consteval": false, "is_constexpr": false, "is_constructor": false, "is_copy_assignment": false, "is_defaulted": false, "is_deleted": false, "is_move_assignment": false, "is_noexcept": false, "is_operator": false, "is_pure_virtual": false, "is_static": false, "is_virtual": false, "name": "set_state", "parameters": [ { "name": "s", "type": "const std::string &" }, { "name": "m", "type": "Memento &&" } ], "source_location": { "column": 10, "file": "../../tests/t00026/t00026.cc", "line": 44, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "void" } ], "name": "Caretaker", "namespace": "clanguml::t00026", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 40, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00026::Caretaker", "id": "1708482137721157489", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "Caretaker", "namespace": "clanguml::t00026", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 40, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "std::string" } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00026::Originator", "id": "1014247960805363560", "is_abstract": false, "is_nested": false, "is_struct": false, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "Originator", "namespace": "clanguml::t00026", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 21, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "argument", "template_parameters": [], "type": "std::string" } ], "type": "class" }, { "bases": [], "display_name": "clanguml::t00026::StringMemento", "id": "851750942915129289", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": false, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "caretaker", "source_location": { "column": 28, "file": "../../tests/t00026/t00026.cc", "line": 54, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "Caretaker" }, { "access": "public", "is_static": false, "name": "originator", "source_location": { "column": 29, "file": "../../tests/t00026/t00026.cc", "line": 55, "translation_unit": "../../tests/t00026/t00026.cc" }, "type": "Originator" } ], "methods": [], "name": "StringMemento", "namespace": "clanguml::t00026", "source_location": { "column": 8, "file": "../../tests/t00026/t00026.cc", "line": 53, "translation_unit": "../../tests/t00026/t00026.cc" }, "template_parameters": [], "type": "class" } ], "metadata": { "clang_uml_version": "0.4.1", "llvm_version": "Ubuntu clang version 16.0.6 (++20230710042027+7cbf1a259152-1~exp1~20230710162048.105)", "schema_version": 1 }, "name": "t00026_class", "relationships": [ { "access": "public", "destination": "1241204213727905390", "source": "1324770803720816727", "type": "dependency" }, { "access": "private", "destination": "1241204213727905390", "label": "m_mementos", "source": "2032715387182792204", "type": "aggregation" }, { "access": "public", "destination": "2032715387182792204", "source": "1708482137721157489", "type": "instantiation" }, { "access": "public", "destination": "1324770803720816727", "source": "1014247960805363560", "type": "instantiation" }, { "access": "public", "destination": "1708482137721157489", "label": "caretaker", "source": "851750942915129289", "type": "aggregation" }, { "access": "public", "destination": "1014247960805363560", "label": "originator", "source": "851750942915129289", "type": "aggregation" } ], "using_namespace": "clanguml::t00026" } ```