diff --git a/.gitignore b/.gitignore index 6814e7fc..b474bd93 100644 --- a/.gitignore +++ b/.gitignore @@ -18,9 +18,10 @@ bin/ /debug/ /release/ /.cache +docs/diagrams # CLion .idea/ -cmake-build-debug/ \ No newline at end of file +cmake-build-debug/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 1840e13d..47b8262c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ add_library(clang-umllib OBJECT ${SOURCES}) add_executable(clang-uml ${MAIN_SOURCE_FILE}) install(TARGETS clang-uml DESTINATION ${CLANG_UML_INSTALL_BIN_DIR}) target_link_libraries(clang-uml ${LIBCLANG_LIBRARIES} ${YAML_CPP_LIBRARIES} spdlog::spdlog cppast clang-umllib) +target_compile_features(clang-uml PRIVATE cxx_std_17) install( FILES diff --git a/src/common/model/element.cc b/src/common/model/element.cc index 5a83a2d2..a211bb19 100644 --- a/src/common/model/element.cc +++ b/src/common/model/element.cc @@ -44,8 +44,7 @@ void element::add_relationship(relationship &&cr) LOG_DBG("Adding relationship: '{}' - {} - '{}'", cr.destination(), to_string(cr.type()), full_name(true)); - auto it = std::find(relationships_.begin(), relationships_.end(), cr); - if (it == relationships_.end()) + if (!util::contains(relationships_, cr)) relationships_.emplace_back(std::move(cr)); } diff --git a/src/main.cc b/src/main.cc index 30da821e..b7691ad1 100644 --- a/src/main.cc +++ b/src/main.cc @@ -82,9 +82,7 @@ int main(int argc, const char *argv[]) for (const auto &[name, diagram] : config.diagrams) { // If there are any specific diagram names provided on the command line, // and this diagram is not in that list - skip it - if (!diagram_names.empty() && - std::find(diagram_names.begin(), diagram_names.end(), name) == - diagram_names.end()) + if (!diagram_names.empty() && !util::contains(diagram_names, name)) continue; using clanguml::config::class_diagram; diff --git a/src/package_diagram/model/package.cc b/src/package_diagram/model/package.cc index aebeb79d..719689ae 100644 --- a/src/package_diagram/model/package.cc +++ b/src/package_diagram/model/package.cc @@ -34,7 +34,7 @@ std::string package::full_name(bool relative) const auto ns = using_namespaces(); if (relative && (fn.size() >= ns.size())) { - if (starts_with(fn, ns)) + if (util::starts_with(fn, ns)) fn = std::vector(fn.begin() + ns.size(), fn.end()); } diff --git a/src/package_diagram/model/package.h b/src/package_diagram/model/package.h index eec76aca..50bc54ab 100644 --- a/src/package_diagram/model/package.h +++ b/src/package_diagram/model/package.h @@ -37,7 +37,7 @@ class package_trait { public: void add_package(std::unique_ptr p) { - if (!contains(packages_, p.get())) + if (!util::contains(packages_, p.get())) packages_.emplace_back(std::move(p)); } diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index affc47a1..88086760 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -97,11 +97,11 @@ void translation_unit_visitor::operator()(const cppast::cpp_entity &file) auto usn = util::split(ctx.config().using_namespace[0], "::"); - if (!starts_with(usn, package_path)) { + if (!util::starts_with(usn, package_path)) { auto p = std::make_unique( ctx.config().using_namespace); - remove_prefix(package_path, usn); - remove_prefix(package_parent, usn); + util::remove_prefix(package_path, usn); + util::remove_prefix(package_parent, usn); p->set_name(e.name()); p->set_namespace(package_parent); @@ -306,8 +306,8 @@ void translation_unit_visitor::process_class_declaration( for (const auto &dependency : relationships) { auto destination = util::split(std::get<0>(dependency), "::"); - if (!starts_with(ctx.get_namespace(), destination) && - !starts_with(destination, ctx.get_namespace())) { + if (!util::starts_with(ctx.get_namespace(), destination) && + !util::starts_with(destination, ctx.get_namespace())) { relationship r{ relationship_t::kDependency, std::get<0>(dependency)}; current_package.value().add_relationship(std::move(r)); @@ -333,8 +333,8 @@ void translation_unit_visitor::process_function(const cppast::cpp_function &f) for (const auto &dependency : relationships) { auto destination = util::split(std::get<0>(dependency), "::"); - if (!starts_with(ctx.get_namespace(), destination) && - !starts_with(destination, ctx.get_namespace())) { + if (!util::starts_with(ctx.get_namespace(), destination) && + !util::starts_with(destination, ctx.get_namespace())) { relationship r{ relationship_t::kDependency, std::get<0>(dependency)}; current_package.value().add_relationship(std::move(r)); diff --git a/src/util/util.cc b/src/util/util.cc index b84ec33c..37dc8699 100644 --- a/src/util/util.cc +++ b/src/util/util.cc @@ -146,5 +146,6 @@ bool replace_all( return replaced; } + } } diff --git a/src/util/util.h b/src/util/util.h index d49c05e0..dd65930d 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -116,7 +116,6 @@ bool find_element_alias( */ bool replace_all( std::string &input, std::string pattern, std::string replace_with); -} /** * @brief Appends a vector to a vector. @@ -148,6 +147,13 @@ bool starts_with(const std::vector &col, const std::vector &prefix) std::vector(col.begin(), col.begin() + prefix.size()); } +/** + * @brief Removes prefix sequence of elements from the beggining of col. + * + * @tparam T + * @param col + * @param prefix + */ template void remove_prefix(std::vector &col, const std::vector &prefix) { @@ -157,18 +163,27 @@ void remove_prefix(std::vector &col, const std::vector &prefix) col = std::vector(col.begin() + prefix.size(), col.end()); } +/** + * Returns true if element exists in container. + * + * @tparam T + * @tparam E + * @param container + * @param element + * @return + */ template bool contains(const T &container, const E &element) { if constexpr (std::is_pointer_v) { return std::find_if(container.begin(), container.end(), - [&element](const auto &e) { - return *e == *element; - }) != container.end(); + [&element](const auto &e) { return *e == *element; }) != + container.end(); } else { return std::find(container.cbegin(), container.cend(), element) != container.cend(); } } -} +} // namespace util +} // namespace clanguml \ No newline at end of file