# t00056 - Basic C++20 concepts test case ## Config ```yaml diagrams: t00056_class: type: class glob: - t00056.cc include: namespaces: - clanguml::t00056 using_namespace: clanguml::t00056 ``` ## Source code File `tests/t00056/t00056.cc` ```cpp #include #include namespace clanguml { namespace t00056 { template concept greater_than_simple = sizeof(T) > sizeof(L); template concept greater_than_with_requires = requires(T l, P r) { sizeof(l) > sizeof(r); }; // Constraint expression template concept max_four_bytes = sizeof(T) <= 4; // Simple requirement template concept iterable = requires(T container) { container.begin(); container.end(); }; // Type requirement template concept has_value_type = requires { typename T::value_type; }; template concept convertible_to_string = max_four_bytes && requires(T s) { std::string{s}; { std::to_string(s) } noexcept; { std::to_string(s) } -> std::same_as; }; // Compound requirement // ... // Combined concept template concept iterable_with_value_type = iterable && has_value_type; template concept iterable_or_small_value_type = iterable_with_value_type || max_four_bytes; // Simple type constraint template struct A { T a; }; // Requires constant expression template requires iterable_or_small_value_type struct B { T b; }; // Anonymous concept requirement (TODO) template requires requires(T t) { --t; t--; } struct C { T c; }; template requires max_four_bytes && max_four_bytes struct D { }; template requires greater_than_with_requires struct E { T1 e1; T2 e2; T3 e3; }; template requires greater_than_simple struct F { T1 f1; T2 f2; T3 f3; }; } } ``` ## Generated PlantUML diagrams ![t00056_class](./t00056_class.svg "Basic C++20 concepts test case") ## Generated Mermaid diagrams ![t00056_class](./t00056_class_mermaid.svg "Basic C++20 concepts test case") ## Generated JSON models ```json { "diagram_type": "class", "elements": [ { "display_name": "greater_than_simple", "id": "7220333570897953632", "name": "greater_than_simple", "namespace": "clanguml::t00056", "parameters": [], "source_location": { "column": 9, "file": "t00056.cc", "line": 8, "translation_unit": "t00056.cc" }, "statements": [], "type": "concept" }, { "display_name": "greater_than_with_requires", "id": "14645732685101884614", "name": "greater_than_with_requires", "namespace": "clanguml::t00056", "parameters": [ { "name": "l", "type": "T" }, { "name": "r", "type": "P" } ], "source_location": { "column": 9, "file": "t00056.cc", "line": 11, "translation_unit": "t00056.cc" }, "statements": [ "sizeof (l) > sizeof (r)" ], "type": "concept" }, { "display_name": "max_four_bytes", "id": "3082044181533866602", "name": "max_four_bytes", "namespace": "clanguml::t00056", "parameters": [], "source_location": { "column": 9, "file": "t00056.cc", "line": 16, "translation_unit": "t00056.cc" }, "statements": [], "type": "concept" }, { "display_name": "iterable", "id": "3140327690817993937", "name": "iterable", "namespace": "clanguml::t00056", "parameters": [ { "name": "container", "type": "T" } ], "source_location": { "column": 9, "file": "t00056.cc", "line": 20, "translation_unit": "t00056.cc" }, "statements": [ "container.begin()", "container.end()" ], "type": "concept" }, { "display_name": "has_value_type", "id": "14803154489810213430", "name": "has_value_type", "namespace": "clanguml::t00056", "parameters": [], "source_location": { "column": 9, "file": "t00056.cc", "line": 27, "translation_unit": "t00056.cc" }, "statements": [ "typename T::value_type" ], "type": "concept" }, { "display_name": "convertible_to_string", "id": "1098439696568435981", "name": "convertible_to_string", "namespace": "clanguml::t00056", "parameters": [ { "name": "s", "type": "T" } ], "source_location": { "column": 9, "file": "t00056.cc", "line": 30, "translation_unit": "t00056.cc" }, "statements": [ "std::string{s}", "{std::to_string(s)} noexcept", "{std::to_string(s)} -> std::same_as" ], "type": "concept" }, { "display_name": "iterable_with_value_type", "id": "8347184497174008159", "name": "iterable_with_value_type", "namespace": "clanguml::t00056", "parameters": [], "source_location": { "column": 9, "file": "t00056.cc", "line": 46, "translation_unit": "t00056.cc" }, "statements": [], "type": "concept" }, { "display_name": "iterable_or_small_value_type", "id": "6930764924409789751", "name": "iterable_or_small_value_type", "namespace": "clanguml::t00056", "parameters": [], "source_location": { "column": 9, "file": "t00056.cc", "line": 49, "translation_unit": "t00056.cc" }, "statements": [], "type": "concept" }, { "bases": [], "display_name": "A", "id": "11346667996363373290", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "a", "source_location": { "column": 7, "file": "t00056.cc", "line": 54, "translation_unit": "t00056.cc" }, "type": "T" } ], "methods": [], "name": "A", "namespace": "clanguml::t00056", "source_location": { "column": 36, "file": "t00056.cc", "line": 53, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "B", "id": "14514843974519823043", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "b", "source_location": { "column": 7, "file": "t00056.cc", "line": 61, "translation_unit": "t00056.cc" }, "type": "T" } ], "methods": [], "name": "B", "namespace": "clanguml::t00056", "source_location": { "column": 8, "file": "t00056.cc", "line": 60, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "C", "id": "12100945585932392719", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "c", "source_location": { "column": 7, "file": "t00056.cc", "line": 71, "translation_unit": "t00056.cc" }, "type": "T" } ], "methods": [], "name": "C", "namespace": "clanguml::t00056", "source_location": { "column": 8, "file": "t00056.cc", "line": 70, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "D", "id": "13080876813041584751", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [], "methods": [], "name": "D", "namespace": "clanguml::t00056", "source_location": { "column": 8, "file": "t00056.cc", "line": 76, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T1", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T2", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T3", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T4", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T5", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "E", "id": "11433806415564968716", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "e1", "source_location": { "column": 8, "file": "t00056.cc", "line": 81, "translation_unit": "t00056.cc" }, "type": "T1" }, { "access": "public", "is_static": false, "name": "e2", "source_location": { "column": 8, "file": "t00056.cc", "line": 82, "translation_unit": "t00056.cc" }, "type": "T2" }, { "access": "public", "is_static": false, "name": "e3", "source_location": { "column": 8, "file": "t00056.cc", "line": 83, "translation_unit": "t00056.cc" }, "type": "T3" } ], "methods": [], "name": "E", "namespace": "clanguml::t00056", "source_location": { "column": 8, "file": "t00056.cc", "line": 80, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T1", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T2", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T3", "template_parameters": [] } ], "type": "class" }, { "bases": [], "display_name": "F", "id": "6850408983780368279", "is_abstract": false, "is_nested": false, "is_struct": true, "is_template": true, "is_union": false, "members": [ { "access": "public", "is_static": false, "name": "f1", "source_location": { "column": 8, "file": "t00056.cc", "line": 89, "translation_unit": "t00056.cc" }, "type": "T1" }, { "access": "public", "is_static": false, "name": "f2", "source_location": { "column": 8, "file": "t00056.cc", "line": 90, "translation_unit": "t00056.cc" }, "type": "T2" }, { "access": "public", "is_static": false, "name": "f3", "source_location": { "column": 8, "file": "t00056.cc", "line": 91, "translation_unit": "t00056.cc" }, "type": "T3" } ], "methods": [], "name": "F", "namespace": "clanguml::t00056", "source_location": { "column": 8, "file": "t00056.cc", "line": 88, "translation_unit": "t00056.cc" }, "template_parameters": [ { "is_variadic": false, "kind": "template_type", "name": "T1", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T2", "template_parameters": [] }, { "is_variadic": false, "kind": "template_type", "name": "T3", "template_parameters": [] } ], "type": "class" } ], "name": "t00056_class", "package_type": "namespace", "relationships": [ { "destination": "3082044181533866602", "label": "T", "source": "1098439696568435981", "type": "constraint" }, { "destination": "3140327690817993937", "label": "T", "source": "8347184497174008159", "type": "constraint" }, { "destination": "14803154489810213430", "label": "T", "source": "8347184497174008159", "type": "constraint" }, { "destination": "8347184497174008159", "label": "T", "source": "6930764924409789751", "type": "constraint" }, { "destination": "3082044181533866602", "label": "T", "source": "6930764924409789751", "type": "constraint" }, { "destination": "3082044181533866602", "label": "T", "source": "11346667996363373290", "type": "constraint" }, { "destination": "6930764924409789751", "label": "T", "source": "14514843974519823043", "type": "constraint" }, { "destination": "1098439696568435981", "label": "T", "source": "12100945585932392719", "type": "constraint" }, { "destination": "3140327690817993937", "label": "T1", "source": "13080876813041584751", "type": "constraint" }, { "destination": "3140327690817993937", "label": "T3", "source": "13080876813041584751", "type": "constraint" }, { "destination": "3082044181533866602", "label": "T2", "source": "13080876813041584751", "type": "constraint" }, { "destination": "3082044181533866602", "label": "T5", "source": "13080876813041584751", "type": "constraint" }, { "destination": "14645732685101884614", "label": "T1,T3", "source": "11433806415564968716", "type": "constraint" }, { "destination": "7220333570897953632", "label": "T1,T3", "source": "6850408983780368279", "type": "constraint" } ], "using_namespace": "clanguml::t00056" } ```