Files
qt-creator/src/libs/clangsupport/filepath.h
Marco Bubke dd366b68de PchManager: Split pch tasks in project and system pch tasks
Like you can see in the task numbers this patch is touching many different
areas. So I will only touch the main parts. It is using a clang action
instead of an extra process which will be enabling the handling of
generated files in PCHs. The flags from the project part are now not
anymore transformed in a command line but they are saved in the container
semantically aware so that they can later be merged. Most of this patch is
simply polishing of other patches.

Task-number: QTCREATORBUG-21346
Task-number: QTCREATORBUG-21380
Task-number: QTCREATORBUG-21382
Task-number: QTCREATORBUG-21383
Task-number: QTCREATORBUG-21693
Task-number: QTCREATORBUG-21778
Change-Id: I9b0c02d8149b554254e819448fbc61eeaa5b7494
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
2019-01-21 15:27:10 +00:00

195 lines
5.3 KiB
C++

/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** 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.
**
****************************************************************************/
#pragma once
#include "clangsupport_global.h"
#include "filepathview.h"
#include "filepathview.h"
#include <utils/hostosinfo.h>
#include <utils/smallstringio.h>
#include <QDataStream>
namespace ClangBackEnd {
class FilePath : public Utils::PathString
{
using size_type = Utils::PathString::size_type;
public:
FilePath() = default;
explicit FilePath(Utils::PathString &&filePath)
: Utils::PathString(std::move(filePath))
{
FilePathView view{*this};
m_slashIndex = view.slashIndex();
}
explicit FilePath(Utils::SmallStringView &&filePath)
: Utils::PathString(filePath)
{
FilePathView view{*this};
m_slashIndex = view.slashIndex();
}
FilePath(FilePathView filePathView)
: Utils::PathString(filePathView.toStringView()),
m_slashIndex(filePathView.slashIndex())
{
}
template<size_type Size>
FilePath(const char(&string)[Size]) noexcept
: FilePath(FilePathView(string, Size - 1))
{
static_assert(Size >= 1, "Invalid string literal! Length is zero!");
}
explicit FilePath(const Utils::PathString &filePath)
: FilePath(filePath.clone())
{
}
explicit FilePath(Utils::PathString &&filePath, std::ptrdiff_t slashIndex)
: Utils::PathString(std::move(filePath)),
m_slashIndex(slashIndex)
{
}
explicit FilePath(const QString &filePath)
: FilePath(Utils::PathString(filePath))
{
}
FilePath(Utils::SmallStringView directory, Utils::SmallStringView name)
: Utils::PathString({directory, "/", name}),
m_slashIndex(std::ptrdiff_t(directory.size()))
{}
Utils::SmallStringView directory() const noexcept
{
return mid(0, std::size_t(std::max(std::ptrdiff_t(0), m_slashIndex)));
}
Utils::SmallStringView name() const noexcept
{
return mid(std::size_t(m_slashIndex + 1),
std::size_t(std::ptrdiff_t(size()) - m_slashIndex - std::ptrdiff_t(1)));
}
const Utils::PathString &path() const noexcept
{
return *this;
}
operator FilePathView() const noexcept
{
return FilePathView(toStringView());
}
operator Utils::SmallStringView() const noexcept
{
return toStringView();
}
friend QDataStream &operator<<(QDataStream &out, const FilePath &filePath)
{
out << static_cast<const Utils::PathString&>(filePath);
out << uint(filePath.m_slashIndex);
return out;
}
friend QDataStream &operator>>(QDataStream &in, FilePath &filePath)
{
uint slashIndex;
in >> static_cast<Utils::PathString&>(filePath);
in >> slashIndex;
filePath.m_slashIndex = slashIndex;
return in;
}
friend bool operator==(const FilePath &first, const FilePath &second)
{
return first.slashIndex() == second.slashIndex()
&& first.name() == second.name()
&& first.directory() == second.directory();
}
friend bool operator==(const FilePath &first, const FilePathView &second)
{
return first.toStringView() == second.toStringView();
}
friend bool operator==(const FilePathView &first, const FilePath &second)
{
return second == first;
}
friend bool operator<(const FilePath &first, const FilePath &second)
{
return std::make_tuple(first.slashIndex(), first.name(), first.directory())
< std::make_tuple(second.slashIndex(), second.name(), second.directory());
}
FilePath clone() const
{
return *this;
}
std::ptrdiff_t slashIndex() const
{
return m_slashIndex;
}
template<typename String>
static FilePath fromNativeFilePath(const String &filePath)
{
Utils::PathString nativePath{filePath.data(), filePath.size()};
if (Utils::HostOsInfo::isWindowsHost())
nativePath.replace('\\', '/');
return FilePath(std::move(nativePath));
}
private:
std::ptrdiff_t m_slashIndex = -1;
};
using FilePaths = std::vector<FilePath>;
CLANGSUPPORT_EXPORT QDebug operator<<(QDebug debug, const FilePath &filePath);
} // namespace ClangBackEnd