Revision control

Copy as Markdown

// Copyright (C) 2022 The Qt Company Ltd.
// Copyright (C) 2019 Alexey Edelev <semlanik@gmail.com>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#ifndef QTPROTOBUFGEN_UTILS_H
#define QTPROTOBUFGEN_UTILS_H
#include <string>
#include <string_view>
#include <vector>
#include <algorithm>
#include <set>
#ifdef QT_PROTOBUF_DEBUG_GENERATOR
# include <iostream>
# define QT_PROTOBUF_DEBUG(X) std::clog << X << std::endl
#else
# define QT_PROTOBUF_DEBUG(X)
#endif
namespace google::protobuf {
class FileDescriptor;
}
namespace qtprotoccommon {
namespace utils {
std::vector<std::string> split(std::string_view s, std::string_view c, bool keepEmpty = false);
std::string replace(std::string_view where, std::string_view from, std::string_view to);
std::string escapeCString(std::string_view s);
std::string escapeBlockComment(std::string_view s);
void asciiToLower(std::string &str);
void asciiToUpper(std::string &str);
std::string removeFileSuffix(std::string_view fileName);
std::string extractFileBasename(std::string_view fileName);
std::string toValidIdentifier(std::string_view name);
std::string capitalizeAsciiName(std::string_view name);
std::string deCapitalizeAsciiName(std::string_view name);
std::string &rtrim(std::string &s);
// trim from beginning of string (left)
std::string &ltrim(std::string &s);
// trim from both ends of string (right then left)
std::string &trim(std::string &s);
bool contains(std::string_view s, char c);
bool contains(std::string_view s, std::string_view c);
template<typename Container>
bool contains(const Container &c, typename Container::value_type v)
{ return std::find(std::begin(c), std::end(c), v) != std::end(c); }
bool startsWith(std::string_view s, char c);
bool startsWith(std::string_view s, std::string_view c);
bool endsWith(std::string_view s, char c);
bool endsWith(std::string_view s, std::string_view c);
template<typename T>
std::string join(const T &container, std::string_view separator, std::string_view prefix = "",
std::string_view suffix = "")
{
std::string output = std::string(prefix);
bool first = true;
for (const std::string &value : container) {
if (!first)
output += separator;
first = false;
output += value;
}
output += suffix;
return output;
}
size_t count(std::string_view s, char c);
// ASCII check functions
constexpr bool isAsciiUpper(char32_t c) noexcept
{
return c >= 'A' && c <= 'Z';
}
constexpr bool isAsciiLower(char32_t c) noexcept
{
return c >= 'a' && c <= 'z';
}
constexpr char toAsciiLower(char ch) noexcept
{
return isAsciiUpper(ch) ? ch - 'A' + 'a' : ch;
}
constexpr char toAsciiUpper(char ch) noexcept
{
return isAsciiLower(ch) ? ch - 'a' + 'A' : ch;
}
struct HeaderComparator
{
bool operator ()(const std::string &lhs, const std::string &rhs) const;
};
using ExternalIncludesOrderedSet = std::set<std::string, HeaderComparator>;
} // namespace utils
} // namespace qtprotoccommon
#endif // QTPROTOBUFGEN_UTILS_H