// Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "mesontools.h" namespace MesonProjectManager { namespace Internal { template inline bool is(const MesonTools::Tool_t &tool) { return bool(std::dynamic_pointer_cast(tool)); } template std::shared_ptr tool(const Utils::Id &id, const std::vector &tools) { static_assert(std::is_base_of::value, "Type must derive from ToolWrapper"); const auto tool = std::find_if(std::cbegin(tools), std::cend(tools), [&id](const MesonTools::Tool_t &tool) { return tool->id() == id; }); if (tool != std::cend(tools) && is(*tool)) return std::dynamic_pointer_cast(*tool); return nullptr; } template std::shared_ptr autoDetected(const std::vector &tools) { static_assert(std::is_base_of::value, "Type must derive from ToolWrapper"); for (const auto &tool : tools) { if (tool->autoDetected() && is(tool)) { return std::dynamic_pointer_cast(tool); } } return nullptr; } template void fixAutoDetected(std::vector &tools) { auto autoDetectedTool = autoDetected(tools); if (!autoDetectedTool) { auto path = T::find(); if (path) tools.emplace_back(std::make_shared( QString("System %1 at %2").arg(T::toolName()).arg(path->toString()), *path, true)); } } bool MesonTools::isMesonWrapper(const MesonTools::Tool_t &tool) { return is(tool); } bool MesonTools::isNinjaWrapper(const MesonTools::Tool_t &tool) { return is(tool); } void MesonTools::setTools(std::vector &&tools) { auto self = instance(); std::swap(self->m_tools, tools); fixAutoDetected(self->m_tools); fixAutoDetected(self->m_tools); } std::shared_ptr MesonTools::ninjaWrapper(const Utils::Id &id) { return tool(id, MesonTools::instance()->m_tools); } std::shared_ptr MesonTools::mesonWrapper(const Utils::Id &id) { return tool(id, MesonTools::instance()->m_tools); } std::shared_ptr MesonTools::ninjaWrapper() { return autoDetected(MesonTools::instance()->m_tools); } std::shared_ptr MesonTools::mesonWrapper() { return autoDetected(MesonTools::instance()->m_tools); } } // namespace Internal } // namespace MesonProjectManager