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. #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. 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. struct TextContent : public cmGeneratorExpressionEvaluator
  31. {
  32. TextContent(const char* start, size_t length)
  33. : Content(start)
  34. , Length(length)
  35. {
  36. }
  37. std::string Evaluate(cmGeneratorExpressionContext*,
  38. cmGeneratorExpressionDAGChecker*) const override
  39. {
  40. return std::string(this->Content, this->Length);
  41. }
  42. Type GetType() const override
  43. {
  44. return cmGeneratorExpressionEvaluator::Text;
  45. }
  46. void Extend(size_t length) { this->Length += length; }
  47. size_t GetLength() { return this->Length; }
  48. private:
  49. const char* Content;
  50. size_t Length;
  51. };
  52. struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator
  53. {
  54. GeneratorExpressionContent(const char* startContent, size_t length);
  55. void SetIdentifier(std::vector<cmGeneratorExpressionEvaluator*> identifier)
  56. {
  57. this->IdentifierChildren = std::move(identifier);
  58. }
  59. void SetParameters(
  60. std::vector<std::vector<cmGeneratorExpressionEvaluator*>> parameters)
  61. {
  62. this->ParamChildren = std::move(parameters);
  63. }
  64. Type GetType() const override
  65. {
  66. return cmGeneratorExpressionEvaluator::Generator;
  67. }
  68. std::string Evaluate(cmGeneratorExpressionContext* context,
  69. cmGeneratorExpressionDAGChecker*) const override;
  70. std::string GetOriginalExpression() const;
  71. ~GeneratorExpressionContent() override;
  72. private:
  73. std::string EvaluateParameters(const cmGeneratorExpressionNode* node,
  74. const std::string& identifier,
  75. cmGeneratorExpressionContext* context,
  76. cmGeneratorExpressionDAGChecker* dagChecker,
  77. std::vector<std::string>& parameters) const;
  78. std::string ProcessArbitraryContent(
  79. const cmGeneratorExpressionNode* node, const std::string& identifier,
  80. cmGeneratorExpressionContext* context,
  81. cmGeneratorExpressionDAGChecker* dagChecker,
  82. std::vector<std::vector<cmGeneratorExpressionEvaluator*>>::const_iterator
  83. pit) const;
  84. private:
  85. std::vector<cmGeneratorExpressionEvaluator*> IdentifierChildren;
  86. std::vector<std::vector<cmGeneratorExpressionEvaluator*>> ParamChildren;
  87. const char* StartContent;
  88. size_t ContentLength;
  89. };
  90. #endif