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