cmGeneratorExpressionEvaluator.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst 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. namespace cm {
  11. namespace GenEx {
  12. struct Evaluation;
  13. }
  14. }
  15. struct cmGeneratorExpressionDAGChecker;
  16. struct cmGeneratorExpressionNode;
  17. struct cmGeneratorExpressionEvaluator
  18. {
  19. cmGeneratorExpressionEvaluator() = default;
  20. virtual ~cmGeneratorExpressionEvaluator() = default;
  21. cmGeneratorExpressionEvaluator(cmGeneratorExpressionEvaluator const&) =
  22. delete;
  23. cmGeneratorExpressionEvaluator& operator=(
  24. cmGeneratorExpressionEvaluator const&) = delete;
  25. enum Type
  26. {
  27. Text,
  28. Generator
  29. };
  30. virtual Type GetType() const = 0;
  31. virtual std::string Evaluate(cm::GenEx::Evaluation* eval,
  32. cmGeneratorExpressionDAGChecker*) const = 0;
  33. };
  34. using cmGeneratorExpressionEvaluatorVector =
  35. std::vector<std::unique_ptr<cmGeneratorExpressionEvaluator>>;
  36. struct TextContent : public cmGeneratorExpressionEvaluator
  37. {
  38. TextContent(char const* start, size_t length)
  39. : Content(start)
  40. , Length(length)
  41. {
  42. }
  43. std::string Evaluate(cm::GenEx::Evaluation*,
  44. cmGeneratorExpressionDAGChecker*) const override
  45. {
  46. return std::string(this->Content, this->Length);
  47. }
  48. Type GetType() const override
  49. {
  50. return cmGeneratorExpressionEvaluator::Text;
  51. }
  52. void Extend(size_t length) { this->Length += length; }
  53. size_t GetLength() const { return this->Length; }
  54. private:
  55. char const* Content;
  56. size_t Length;
  57. };
  58. struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator
  59. {
  60. GeneratorExpressionContent(char const* startContent, size_t length);
  61. void SetIdentifier(cmGeneratorExpressionEvaluatorVector&& identifier)
  62. {
  63. this->IdentifierChildren = std::move(identifier);
  64. }
  65. void SetParameters(
  66. std::vector<cmGeneratorExpressionEvaluatorVector>&& parameters)
  67. {
  68. this->ParamChildren = std::move(parameters);
  69. }
  70. Type GetType() const override
  71. {
  72. return cmGeneratorExpressionEvaluator::Generator;
  73. }
  74. std::string Evaluate(cm::GenEx::Evaluation* eval,
  75. cmGeneratorExpressionDAGChecker*) const override;
  76. std::string GetOriginalExpression() const;
  77. ~GeneratorExpressionContent() override;
  78. private:
  79. std::string EvaluateParameters(cmGeneratorExpressionNode const* node,
  80. std::string const& identifier,
  81. cm::GenEx::Evaluation* eval,
  82. cmGeneratorExpressionDAGChecker* dagChecker,
  83. std::vector<std::string>& parameters) const;
  84. std::string ProcessArbitraryContent(
  85. cmGeneratorExpressionNode const* node, std::string const& identifier,
  86. cm::GenEx::Evaluation* eval, cmGeneratorExpressionDAGChecker* dagChecker,
  87. std::vector<cmGeneratorExpressionEvaluatorVector>::const_iterator pit)
  88. const;
  89. cmGeneratorExpressionEvaluatorVector IdentifierChildren;
  90. std::vector<cmGeneratorExpressionEvaluatorVector> ParamChildren;
  91. char const* StartContent;
  92. size_t ContentLength;
  93. };