mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-04 04:40:56 -06:00
This class will be used, as helper for: * string() command * future $<STRING> generator expression
260 lines
6.2 KiB
C++
260 lines
6.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include <cm/string_view>
|
|
|
|
#include "cmList.h"
|
|
#include "cmRange.h"
|
|
#include "cmString.hxx"
|
|
#include "cmStringAlgorithms.h"
|
|
#include "cmSystemTools.h"
|
|
#include "cmValue.h"
|
|
|
|
class cmMakefile;
|
|
|
|
//
|
|
// Class offering various string operations which is used by
|
|
// * CMake string() command
|
|
// * $<STRING> generator expression
|
|
//
|
|
|
|
namespace cm {
|
|
|
|
class CMakeString
|
|
{
|
|
public:
|
|
using size_type = cm::String::size_type;
|
|
static auto const npos = cm::String::npos;
|
|
|
|
using string_range = cmRange<std::vector<std::string>::const_iterator>;
|
|
|
|
CMakeString(std::string const& str)
|
|
: String_(cm::String::borrow(str))
|
|
{
|
|
}
|
|
CMakeString(cm::string_view str)
|
|
: String_(cm::String::borrow(str))
|
|
{
|
|
}
|
|
CMakeString(cm::String const& str)
|
|
: String_(str)
|
|
{
|
|
}
|
|
CMakeString(cm::String&& str)
|
|
: String_(std::move(str))
|
|
{
|
|
}
|
|
CMakeString(cmValue value)
|
|
: String_(cm::String::borrow(*value))
|
|
{
|
|
}
|
|
CMakeString(string_range range,
|
|
cm::string_view separator = cm::string_view{})
|
|
: String_(cmJoin(range, separator))
|
|
{
|
|
}
|
|
|
|
CMakeString() = default;
|
|
CMakeString(CMakeString const&) = default;
|
|
CMakeString(CMakeString&&) = default;
|
|
|
|
CMakeString& operator=(CMakeString const& string)
|
|
{
|
|
if (this != &string) {
|
|
this->String_ = string.String_;
|
|
}
|
|
return *this;
|
|
}
|
|
CMakeString& operator=(CMakeString&& string) noexcept
|
|
{
|
|
if (this != &string) {
|
|
this->String_ = std::move(string.String_);
|
|
}
|
|
return *this;
|
|
}
|
|
CMakeString& operator=(cm::string_view string)
|
|
{
|
|
this->String_ = string;
|
|
return *this;
|
|
}
|
|
|
|
// conversions
|
|
string_view view() const noexcept { return this->String_.view(); }
|
|
operator cm::string_view() noexcept { return this->String_.view(); }
|
|
operator std::string const&() { return this->String_.str(); }
|
|
|
|
size_type Size() const { return this->String_.size(); }
|
|
size_type Length() const { return this->String_.size(); }
|
|
|
|
enum class CompOperator
|
|
{
|
|
EQUAL,
|
|
LESS,
|
|
LESS_EQUAL,
|
|
GREATER,
|
|
GREATER_EQUAL
|
|
};
|
|
bool Compare(CompOperator op, cm::string_view other);
|
|
|
|
enum class FindFrom
|
|
{
|
|
Begin,
|
|
End
|
|
};
|
|
size_type Find(cm::string_view substring,
|
|
FindFrom from = FindFrom::Begin) const
|
|
{
|
|
return from == FindFrom::Begin ? this->String_.find(substring)
|
|
: this->String_.rfind(substring);
|
|
}
|
|
|
|
enum class Regex
|
|
{
|
|
No,
|
|
Yes
|
|
};
|
|
// Throw std::invalid_argument if regular expression is invalid
|
|
// std::runtime_error if replacement failed
|
|
CMakeString& Replace(std::string const& matchExpression,
|
|
std::string const& replaceExpression,
|
|
Regex regex = Regex::No,
|
|
cmMakefile* makefile = nullptr);
|
|
|
|
enum class MatchItems
|
|
{
|
|
Once,
|
|
All
|
|
};
|
|
// Throw std::invalid_argument if regular expression is invalid
|
|
cmList Match(std::string const& matchExpression,
|
|
MatchItems matchItems = MatchItems::Once,
|
|
cmMakefile* makefile = nullptr) const;
|
|
|
|
CMakeString& Append(cm::string_view str)
|
|
{
|
|
this->String_.append(str);
|
|
return *this;
|
|
}
|
|
CMakeString& Append(string_range range)
|
|
{
|
|
this->Append(cmJoin(range, {}));
|
|
return *this;
|
|
}
|
|
CMakeString& Prepend(cm::string_view str)
|
|
{
|
|
this->String_.insert(0, str);
|
|
return *this;
|
|
}
|
|
CMakeString& Prepend(string_range range)
|
|
{
|
|
this->Prepend(cmJoin(range, {}));
|
|
return *this;
|
|
}
|
|
|
|
CMakeString& ToLower()
|
|
{
|
|
this->String_ = cmSystemTools::LowerCase(this->String_);
|
|
return *this;
|
|
}
|
|
CMakeString& ToLower(cm::string_view str)
|
|
{
|
|
this->String_ = cmSystemTools::LowerCase(str);
|
|
return *this;
|
|
}
|
|
CMakeString& ToUpper()
|
|
{
|
|
this->String_ = cmSystemTools::UpperCase(this->String_);
|
|
return *this;
|
|
}
|
|
CMakeString& ToUpper(cm::string_view str)
|
|
{
|
|
this->String_ = cmSystemTools::UpperCase(str);
|
|
return *this;
|
|
}
|
|
|
|
// Throw std::out_of_range if pos or count are outside of the expected range
|
|
CMakeString Substring(long pos = 0, long count = -1) const;
|
|
|
|
enum class StripItems
|
|
{
|
|
Space,
|
|
Genex
|
|
};
|
|
CMakeString& Strip(StripItems stripItems = StripItems::Space);
|
|
|
|
// Throw std::runtime_error if quoting string failed
|
|
enum class QuoteItems
|
|
{
|
|
Regex
|
|
};
|
|
CMakeString& Quote(QuoteItems quoteItems = QuoteItems::Regex);
|
|
|
|
CMakeString& Repeat(size_type count);
|
|
|
|
// Throw std::invalid_argument if the hash algorithm is invalid
|
|
CMakeString& Hash(cm::string_view hashAlgorithm);
|
|
|
|
// Throw std::invalid_argument if one of the codes is invalid
|
|
CMakeString& FromASCII(string_range codes);
|
|
CMakeString& ToHexadecimal() { return this->ToHexadecimal(this->String_); }
|
|
CMakeString& ToHexadecimal(cm::string_view str);
|
|
|
|
CMakeString& MakeCIdentifier()
|
|
{
|
|
this->String_ = cmSystemTools::MakeCidentifier(this->String_.str());
|
|
return *this;
|
|
}
|
|
CMakeString& MakeCIdentifier(std::string const& str)
|
|
{
|
|
this->String_ = cmSystemTools::MakeCidentifier(str);
|
|
return *this;
|
|
}
|
|
|
|
static cm::string_view const RandomDefaultAlphabet;
|
|
// Throw std::invalid_argument if the alphabet is invalid
|
|
// std::out_of_range if length is outside valid range
|
|
CMakeString& Random(std::size_t length = 5,
|
|
cm::string_view alphabet = RandomDefaultAlphabet)
|
|
{
|
|
return this->Random(cmSystemTools::RandomSeed(), length, alphabet);
|
|
}
|
|
CMakeString& Random(unsigned int seed, std::size_t length = 5,
|
|
cm::string_view alphabet = RandomDefaultAlphabet);
|
|
|
|
enum class UTC
|
|
{
|
|
No,
|
|
Yes
|
|
};
|
|
CMakeString& Timestamp(cm::string_view format, UTC utc = UTC::No);
|
|
|
|
enum class UUIDType
|
|
{
|
|
MD5,
|
|
SHA1
|
|
};
|
|
enum class Case
|
|
{
|
|
Lower,
|
|
Upper
|
|
};
|
|
// Throw std::invalid_argument if namespace or the type are invalid
|
|
// std::runtime_error if the UUID cannot be generated
|
|
CMakeString& UUID(cm::string_view nameSpace, cm::string_view name,
|
|
UUIDType type, Case uuidCase = Case::Lower);
|
|
|
|
private:
|
|
static bool Seeded;
|
|
cm::String String_;
|
|
};
|
|
}
|