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