diff options
Diffstat (limited to 'Source/cmGeneratorExpressionEvaluator.h')
-rw-r--r-- | Source/cmGeneratorExpressionEvaluator.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/Source/cmGeneratorExpressionEvaluator.h b/Source/cmGeneratorExpressionEvaluator.h new file mode 100644 index 0000000..92dac79 --- /dev/null +++ b/Source/cmGeneratorExpressionEvaluator.h @@ -0,0 +1,113 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmGeneratorExpressionEvaluator_h +#define cmGeneratorExpressionEvaluator_h + +#include "cmConfigure.h" // IWYU pragma: keep + +#include <stddef.h> +#include <string> +#include <vector> + +struct cmGeneratorExpressionContext; +struct cmGeneratorExpressionDAGChecker; +struct cmGeneratorExpressionNode; + +struct cmGeneratorExpressionEvaluator +{ + cmGeneratorExpressionEvaluator() {} + virtual ~cmGeneratorExpressionEvaluator() {} + + enum Type + { + Text, + Generator + }; + + virtual Type GetType() const = 0; + + virtual std::string Evaluate(cmGeneratorExpressionContext* context, + cmGeneratorExpressionDAGChecker*) const = 0; + +private: + CM_DISABLE_COPY(cmGeneratorExpressionEvaluator) +}; + +struct TextContent : public cmGeneratorExpressionEvaluator +{ + TextContent(const char* start, size_t length) + : Content(start) + , Length(length) + { + } + + std::string Evaluate(cmGeneratorExpressionContext*, + cmGeneratorExpressionDAGChecker*) const override + { + return std::string(this->Content, this->Length); + } + + Type GetType() const override + { + return cmGeneratorExpressionEvaluator::Text; + } + + void Extend(size_t length) { this->Length += length; } + + size_t GetLength() { return this->Length; } + +private: + const char* Content; + size_t Length; +}; + +struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator +{ + GeneratorExpressionContent(const char* startContent, size_t length); + void SetIdentifier( + std::vector<cmGeneratorExpressionEvaluator*> const& identifier) + { + this->IdentifierChildren = identifier; + } + + void SetParameters( + std::vector<std::vector<cmGeneratorExpressionEvaluator*>> const& + parameters) + { + this->ParamChildren = parameters; + } + + Type GetType() const override + { + return cmGeneratorExpressionEvaluator::Generator; + } + + std::string Evaluate(cmGeneratorExpressionContext* context, + cmGeneratorExpressionDAGChecker*) const override; + + std::string GetOriginalExpression() const; + + ~GeneratorExpressionContent() override; + +private: + std::string EvaluateParameters(const cmGeneratorExpressionNode* node, + const std::string& identifier, + cmGeneratorExpressionContext* context, + cmGeneratorExpressionDAGChecker* dagChecker, + std::vector<std::string>& parameters) const; + + std::string ProcessArbitraryContent( + const cmGeneratorExpressionNode* node, const std::string& identifier, + cmGeneratorExpressionContext* context, + cmGeneratorExpressionDAGChecker* dagChecker, + std::vector<std::vector<cmGeneratorExpressionEvaluator*>>::const_iterator + pit) const; + +private: + std::vector<cmGeneratorExpressionEvaluator*> IdentifierChildren; + std::vector<std::vector<cmGeneratorExpressionEvaluator*>> ParamChildren; + const char* StartContent; + size_t ContentLength; +}; + +#endif |