| /* 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_; | |
| }; | |
| } |