/**************************************************************************** ** ** Copyright (C) 2020 Alexis Jeandet. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #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