cmGeneratorExpressionEvaluator.h 3.1 KB

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