| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | /*============================================================================  CMake - Cross Platform Makefile Generator  Copyright 2012 Stephen Kelly <[email protected]>  Distributed under the OSI-approved BSD License (the "License");  see accompanying file Copyright.txt for details.  This software is distributed WITHOUT ANY WARRANTY; without even the  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the License for more information.============================================================================*/#ifndef cmGeneratorExpressionEvaluator_h#define cmGeneratorExpressionEvaluator_h#include <vector>#include <string>#include "cmListFileCache.h"class cmTarget;//----------------------------------------------------------------------------struct cmGeneratorExpressionContext{  cmListFileBacktrace Backtrace;  std::set<cmTarget*> DependTargets;  std::set<cmTarget*> AllTargets;  std::set<cmStdString> SeenTargetProperties;  cmMakefile *Makefile;  const char *Config;  cmTarget *HeadTarget; // The target whose property is being evaluated.  cmTarget *CurrentTarget; // The dependent of HeadTarget which appears                           // directly or indirectly in the property.  bool Quiet;  bool HadError;  bool HadContextSensitiveCondition;};struct cmGeneratorExpressionDAGChecker;struct cmGeneratorExpressionNode;//----------------------------------------------------------------------------struct cmGeneratorExpressionEvaluator{  cmGeneratorExpressionEvaluator() {}  virtual ~cmGeneratorExpressionEvaluator() {}  enum Type  {    Text,    Generator  };  virtual Type GetType() const = 0;  virtual std::string Evaluate(cmGeneratorExpressionContext *context,                              cmGeneratorExpressionDAGChecker *) const = 0;private:  cmGeneratorExpressionEvaluator(const cmGeneratorExpressionEvaluator &);  void operator=(const cmGeneratorExpressionEvaluator &);};struct TextContent : public cmGeneratorExpressionEvaluator{  TextContent(const char *start, unsigned int length)    : Content(start), Length(length)  {  }  std::string Evaluate(cmGeneratorExpressionContext *,                       cmGeneratorExpressionDAGChecker *) const  {    return std::string(this->Content, this->Length);  }  Type GetType() const  {    return cmGeneratorExpressionEvaluator::Text;  }  void Extend(unsigned int length)  {    this->Length += length;  }  unsigned int GetLength()  {    return this->Length;  }private:  const char *Content;  unsigned int Length;};//----------------------------------------------------------------------------struct GeneratorExpressionContent : public cmGeneratorExpressionEvaluator{  GeneratorExpressionContent(const char *startContent, unsigned int length);  void SetIdentifier(std::vector<cmGeneratorExpressionEvaluator*> identifier)  {    this->IdentifierChildren = identifier;  }  void SetParameters(        std::vector<std::vector<cmGeneratorExpressionEvaluator*> > parameters)  {    this->ParamChildren = parameters;  }  Type GetType() const  {    return cmGeneratorExpressionEvaluator::Generator;  }  std::string Evaluate(cmGeneratorExpressionContext *context,                       cmGeneratorExpressionDAGChecker *) const;  std::string GetOriginalExpression() const;  ~GeneratorExpressionContent();private:  std::string EvaluateParameters(const cmGeneratorExpressionNode *node,                                 const std::string &identifier,                                 cmGeneratorExpressionContext *context,                                 cmGeneratorExpressionDAGChecker *dagChecker,                                 std::vector<std::string> ¶meters) const;  std::string ProcessArbitraryContent(    const cmGeneratorExpressionNode *node,    const std::string &identifier,    cmGeneratorExpressionContext *context,    cmGeneratorExpressionDAGChecker *dagChecker,    std::vector<std::vector<cmGeneratorExpressionEvaluator*> >::const_iterator    pit) const;private:  std::vector<cmGeneratorExpressionEvaluator*> IdentifierChildren;  std::vector<std::vector<cmGeneratorExpressionEvaluator*> > ParamChildren;  const char *StartContent;  unsigned int ContentLength;};#endif
 |