cmGeneratorExpressionEvaluator.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <cstddef>
  6. #include <memory>
  7. #include <string>
  8. #include <utility>
  9. #include <vector>
  10. struct cmGeneratorExpressionContext;
  11. struct cmGeneratorExpressionDAGChecker;
  12. struct cmGeneratorExpressionNode;
  13. struct cmGeneratorExpressionEvaluator
  14. {
  15. cmGeneratorExpressionEvaluator() = default;
  16. virtual ~cmGeneratorExpressionEvaluator() = default;
  17. cmGeneratorExpressionEvaluator(cmGeneratorExpressionEvaluator const&) =
  18. delete;
  19. cmGeneratorExpressionEvaluator& operator=(
  20. cmGeneratorExpressionEvaluator const&) = delete;
  21. enum Type
  22. {
  23. Text,
  24. Generator
  25. };
  26. virtual Type GetType() const = 0;
  27. virtual std::string Evaluate(cmGeneratorExpressionContext* context,
  28. cmGeneratorExpressionDAGChecker*) const = 0;
  29. };
  30. using cmGeneratorExpressionEvaluatorVector =
  31. std::vector<std::unique_ptr<cmGeneratorExpressionEvaluator>>;
  32. struct TextContent : public cmGeneratorExpressionEvaluator
  33. {
  34. TextContent(const char* start, size_t length)
  35. : Content(start)
  36. , Length(length)
  37. {
  38. }
  39. std::string Evaluate(cmGeneratorExpressionContext*,
  40. cmGeneratorExpressionDAGChecker*) const override
  41. {
  42. return std::string(this->Content, this->Length);
  43. }
  44. Type GetType() const override
  45. {
  46. return cmGeneratorExpressionEvaluator::Text;
  47. }
  48. void Extend(size_t length) { this->Length += length; }
  49. size_t GetLength() const { return this->Length; }
  50. private:
  51. const char* Content;
  52. size_t Length;
  53. };
  54. struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator
  55. {
  56. GeneratorExpressionContent(const char* startContent, size_t length);
  57. void SetIdentifier(cmGeneratorExpressionEvaluatorVector&& identifier)
  58. {
  59. this->IdentifierChildren = std::move(identifier);
  60. }
  61. void SetParameters(
  62. std::vector<cmGeneratorExpressionEvaluatorVector>&& parameters)
  63. {
  64. this->ParamChildren = std::move(parameters);
  65. }
  66. Type GetType() const override
  67. {
  68. return cmGeneratorExpressionEvaluator::Generator;
  69. }
  70. std::string Evaluate(cmGeneratorExpressionContext* context,
  71. cmGeneratorExpressionDAGChecker*) const override;
  72. std::string GetOriginalExpression() const;
  73. ~GeneratorExpressionContent() override;
  74. private:
  75. std::string EvaluateParameters(const cmGeneratorExpressionNode* node,
  76. const std::string& identifier,
  77. cmGeneratorExpressionContext* context,
  78. cmGeneratorExpressionDAGChecker* dagChecker,
  79. std::vector<std::string>& parameters) const;
  80. std::string ProcessArbitraryContent(
  81. const cmGeneratorExpressionNode* node, const std::string& identifier,
  82. cmGeneratorExpressionContext* context,
  83. cmGeneratorExpressionDAGChecker* dagChecker,
  84. std::vector<cmGeneratorExpressionEvaluatorVector>::const_iterator pit)
  85. const;
  86. cmGeneratorExpressionEvaluatorVector IdentifierChildren;
  87. std::vector<cmGeneratorExpressionEvaluatorVector> ParamChildren;
  88. const char* StartContent;
  89. size_t ContentLength;
  90. };