diff --git a/src/class_diagram/model/class.h b/src/class_diagram/model/class.h index 97b55e19..eb346177 100644 --- a/src/class_diagram/model/class.h +++ b/src/class_diagram/model/class.h @@ -79,6 +79,9 @@ public: bool is_abstract() const; + bool is_concept() const { return is_concept_; } + void is_concept(bool concept_) { is_concept_ = concept_; } + void find_relationships( std::vector> &nested_relationships); @@ -92,6 +95,7 @@ private: bool is_template_instantiation_{false}; bool is_alias_{false}; bool is_union_{false}; + bool is_concept_{false}; std::vector members_; std::vector methods_; std::vector bases_; diff --git a/src/class_diagram/visitor/translation_unit_visitor.h b/src/class_diagram/visitor/translation_unit_visitor.h index d275c2e8..63758ecb 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.h +++ b/src/class_diagram/visitor/translation_unit_visitor.h @@ -83,6 +83,13 @@ public: virtual bool VisitTypeAliasTemplateDecl(clang::TypeAliasTemplateDecl *cls); +// bool TraverseTypeConstraint(const clang::TypeConstraint *C); +// bool TraverseConceptRequirement(clang::concepts::Requirement *R); +// bool TraverseConceptTypeRequirement(clang::concepts::TypeRequirement *R); +// bool TraverseConceptExprRequirement(clang::concepts::ExprRequirement *R); +// bool TraverseConceptNestedRequirement( +// clang::concepts::NestedRequirement *R); + /** * @brief Get diagram model reference * diff --git a/tests/t00056/t00056.cc b/tests/t00056/t00056.cc index 63cccf08..4d40a2e4 100644 --- a/tests/t00056/t00056.cc +++ b/tests/t00056/t00056.cc @@ -1,10 +1,57 @@ +#include + namespace clanguml { namespace t00056 { +// Constraint expression template concept MaxFourBytes = sizeof(T) <= 4; +// Simple requirement +template +concept Iterable = requires(T container) { + container.begin(); + container.end(); + }; + +// Type requirement +template +concept HasValueType = requires { typename T::value_type; }; + +template +concept ConvertibleToString = requires(T s) { std::string{s}; }; + +// Compound requirement +// ... + +// Combined concept +template +concept IterableWithValueType = Iterable && HasValueType; + +template +concept IterableWithSmallValueType = + IterableWithValueType && MaxFourBytes; + +// Simple type constraint template struct A { T a; }; + +// Requires constant expression +template + requires MaxFourBytes +struct B { + T b; +}; + +// Anonymous concept requirement +template + requires requires(T t) { + --t; + t--; + } +struct C { + T c; +}; + } } \ No newline at end of file